반응형
4장. 클래스, 객체, 인터페이스
😤 클래스 계층 정의
- kotlin의 가시성/접근 변경자는 자바와 비슷하지만 아무것도 지정하지 않은 경우 기본 가시성은 다르다
- sealed
- 코틀린에 새로 도입됨
- 클래스 상속을 제한
🤪 kotlin 인터페이스
- 코틀린 인터페이스 안에는 추상 메소드 뿐 아니라 구현이 있는 메소드도 정의할 수 있다
- interface에는 아무런 field도 들어갈 수 없다
interface Clickable {
fun click()
fun showOff() = println(“I’m clickable!")
}
interface Focusable {
fun showOff() = println(“I’m focusable!”)
}
- 이 인터페이스를 구현하는 모든 비추상 클래스는 click에 대한 구현을 제공해야 한다
class Button : Clickable
- 이렇게 하면 클래스 확장과 인터페이스 구현 완료
- 자바의 경우 extends, implements 키워드 사용
- 클래스는 인터페이스를 원하는 만큼 개수 제한없이 마음대로 구현 가능하다
- 클래스는 오직 하나만 확장할 수 있다
- @override
- 자바의 경우 어노테이션
- 코틀린에서는 override 변경자 사용
- 인터페이스 메소드
- 디폴트 구현을 제공할 수 있다
class Button : Clickable, Focusable
- 쉼표로 여러개의 interface 상속 가능
- 두 상위 인터페이스가 같은 이름의 showOff 메소드를 가지고 있는 경우 오버라이딩 메소드를 제공하지 않으면 컴파일러 에러
override fun showOff(){. }
- super을 지정하면 어떤 interface의 메소드를 호출할지 지정할 수 있다
🧐 kotlin의 가시성 - open, final, abstract
- 자바 : final로 명시적으로 상속을 금지하지 않는 모든 클래스를 다른 클래스가 상속할 수 있다
- 취약한 기반 클래스
- 기반 클래스가 변경되어 하위 클래스가 가진 가정이 깨진경우 생기는 문제
- 상속을 위한 설계와 문서를 갖추거나 그럴 수 없다면 상속을 금지하라
- 코틀린 : open을 명시해주지 않으면 모두 기본적으로 final
- 상속을 허용하고 싶은 class 앞에 open
- 오버라이드를 허용하고 싶은 메소드앞에 open
- override 메소드 / 프로퍼티
- 기본적으로 열려있다
- 상속을 금지시키려면 final 해야 한다
- abstract는 기본적으로 열려있다
😣 kotlin의 가시성 변경자
- 아무 변경자도 없는 경우 선언은 모두 public
- protected
- java
- 같은 패키지 안에서 protected 에 접근 가능
- kotlin
- 클래스, 그 클래스를 상속한 클래스 안에서만 보인다
- 클래스를 확장한 함수는 접근 불가
- java
- internal
- 모듈 내부에서만 볼 수 있음
- 모듈
- 한번에 컴파일 되는 코틀린 파일들 (프로젝트)
- 모듈의 최상위 선언을 private로 해두면 모든 class를 internal 설정한것 과 같음
- private
- kotlin은 최상위 선언에 private 허용
😡 봉인된 클래스
- sealed
sealed class Expr
- Expr을 상속한 하위 클래스 정의를 제한할 수 있다
- sealed 표시된 클래스는 자동으로 open
- sealed 쓴 class는 다른 class에 상속시킬 수 없다?
- sealed 클래스에서 하위 클래스 정의는 어디에 할 수 있는가
- kotlin 1.0
- 모든 하위 클래스는 중첩 클래스여야 한다
- kotlin 1.1
- sealed class와 같은 파일의 아무데서나 sealed class 상속한 하위 클래스를 만들 수 있다
- data class로 하위 클래스를 정의할 수도 있다
😘 kotlin의 주 생성자, 부 생성자
class User(val nickname: String)
- 생성자
- java : 여러개의 생성자 생성 가능
- kotlin : 여러개의 생성자를 주 생성자와 부 생성자로 구분
- 초기화 블록을 통해 초기화 로직 추가 가능
- 클래스 이름 뒤에 오는 괄호로 둘러싸인 코드 : 주 생성자
- constructor
- 생성자 정의를 시작할 때 사용
- init
- 초기화 블록을 시작
- 실무에서 init을 사용한 클래스 초기화가 많이 쓰인다
- 클래스의 인스턴스를 만드려면 new 키워드 없이 생성자를 직접 호출하면 된다
- private class
- 어떤 클래스를 클래스 외부에서 인스턴스화 하지 못하게 하고 싶다면 모든 생성자를 private 시키면 된다
- 대부분의 클래스는 생성자가 간단하여 주 생성자로 편하게 생성 가능
😏 부 생성자 사용시 유의할 점
- 인자에 대한 디폴트 값을 제공하기 위해 부 생성자 여러개 만들지 말것
- 파라미터의 디폴트 값을 생성자 시그니처에 직접 명시하기
- 부 생성자는 super 키워드를 통해 자신에 대응하는 상위 클래스 생성자를 호출한다
- 클래스에 주 생성자가 없다면 부 생성자는 상위 클래스를 초기화 or 다른 생성자에게 생성 위임 해야 한다
😇 kotlin 생성자에서 field 란
field = value
- setter의 역할을 하는 구문
- field 가 property의 값을 가지고 있고 값을 받기도 함
반응형
'Languages' 카테고리의 다른 글
kotlin에서의 람다식과 멤버 참조 (lambda, ::, 값으로 표현된 함수) (0) | 2020.04.26 |
---|---|
kotlin in Action 4장 예제 (by, selaed, factory method, constructor) (0) | 2020.04.26 |
Kotlin의 함수 (Collection, 확장함수, 가변 인자 함수, 중위호출) (5) | 2020.04.16 |
Kotlin과 Java의 차이 그리고 혼용 (0) | 2020.04.10 |
Kotlin 튜토리얼 (0) | 2020.04.10 |