그외 기본 개념들 (Any, LateInit, this...)

순순·2024년 4월 3일

코틀린

목록 보기
6/8

Any


  • 코틀린에서 모든 클래스가 직접 혹은 간접적으로 상속받는 클래스.
  • 모든 클래스의 부모 클래스이다.

특징

  • Any안에는 클래스가 갖춰야할 기본적인 기능이 들어있다.
  • 코틀린의 모든 클래스는 Any를 상속받는다. 그렇기 때문에 모든 객체는 Any 타입 변수에 담을 수 있다.
  • 클래스를 정의할 때 상속관계를 설정하지 않으면 Any 클래스를 상속받는다.

예시1

val a1:Any = TestClass1()
val a2:Any = TestClass2()

예시2

class TestClass1
class TestClass2

class TestClass3(var a1:Int, var a2:Int){
		// toString 메서드 구현
    // toString : 객체를 문자열로 변환하는 의미의 메서드
    // 객체의 주소값을 가지고 있는 변수를 출력하면 toString 메서드가 호출되고
    // 여기서 반환하는 문자열을 출력해준다.
		override fun toString(): String {
				println("a1 : $a1")
        println("a2 : $a2")
        return "TestClass3을 통해 만든 객체입니다"
}

LateInit


지연초기화. init 블럭이나 생성자에서 값을 저장하지 않고 메서드에서 값을 저장하는 경우 사용한다.

코틀린은 프로퍼티 정의 시 무조건 값을 지정해야한다.

코드를 수행시켜서 얻어진 값을 저장해야하는 경우, 아무 값이나 넣어둔 다음에 나중에 값 변경해줘야 하는 번거로움이 있다. 그럴 때 쓰는게 지연초기화이다.

한마디로 값을 추후에 지정하는 기능이다.

특징

  • var 변수만 가능하다 (val도 특정조건 하에 가능)
  • init이나 생성자에서 초기화해주는 코드를 넣어줄 경우, val 변수 property 정의 시 저장할 값을 지정하지 않아도 된다.
  • Int, Float, Double과 같은 기본 자료형은 사용할 수 없다.
  • String 가능

예시

// Kotlin에서는 Property를 정의할 때 저장할 값을 무조건 지정해야한다.

    var a1:Int = 100
		var a2 = 200

// 아래처럼 정의할 경우 init이나 construtor 또는 lateinit을 통해
// 값을 지정하지 않으면 오류가 난다
     var a3:Int
     var a4:Int
		 var a5:String
// 2. main 적용
fun main(){
    val t1 = TestClass1()
    println("t1.a1 : ${t1.a1}")
    println("t1.a2 : ${t1.a2}")
    println("t1.a3 : ${t1.a3}")
    println("t1.a4 : ${t1.a4}")

    t1.testMethod1()
}

// 1. 테스트 클래스생성
class TestClass1{
    var a1:Int = 100
    var a2 = 200
    var a3:Int
    var a4:Int

		// 생성자를 통해 설정
    constructor(){
        a4 = 400
    }
		// init 블록으로 설정
    init{
        a3 = 300
    }

		// lateinit 설정
    lateinit var a5:String

    fun testMethod1(){
        a5 = "지연초기화 완료"
        println("a5 : $a5")
    }
}

객체 지칭


this

객체 자기 자신을 가리킨다.

  • 변수: 클래스 내 프로퍼티와 동일한 이름의 매개변수를 구분할 때 사용.
  • 생성자: 다른 생성자를 호출하기 위해 사용.
  • 메서드: 멤버 메서드와 지역 메서드를 구분하기 위해 사용.

참고)
멤버 메서드: 클래스 내부에 직접 선언된 메서드. 클래스의 프로퍼티와 다른 멤버에 접근할 수 있다.

지역 메서드: 코틀린에선 메서드 내에 메서드를 생성할 수 있다. 지역 메서드는 특정 메서드 내에 선언된 메서드를 말한다. 메서드 밖에선 접근 불가.


super

부모 클래스를 가리킨다.

  • 변수: 객체가 가지고 있는 property와 부모가 가지고 있는 property를 구분하기 위해 사용.
  • 생성자: 부모의 생성자를 호출하기 위해 사용한다.
  • 메서드: 자식에서 overriding한 메서드와 부모의 메서드를 구분하기 위해 사용한다.

this를 사용하여 프로퍼티, 멤버 메서드 호출 예시


이름이 같은 경우
: 프로퍼티와 매개변수 이름 둘다 value1으로 같을 경우, 기본적으로 매개변수를 출력한다. 프로퍼티를 출력하고 싶다면 this를 붙여야 한다.

같은 클래스 내 다른 멤버메서드를 호출할 경우
: this를 붙여줘야한다.

// this : 객체 자기자신을 가리킨다.
// this.변수 : property를 지칭하는 용도로 사용한다.
// constructor() : this() = 다른 생성자를 호출하기 위해 사용한다.
// this.메서드() : 멤버 메서드와 지역 메서드를 구분하기 위해 사용한다.

fun main(){
    // 예시1 출력
    var t1 = TestClass1()
    t1.testMethod1(10)

    // 예시2 출력
    t1.testMethod2()

    // 예시3 출력
    t1.testMethod3()
}

class TestClass1{
    // 프로퍼티 value1 정의
    var value1 = 100

    // 매개변수 value1 정의
    // 예시1. 프로퍼티와 매개변수 이름 둘다 value1으로 같을 경우

    fun testMethod1(value1:Int){
        // value1 호출 시 매개변수가 호출된다.
        println("매개변수 value1 : $value1")

        // 프로퍼티를 호출하고 싶다면 this 사용
        println("프로퍼티 value1 : ${this.value1}")
    }

    // 예시2. 내부메서드
    // 코틀린은 메서드 안에 메서드를 만들 수 있다.
    // 내부메서드는 외부에서만 사용 가능하다.
    fun testMethod2(){

        fun innerMethod(){
            println("innerMethod 호출")
        }
        innerMethod()

        // 메서드 내부에 만든 메서드(innerMethod)가 호출된다

        // 예시3. 만약 같은 클래스 내 다른 멤버메서드를 호출하고 싶다면 this 사용
        this.testMethod3()
    }
    
    fun testMethod3(){
        println("TestClass1의 testMethod3")
    }

}

this를 사용하여 다른 생성자를 호출하는 예시


fun main(){
    var t2 = TestClass2()
    
}
class TestClass2{

    // this(): 다른 생성자를 호출한다.
    // 만약 클래스에 주 생성자가 정의되어 있다면 무조건 주 생성자를 반드시 호출하도록 해야한다.

    // 예시1. 다른 생성자 A 호출하기
    // constructor() <- 괄호가 비어져있다. 매개변수 없음
    constructor() : this(100){
        println("매개 변수가 없는 생성자 호출")
    }

    // 호출할 다른 생성자 A
    // constructor(a1:Int) <- 괄호안의 (a1:Int)가 매개변수이자 주생성자
    constructor(a1:Int){
        println("매개변수가 있는 생성자 호출")
        println("a1 : $a1")
    }
}

super 사용 예시

open class Parent {
    open fun greet() {
        println("Hello from Parent")
    }
}

class Child : Parent() {
    override fun greet() {
        super.greet()  // 부모 클래스의 메서드 호출
        println("Hello from Child")
    }
}

fun main() {
    val child = Child()
    child.greet()
}

profile
플러터와 안드로이드를 공부합니다

0개의 댓글