-
[Scala]4-클래스와 객체scala 2020. 3. 10. 16:27
P106>
스칼라에서 멤버를 공개(public)하려면 어떤 접근 수식자도 지정하지 않아야 한다. 다시 말해, 자바에서 'public'을 사용해야 하는 경우 스칼라에서는 아무것도 하지 않아야 한다. 스칼라의 기본 수준은 전체 공개다.
파라메터가 val인 이유는 val이 더 분석하기 쉽기 때문이다. 분석을 위해 val을 나중에 재할당해서 값이 바뀌는지 살펴볼 필요가 없다. 반면 var의 경우에는 이를 추적해야만 한다.
P110>
세미콜론 추론 규칙
정확한 문장 분리 규칙은 그 규칙이 대부분의 경우 잘 작동하는 것에 비하면 놀랄 만큼 간단하다. 간단히 말해, 줄의 끝은 다움 세 가지 경우가 아니면 세미콜론과 똑같이 취급한다.
1. 어떤 줄이 어떤 명령을 끝낼 수 있는 단어로 끝나지 않는다. 즉 마침표(.)나 중위 연산자 등이 줄의 맨 끝에 있다.
2. 다음 줄의 맨 앞이 문장을 시작할 수 없는 단어로 시작한다.
3. 줄이 (...) 같은 괄호 사이나 [...] 같은 각괄호 사이에서 끝난다. 어차피 이런 경우 내부 문장이 들어갈 수 없다.
싱글톤 객체
스칼라 클래스에는 정적멤버가 없다는 것이다. 대신에 스칼라는 싱글톤 객체를 제공한다. 싱글톤 객체 정의는 클래스 정의와 같아 보이지만, class 대신 object라는 키워드로 시작한다.
어떤 싱글톤 객체의 이름이 어떤 클래스와 같을 때, 그 객체를 클래스의 동반 객체라고 한다. 다만, 클래스와 동반 객체는 반드시 같은 소스 파일 안에 정의해야 한다. 이때 역으로 해당 클래스를 싱글톤 객체의 동반 클래스라 부른다. 클래스와 동반 객체는 상대방의 비공개 멤버에 접근할 수 있다.
//ChecksumAccumulator.scala에 저장 import scala.collection.mutable.Map object ChecksumAccumulator { private val cache = Map[String, Int]() def calculate)s: String): Int = if (cache.contains(s)) cache(s) else { val acc = new ChecksumAccumulator for (c <- s) acc.add(c.toByte) val cs = acc.checksum() cache += (s -> cs) cs } }
글래스와 싱글톤 객체의 한 가지 차이는 싱글톤 객체는 파라미터를 받을 수 없고 클래스는 받을 수 있다는 점이다. 싱글톤을 new로 인스턴스화할 수 없기 때문에 파라미터를 싱글톤에 넘길 방법이 없다. 컴파일러는 각 싱글톤 객체를 합성한 클래스의 인스턴스로 구현하고, 이를 정적 변수가 참조한다. 따라서 이들의 초기화는 자바의 정적 요소를 초기화하는 것과 의미가 동일하다. 특히 싱글톤 객체의 초기화는 어떤 코드가 그 객체에 처음 접근할 때 일어난다.