-
[스칼라] 클래스와 객체스칼라 2022. 1. 30. 00:49
Programming in scala 4th edition의 4장을 정리한 글입니다.
1. 클래스
스칼라에서 클래스는 아래와 같이 정의한다.
class Computer { val name = "MacBook" private val privateName = "MacBook Pro" def printPrivateName() = println(privateName) }
클래스에는 필드(인스턴수 변수)와 메서드를 정의 할 수 있고 이 필드와 메서드를 멤버라고 부른다. 필드는 기본적으로 public 설정이고 private 키워드를 사용해서 외부에서 접근하지 못하도록 할 수 있다.
var mac = new Computer println(mac.name) // println(mac.privateName) // 실행불가 mac.printPrivateName() // 출력결과 var mac: Computer = Computer@433ba428 MacBook //컴파일에러로 실행되지않음 MacBook Pro
자바와는 다르게 스칼라에서는 클래스의 이름과 파일 이름이 달라도 상관은 없다. 당연히 별다른 이유가 없으면 같게 하는것이 좋다.
2. 메서드
스칼라에서 메서드는 아래와같이 정의할 수 있다.
def add(first: Int, second: Int): Int = { first + second } add(1, 2)
메서드의 파라미터는 val로 취급되고 반드시 타입을 명시해주어야한다. 스칼라는 return을 명시하지 않아도 가장 마지막에 수행되는 결과를 return한다. 리턴 타입은 스칼라 컴파일러가 추론하기 때문에 보통은 적어주지 않아도 된다. (재귀함수를 사용할 때는 적어주어야한다.)
Computer 클래스의 privatePrivateName 처럼 Unit을 리턴하는 함수는 부수효과를 위해 수행되는데 이런 메서드를 프로시저 라고 한다.
부수효과: 메서드 밖의 상태를 바꾸거나 IO를 수행하는 등의 작업
3. 싱글톤 객체
스칼라는 자바와 달리 static 멤버가 없는데 그 대신에 싱글톤 객체를 직접 제공한다.
object Singleton { val name = "Singleton" } println(Singleton.name) // 결과: Singleton
싱글톤 객체에 정의한 메서드나 필드는 싱글톤객체의 이름으로부터 바로 호출해서 사용할 수 있다.
어떤 클래스와 이름이 같은 싱글톤 객체를 정의했을때 이 싱글톤 객체는 클래스의 companion object (동반 객체) 라고 하고, 반대로 클래스는 싱글톤 객체의 companion class (동반 클래스) 라고 한다. 클래스와 companion 객체는 서로 private 멤버에 접근할 수 있다. 위의 Singleton이라는 이름의 object처럼 Companion class 가 없는 object는 Standalone object (독립 객체) 라고 한다.
// Class 선언 class Computer { val name = "MacBook" private val privateName = "MacBook Pro" def printPrivateName() = println(privateName) def call() = Computer.callNumber += 1 } //Singleton object, Computer class의 Companion object object Computer { private var callNumber = 0 def printCallNumber() = println(callNumber) } //create object val macA = new Computer val macB = new Computer macA.call() macB.call() Computer.printCallNumber() // 2가 출력됨
'스칼라' 카테고리의 다른 글
[스칼라] 함수와 클로저 (0) 2022.01.31 [스칼라] 내장 제어 구문 (0) 2022.01.31 [스칼라] 함수형 객체 (0) 2022.01.30 [스칼라] 기본 타입과 연산 (0) 2022.01.30 [스칼라 입문] PRELUDE꞉ A TASTE OF SCALA 번역 (0) 2022.01.09