inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

10강. 코틀린에서 상속을 다루는 방법

상위클래스의 생성자나 init블럭에서 final이 아닌 프로퍼티에 접근하지 말라 의미여

806

이용조

작성한 질문수 11

3

안녕하세요.

derived클래스에서 number 0나오는 예제 있잖아여

상위클래스의 생성자나 init블럭에서 final이 아닌 프로퍼티에 접근하면 안된다고 하셨는데

 

final이라고 해서 var이아닌 val인가? 처음에 생각했는데

저 의미가 아니라

정확히는 open키워드로 상속을 열어둬서 하위클래스에서 오버라이딩 될 수 있는 프로퍼티에 접근하지 말라는거죠?

자바에선 메쏘드에 final 키워드를 붙이면 하위클래스에서 오버라이딩이 불가능 하니깐 사용하신 의미라 생각되는데 좀 햇갈려서요~

 

감사합니다.

 

oop kotlin java

답변 4

4

김진완

number 를 계속 필드라고 생각해서 혼동됐는데

Base 클래스의 init 구문에서 사용되는 number 는 getter 라고 생각하니까 이해가 됐습니다..!

(혹시 저 처럼 헷갈리시는 분들을 위해)

 

open class Base(
    open val num: Int = 100
) {
    init {
        println("Base init")
        println(this.num) // Derived.getNum()
    }
}

class Derived(
    num: Int
) : Base(num) {
    override val num: Int = num
        get() {
            println("Derived getter")
            return field
        }
    init {
        println("Derived init")
        println(this.num)
    }
}

fun main() {
    Derived(300)
}

------- Result ------
출력 결과는 다음과 같음
    Base 의 init 에서 호출하는 num 은 getter 인데, 이 getter 는 Derived 에서 override 되었음
    그런데 Derived 의 num getter 에서 반환하는 field 는 아직 초기화되지 않아 Int 기본값 0을 반환
    그래서 Base 의 this.num 에서는 반환받은 0을 출력함

Base init
Derived getter
0
Derived init
Derived getter
300

1

이용조

강의 뒤에 내용이 좀더 있었군요 맞는것 같습니다.

0

developyo

저도 이부분이 굉장히 혼란스러웠는데, 진완님이 number필드가 아닌 getter 호출이라는 부분을 한 번 더 짚어주어 이해에 큰 도움이 되었습니다!

감사합니다!!

0

최태현

안녕하세요 용조님~!! 크으~ 좋은 포인트이십니다!! 😊😊

 

네네, 정확히 맞습니다!! final이 아닌 이라고 표현한 부분은 open 키워드로 상속을 열어 하위 클래스에 오버라이딩 될 수 있는 프로퍼티에 접근하면 안된다 라는 의미입니다!!

 

프로퍼티가 오버라이딩 된다는 것을 Java로 표현하면 getter를 (var의 경우 setter)까지 오버라이드 한다는 것으로 메소드에 대한 오버라이딩이 되니까요!

 

추가로 보다 정확한 내용은 https://kotlinlang.org/docs/inheritance.html#derived-class-initialization-order 에서 확인하실 수 있습니다!

 

Using any of those properties in the base class initialization logic (either directly or indirectly through another overridden open member implementation) may lead to incorrect behavior or a runtime failure. When designing a base class, you should therefore avoid using open members in the constructors, property initializers, or init blocks.

 

라고 표현되어 있습니다 ㅎㅎㅎㅎ

항상 좋은 질문 남겨주셔서 감사합니다, 행복한 밤 되셔요!! 🙏🙇

수업노트

0

53

1

싱글톤과 스프링

0

71

2

get() = 3

0

49

2

강사님

0

74

1

강의 복습하면서 생긴 질문

1

94

1

Kotlin과 Java의 현업에서의 활용

0

124

2

data class와 자바의 Lombok을 이용한 DTO 클래스 차이 질문

0

73

1

코틀린에서 상속 시, 주의점에 대한 질문

1

95

3

내용 이해 질문

0

56

1

자바와 코틀린의 함수형 프로그래밍,

1

91

1

플랫폼 타입 설명 문의

2

76

2

널 아님 단언 관련 질문

0

83

1

강의 중 질문

0

79

2

범위 비교 질문

1

91

2

타입캐스팅 궁금한점 질문드립니다.

1

239

2

코틀린 val 질문

0

166

2

완강 후 Kotlin 이런저런 질문 드려봅니다!

3

408

2

확장함수 스타일 질문

0

139

2

확장 프로퍼티 질문

1

156

1

update 함수를 만든다는게 어떤 의미인지 예시가 궁금합니다!

1

283

1

java class의 NotNull 어노테이션 인식

1

262

1

[16강] 확장함수 관련 질문입니다!

1

131

2

리턴타입 사용시 any를 사용해도 괜찮은가요?

1

139

1

안녕하세요 scope function 에 receiver 가 없는 경우

1

169

1