본문 바로가기

Programming/Kotlin

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이다.

'Programming > Kotlin' 카테고리의 다른 글

11장. 다양한 코틀린 클래스  (0) 2020.01.23
10장. 추상 클래스와 인터페이스  (0) 2020.01.21
8. 프로퍼티  (0) 2020.01.17
7. 클래스  (0) 2020.01.16
6. 흐름 제어 구문과 연산자  (0) 2020.01.13