9장. 상속

9.1 코틀린에서 상속
9.1.1 Any 클래스
- 코틀린의 모든 클래스는 Any 클래스의 서브 클래스이다. Java.jang.Object와 다르다. equals, toString 만 제공한다.
9.1.2 상속을 통한 클래스 정의(open)
- 상속하려는 상위 클래스를 open으로 명시해야 한다. 상속 허용 여부를 명시하지 않으면 기본으로 final로 적용된다.
9.2 오버라이드
- 상위 클래스에 정의된 프로퍼티나 함수를 하위 클래스에서 재정의하는 것을 말한다.
9.2.1 함수 오버라이드
- 함수를 오버라이드 하기 위해서는 함수 선언에 명시적으로 open 예약어를 추가해야 한다.
- 하위 클래스에서 상위 클래스의 함수를 재정의할 때는 함수 앞에 override 예약어를 추가해야 한다.
9.2.2 override 예약어
- override 예약어로 정의한 함수는 자동으로 open 상태가 되어 하위 클래스에서 재정의할 수 있다.
- 함수를 재정의하면서 하위 클래스는 재정의 못하도록 막기 위해서는 final override를 사용한다.
9.2.3 프로퍼티 오버라이드
- 상위 클래스의 프로퍼티와 이름, 타입이 같아야 함
- val -> val, var 가능 // var -> var만 가능
- null 허용 -> null 불허 "가능" // null 불허 -> null 허용 "불가능"
9.2.4 상위 클래스 멤버 접근
- super를 사용하여 상위 클래스의 멤버에 접근할 수 있다.
9.3 상속과 생성자
9.3.1 상위 클래스 생성자 호출
- 어떠한 형태로든 하위 클래스 생성자에는 상위 클래스의 생성자를 매개변수 정보에 맞게 호출하는 구문이 있어야 한다.
- 클래스의 주 생성자가 선언되어 있다면 해당 클래스의 보조 생성자에서는 주 생성자와 연결하기 위한 this() 구문이
추가되어야 한다.
- 객체 생성 시 어떤 식으로든 상위 클래스의 생성자는 호출되어야 한다.
9.3.2 상하위 생성자의 수행 흐름
- 1. this() 혹은 super()에 의한 다른 생성자 호출
- 2. init 블록 호출
- 생성자의 {} 영역 실행
- 상하위 클래스 관계에서 상위 init 블록 -> 상위 생성자 -> 하위 init 블록 -> 하위 생성자 순으로 실행된다.
9.4 상속과 캐스팅
9.4.1 스마트 캐스팅
- 스마트 캐스팅 : 개발자가 코드에서 명시적으로 캐스팅을 선언하지 않아도 자동으로 캐스팅되는 것
- is : 타입 체크 & True면 타입 변환
9.4.2 as를 이용한 캐스팅
- 상속 관계에 있는 객체를 명시적으로 캐스팅할 때는 as를 이용한다. (객체 as 타입)
- 상위 타입의 객체를 하위 타입에 대입할 때는 스마트 캐스팅이 안 되므로 as를 이용해 명시적으로 캐스팅한다.
- 원래 하위 타입이었던 객체를 상위 타입으로 변환했다가 다시 하위 타입으로 되돌아 오는것만 가능하다.
- 하위 -> 상위 -> 하위(O) / 상위 -> 하위(X)
9.4.3 null 허용 객체의 캐스팅(as?)
- as?를 사용하면 null 허용 객체에 정상적인 객체가 대입되면 정상적으로 캐스팅하고, null이 대입되면 null을 반환한다.
- 캐스팅 결과를 받는 객체도 null 허용으로 선언되어야 한다.
9.5 접근 제한자
9.5.1 접근 제한자란
- 접근 제한자 : 외부에서 클래스, 생성자, 프로퍼티, 함수 등을 이용할 때 접근의 범위를 지정하고자 사용한다.
9.5.2 접근 제한자와 접근 범위
- 최상위 레벨에서의 접근 제한자 : public / private(같은 파일) / internal(같은 모듈) / protected(최상위에서 사용 X)
- 클래스 멤버의 접근 범위 : public / private(같은 클래스) / protect(ptivate + 서브클래스만 접근 가능) /
internal : 같은 모듈에 선언된 클래스에서만 접근 가능
9.5.3 프로퍼티와 생성자의 접근 제한
- get() 함수의 접근 제한자는 프로퍼티의 접근 제한자와 항상 같다
- set() 함수의 접근 제한자는 프로퍼티의 접근 제한자와 다를 수 있지만, 접근 범위를 넓혀서 설정할 수 없다.
- 생산자에 접근 제한자를 지정한다는 의미는 해당 클래스의 객체 생성을 어느 범위까지 허용할 것인지를 나타낸다.
ex) 생성자의 접근 제한자가 public이면 외부 어느 곳에서나 객체 생성이 가능, private면 클래스 내부에서만 가능
- 주 생성자는 constructor를 생햑할 수 있지만, 접근 제한자를 지정하려면 constructor 키워드를 함께 써야 한다.
9.5.4 상속 관계와 접근 제한자
- open과 private는 함께 사용할 수 없다.
- 하위 클래스에서 상위 멤버를 오버라이드할 때 접근 범위를 줄일 수 없다.
※ 코틀린 vs 자바 : 상속
- 코틀린의 기본 상위 클래스는 Object가 아니라 Any이다.
- 상속 관계 선언 시, extends가 아닌 콜론(:)을 이용해 타입 표현으로 상속 관계를 표현한다.
- 상속이나 오버라이딩을 허용하려면 open으로 선언해야 한다.
- 코틀린에서 객체를 명시적으로 캐스팅하려면 as를 이용한다.
※ 코틀린의 기본 접근 제한자는 public이다.