출처 : Tekhit Android App School / Soft campus 윤재성 강사님
🎉 Any
- Kotlin에서 사용하는 모든 클래스의 부모 클래스입니다.
- 클래스 작성시 상속 관계를 설정하지 않으면 자동으로 Any Class를 상속합니다.
- 모든 객체는 Any Type에 담을 수 있습니다.
- 자바의 Object와 같은 기능을 합니다.
fun main(){
val a1:Any = TestClass1()
val a2:Any = TestClass2()
}
// 상속 관계를 설정하지 않았지만 Any를 상속받는다.
class TestClass1
class TestClass2
🎉 This
- 객체 자기 자신을 가르키는 키워드
- 클래스의 프로퍼티와 매개변수의 이름이 같은 경우 이를 구분하기 위해 사용
fun main(){
val t1 = TestClass1()
t1.testMethod1(1)
}
class TestClass1{
var value1 = 100
fun testMethod1(value1: Int){
println("value1 : $value1")
println("this.value1 : ${this.value1}")
}
}
- TestClass1 의 프로퍼티 value1의 이름과 testMethod1() 메소드의 매개 변수의 이름이 같은 경우 프로퍼티에 접근하고 싶다면 this를 통해 접근합니다.
- 멤버 메서드와 메서드 내부의 메서드를 구분할 때 사용
fun main(){
t1.testMethod2()
}
class TestClass1{
fun testMethod2(){
fun innerMethod1(){
println("innerMethod1 호출")
}
innerMethod1()
fun testMethod3(){
println("testMethod2 메서드의 내부 메서드 testMethod3")
}
testMethod3()
this.testMethod3()
}
fun testMethod3(){
println("나는 TestClass1의 testMethod3")
}
}
- 클래스의 멤버 메소드와 testMethod3() 동일한 이름을 가진 내부 메소드 testMethod3()을 생성
- this를 사용하여 멤버 메소드 testMethod3()을 호출
- 다른 생성자를 호출하는데 사용합니다.
- 클래스에 주 생성자가 정의되어 있다면 무조건 주 생성자를 호출해줘야 합니다.
fun main(){
val t2 = TestClass2()
println("t2 : $t2")
}
class TestClass2{
constructor() : this(100){
println("매개 변수가 없는 생성자 호출")
}
constructor(a1:Int){
println("매개 변수가 있는 생성자 호출")
println("a1 : $a1")
}
}
🎉 Super
- 부모 영역을 지칭
- 객체가 가지고 있는 property(변수)와 부모가 가지고 있는 property(변수)를 구분하기 위해 사용
open class SuperClass1{
open var superValue1 = 100
constructor(){
println("SuperClass1의 생성자")
}
constructor(a1:Int){
println("매개 변수를 가지고 있는 SuperClass1의 생성자")
println("a1 : $a1")
}
}
class SubClass1: SuperClass1{
override var superValue1 = 200
constructor():super(1000){
println("SubClass1의 생성자 호출")
}
}
- 부모 클래스에 정의된 프로퍼티와 동일한 이름의 프로퍼티를 만들고자 한다면 부모가 가지고 있는 프로퍼티 중에 open 프로퍼티만 가능하며 앞에 override 키워드를 붙혀줘야 한다.
- 자식 클래스에서 동일한 이름의 프로퍼티를 만드는 것을 허용하겠다면 open을 붙혀준다.
- 코틀린의 모든 클래스는 생성자에서 부모 클래스의 생성자 호출을 명시하지 않으면 자동으로 부모의 생성자 중 매개변수가 없는 생성자가 호출된다.
- 호출되는 부모의 생성자를 명시적으로 지칭하겠다면 super를 사용한다.
open class SuperClass1{
open var superValue1 = 100
constructor(){
println("SuperClass1의 생성자")
}
constructor(a1:Int){
println("매개 변수를 가지고 있는 SuperClass1의 생성자")
println("a1 : $a1")
}
// 자식 클래스에서 메서드를 재 구현(overriding)을 허용하겠다면 open을 붙혀준다.
open fun superMethod2(){
println("SuperClass1의 superMethod2")
}
}
class SubClass1: SuperClass1{
override var superValue1 = 200
constructor():super(1000){
println("SubClass1의 생성자 호출")
}
fun subMethod1(superValue1:Int){
println("superValue1 : $superValue1")
println("this.superValue1 : ${this.superValue1}")
println("super.superValue : ${super.superValue1}")
}
override fun superMethod2() {
println("SubClass1의 superMethod2")
}
fun subMethod2(){
superMethod2()
super.superMethod2()
}
}
- 매개변수의 이름이나 맴버 프로퍼티의 이름이 부모의 프로퍼티 이름과 동일할 경우 super를 통해 부모의 프로퍼티에 접근합니다
- 부모의 메서드를 자식에서 재 구현한 경우 부모의 메서드를 호출하고자 한다면 super를 사용합니다.
'TEKHIT ANDROID SCHOOL' 카테고리의 다른 글
[TEKHIT] 중첩 클래스 & NULL & Casting (0) | 2024.01.10 |
---|---|
[TEKHIT]Companion & Data Class & Generic (1) | 2024.01.10 |
[TEKHIT] Abstract & Interface (0) | 2024.01.05 |
[TEKIT] 지연 초기화와 오버라이딩 (0) | 2024.01.05 |
[TEKHIT] 상속과 프로퍼티 (0) | 2024.01.05 |