Hello, Android!

super this 본문

Kotlin

super this

lwndnjs93 2020. 3. 15. 21:41

클래스에 상속 관계가 발생하였을때

필요에 따라 자기 클래스의 메서드, 프로퍼티를 사용하거나

부모 클래스의 메서드와 프로퍼티를 호출해야하는 경우가 발생한다

이럴때 호출 대상이 자기 자신인지, 부모인지를 지정하는 키워드가 super와 this이다

super는 부모 클래스의 메서드, 프로퍼티를 참조하겠다고 제한하는 것이고

this는 자기 자신의 메서드, 프로퍼티를 참조하겠다는 것이다

super this
super.프로퍼티명 부모 클래스의 프로퍼티 참조 this.프로퍼티명 자기 자신의 프로퍼티 참조
super.메서드() 부모 클래스의 메서드 참조 this.메서드() 자기 자신의 메서드 참조
super() 부모 클래스의 생성자 참조 this() 자기 자신의 생성자 참조

- super

Suv 클래스는 Car클래스의 자식클래스 이다

부모 클래스의 carType 메서드를 오버라이딩 하면서 super.carType() 으로 부모 클래스의 carType메서드를 호출한다

이후에 println함수를 실행하고 Suv클래스 내에서 새롭게 정의한 strongSuv()를 호출한다

 

- this

main에서 Suv의 생성자에 하나의 문자열만 인수로 넘겼다

이때 문자열 매개변수를 하나만 받는 첫번째 부 생성자가 호출이 된다

첫번째 부 생성자는 this()로 자신의 생성자에 문자열과 정수를 넘겨줘 밑의 두번째 부 생성자가 호출이 된다

두번째 부 생성자에서는 다시 super()에 문자열과 정수를 넘겨준다

부모 클래스에서는 하나의 문자열과, 정수를 매개변수로 받는 두번째 부 생성자가 호출이 되어

println으로 문장을 출력한다

부모 클래스의 두번째 부 생성자가 종료되면 Suv클래스의 두번째 부 생성자의 println이 실행되고

다시 Suv클래스의 첫번째 부 생성자의 println이 실행된다

 

주 생성자와 부 생성자가 같이 있을때 this() 를 사용하면 주 생성자를 의미하게 된다

car1은 문자열과 정수를 넘겨주기때문에 매개변수가 일치하는 Car 클래스의 부 생성자를 호출하게 된다

부 생성자가 호출되면 println함수가 실행되고 this() 를 통해 주 생성자가 호출된다 

주 생성자에서 매개변수에 있는 println이 호출되고, 주 생성자 블록의 println, 초기화(init) 블록의 println이 호출된다

이후 다시 부 생성자에 돌아와 마지막 println함수가 호출된다

 

car2는 생성자에 넘겨주는 매개변수가 문자열 한개밖에 없으니 Car 클래스의 주 생성자를 호출하게 된다

주 생성자에서는 매개변수의 println이 호출되고 주 생성자 블록의 println이 호출된 다음 init의 println이 호출된다

 

코틀린에서는 주 생성자, 부 생성자가 존재하는 만큼 둘이 같이 있을때 this()로 생성자를 호출하면

주 생성자가 호출되는것이 특이한것 같다

 

※생성자 설명 글

https://lwndnjs93.tistory.com/34

'Kotlin' 카테고리의 다른 글

인터페이스  (0) 2020.03.16
이너클래스 inner class  (0) 2020.03.16
다형성  (0) 2020.03.15
상속  (0) 2020.03.15
생성자  (0) 2020.03.11