Kotlin this, super
Kotlin this, super
this
- 객체 자기 자신을 지칭한다.
- 멤버 변수와 메서드 내부의 변수를 구분할 때 사용한다.
- 멤버 메서드와 메서드 내부의 메서드를 구분할 떄 사용한다.
- 생성자에서 다른 생성자를 호출할 때 사용한다.
fun main() {
val obj1 = TestClass1()
obj1.testMethod1()
}
class TestClass1 {
var a1 = 100
fun testMethod1() {
var a1 = 200
println("a1 : $a1")
println("this.a1 : $this.a1")
}
}
this는 객체 자신을 의미하기때문에, 클래스 자체의 멤버변수 100 을 출력한다.
코틀린에서는 메서드 안에 메서드를 만드는게 가능하다.
fun main() {
val obj1 = TestClass1()
obj1.testMethod1()
}
class TestClass1 {
var a1 = 100
fun testMethod1() {
fun testMethod2() {
println("testMethod1 내부의 testMothod1")
}
testMethod2() // 내부 함수 호출
this.testMethod2() // 클래스 멤버의 메서드 호출
}
fun testMethod2() {
println("testMethod2")
}
}
근데, 누가 이렇게 쓸까, 동일클래스에서 클래스 멤버변수랑 메서드 내부 멤버변수의 이름을 동일하게 하거나, 클래스 멤버 메서드랑 내부 멤버 메서드 이름을 동일하게 할 경우는 없을 것으로 생각된다.
아마 정적검사툴이나 보안체크툴에서 이런 잘못된 행동을 제약을 걸지 않을까 판단된다.
Super
- 부모 영역을 지칭한다.
- 멤버변수와 상속받은 멤버 변수를 구분할 때 사용한다.
- Overriding한 메서드와 부모의 메서드를 구분할 때 사용한다.
- 부모의 생성자를 호출할 때 사용한다.
fun main() {
val obj1 = SubClass()
obj1.subMethod1()
}
open class SuperClass {
var a1 = 100
}
class SubClass:SuperClass() {
var a1 = 1000
fun subMethod1() {
println("a1 : $a1")
}
}
Kotlin: 'a1' hides member of supertype 'SuperClass' and needs 'override' modifier
자식클래스에서 부모 클래스의 멤버변수가 접근이 가능하나, 동일한 이름의 멤버 변수를 선언하게 될 경우 위와 같은 에러가 발생한다.
fun main() {
val obj1 = SubClass()
obj1.subMethod1()
}
open class SuperClass {
open var a1 = 100
}
class SubClass:SuperClass() {
override var a1 = 1000
fun subMethod1() {
println("a1 : $a1") // 1000
println("this.a1 : ${this.a1}") // 1000
println("this.a1 : ${super.a1}") // 100
}
}
자식클래스에서 부모클래스의 멤버변수와 동일한 이름의 멤버 변수를 사용하기 위해서는 부모클래스에서 open 키워드를, 자식클래스에서 overide 키워드를 사용하면 사용가능하다.
자식클래스 메서드에서 멤버변수를 호출하면 기본적으로 자식클래스 멤버변수가 사용되며, this 키워드를 이용해도 자식클래스 멤버변수가 사용되며, super 키워드를 이용해야만 부모클래스의 멤버변수를 사용가능하다.
즉, super 키워드는 override 된 멤버변수, 메서드에서 부모클래스의 멤버변수, 메서드를 사용하기 위해서 사용한다.
댓글
댓글 쓰기