코틀린의 클래스 선언은 기본적으로 public final이다.
중첩 클래스는 외부 클래스의 참조를 갖지 않는다.
인터페이스는 여러 개 구현이 가능하고, 클래스는 하나만 상속 가능하다.
상위 클래스의 함수와 시그니처가 같은 함수를 정의하려면 반드시 override 키워드를 사용해야 한다. 실수를 방지하기 위함
별다른 키워드 없이 인터페이스에 디폴트 구현 함수를 정의할 수 있다.
시그니처가 같은 메서드를 갖는 인터페이스들을 구현할 경우, 그 메서드를 오버라이딩 하지 않으면 컴파일 에러가 발생한다.
super<인터페이스명>.메서드명()으로 특정 인터페이스의 메서드를 호출할 수 있다.
클래스는 기본적으로 final이다. 슈퍼 클래스의 개발자의 의도와 다르게 상속하는 것을 막기 위함이다.
open으로 상속을 허용할 수 있다. 프로퍼티와 메서드에도 개별적으로 붙여야 한다.
오버라이드 한 함수는 open 되어 있다. 상속 불가능하게 만들고 싶으면 override 앞에 final을 붙인다.
abstract 클래스는 인스턴스화 할 수 없다. 필드 앞에 abstract 키워드가 있으면 반드시 오버라이딩 해야 한다.
abstract 클래스 안에서 abstract, open, 일반 함수를 조합하여 상속을 설계할 수 있다. 추상 클래스일지라도 일반 함수는 여전히 하위 클래스가 오버라이딩 할 수 없다.
internal: 모듈 내부에서만 볼 수 있다. 안드로이드 스튜디오에서 모듈 단위의 그레이들을 볼 수 있는데, 그 모듈을 의미한다.
한 번에 컴파일 되는 단위를 모듈이라고 한다.
p.151에 가시성 변경자 요약이 있다.
클래스(타입) 가시성의 경우 현재 가시성보다 좁은 가시성의 클래스는 참조할 수 없다.
ex)
가시성 변경자는 클래스에 대한 외부 접근을 제한한다.
가시성 지정이 안돼있으면 기본은 public이다.
최상위 private 멤버(클래스, 함수, 프로퍼티)는 같은 파일 안에서만 접근 가능하다.
protected: 그 클래스와 하위 클래스에서만 접근 가능하다.
자바에서는 같은 패키지라면 모두 접근이 가능했다.
클래스 확장 함수는 private, protected 멤버에 접근할 수 없다. 3장에서 나왔듯, 별도의 static 함수로 선언되기 때문이다.
internal은 바이트코드 상에서 public으로 컴파일된다. 왜냐면 자바에는 이러한 가시성이 없기 때문이다.
protected는 자바의 protected처럼 컴파일된다. 그래서 같은 패키지를 선언했다면 protected 멤버에 접근할 수 있따.
중첩(nested) 클래스는 그 클래스를 숨기거나 가까이 두고 싶을 때 유용하게 쓸 수 있다.
기본적으로 외부 클래스에 대한 참조를 갖지 않는다. 자바와는 정반대이다. (자바의 static 중첩 클래스에 해당함)
--> 장점) 직렬화할 때 직렬화 불가능한 외부 참조로 인한 에러가 발생하지 않는다, 메모리 누수 가능성X
반면, 내부(inner) 클래스는 외부 클래스(인스턴스)의 참조를 갖는다. this@outer로 접근할 수 있다.
---> 즉, 외부 인스턴스가 있어야만 내부 인스턴스를 생성할 수 있다. 중첩 클래스는 독립적으로 인스턴스화가 가능하다.
상속 제어 변경자: 상속 가능 여부를 나타낸다
가시성 변경자: 해당 필드가 외부에서 보이는지(접근 가능) 여부를 나타낸다.
우선, '구현에 대한 접근'을 클래스에 대한 접근을 제한한다고 해석해하는 게 좋겠다.
자세한 것은 더 읽어봐야 알 것 같다.
그렇다. 패키지(파일) 클래스의 static 메서드로 선언되며, 첫 번째 인자로 확장한 클래스의 인스턴스를 입력 받는다.
클래스 계층을 만들되 그 계층에 속한 클래스의 수를 제한하고 싶은 경우 중첩 클래스를 쓰면 편리하다
==> 무슨 뜻? 더 읽으면 알게 될 것 같다
평소에 자바나 코틀린의 변경자를 정리해두지 않은 탓에 관련 코드를 읽는데 항상 애를 먹었었다. 그런데도 양이 많아보여 미루기만 했었던 지난 날을 반성한다..ㅠㅠ 이번 기회에 정리하니 후련하다.
바이트 코드로 컴파일 되기 때문에 자바와의 상호운용성을 고려하여 자바에 존재하지 않는 변경자는 코틀린 방식과는 다르게 컴파일 된다는 점이 신기했다.
반면, 그 덕분에 이해하는 데에 애를 먹기도 했다. 예를 들어, internal은 public으로 컴파일 된다든가, private class는 같은 패키지에서만 접근할 수 있는 자바의 default class로 컴파일된다든가 하는 사실 말이다.
책에서 항상 자바와 비교하며 설명하는 덕에 자바에 대한 공부도 함께 하게 된다. 공부할 내용이 2배가 되긴 하지만 어차피 알아야 할 내용이니까!
내용이 조금씩 어려워지기 시작했다.