티스토리 뷰

728x90

 


프로퍼티(Property)

• 클래스(객체)가 가지고 있는 변수

 

1. getter / setter

• getter

     - 클래스의 프로퍼티에 접근 할 때

     ex) person.name

• setter

     - 클래스의 프로퍼티 값을 설정할 때

     ex) person.name = "홍길동"

• 기본적으로 프로퍼티에 값을 저장하는 것이나, 저장되어 있는 값을 불러오는 것은 코틀린에서 제공해주지만, 특별한 기능을 추가하고 싶을 경우 개발자가 직접 작성할 수 있다.

• getter와 setter 모두 작성 가능하고, 둘 중 하나만 독립적으로 작성할 수도 있다.

• 모든 프로퍼티마다 설정할 수 있다.

• 해당 프로퍼티는 field로 받는다.

class Book() {
    var title: String = "타이틀"
        get() { // title의 getter 설정
            // getter에 넣고 싶은 특별한 기능 추가
            println("현재 title 값인 ${field} 리턴")
            return field
        }
        set(value: String) { // title의 setter 설정
            // setter에 넣고 싶은 특별한 기능 추가
            println("title을 ${value}(으)로 변경")
            field = value
        }
    var subtitle: String = "서브 타이틀"
}
val book = Book()
println(book.title) // book 객체의 title 프로퍼티에 접근 -> getter 실행
book.title = "돈키호테" // book 객체의 title 프로퍼티 값 설정 -> setter 실행
println(book.title) // book 객체의 title 프로퍼티에 접근 -> getter 실행

 

2. lateinit

• 코틀린은 기본적으로 변수를 선언할 때 초기값을 할당해주어야 함.

• 초기화를 나중에 하고싶을 때 lateinit을 사용할 수 있음.

• lateinit으로 선언한 변수는 호출 전까지는 꼭 값을 할당해주어야 하고, isInitalized로 초기화 여부를 확인 후 사용해야 함.

     * 더블 콜론 (::)

          - Reflection : 런타임(실행 중)에 프로그램의 구조를 조사할 수 있는 기능

          - 변수 앞에 사용하면 변수를 객체 취급하여 변수 안의 메소드를 사용할 수 있다.

          ex) ::title.isInitalized, ::title.getter

class Book2() {
    lateinit var title: String // title 프로퍼티 lateinit으로 선언(초기값 할당 나중에)

    fun nextPage() {
        if (::title.isInitialized) { // title이 초기화가 되었다면
            println("다음 페이지") // 다음 페이지 출력
        } else { // title이 초기화가 아직 안 되어 있으면
            println("초기화 필요") // 초기화 필요 출력
        }
    }
}
val book2_1 = Book2()
//println(book2_1.title) // 오류 발생 : 아직 초기화되지 않았다.
book2_1.nextPage() // 초기화 필요 출력
book2_1.title = "돈키호테"
book2_1.nextPage() // 다음 페이지 출력

val book2_2 = Book2()
book2_2.nextPage() // 초기화 필요 출력 : book2_1와 book2_2는 다른 객체이기 때문에

• lateinit을 사용하기 위한 규칙

     - 인자를 생략하고 주 생성자 안에서 바로 프로퍼티를 선언할 때는 사용할 수 없다.

     - nullable 타입에는 사용할 수 없다.

     - getter / setter를 사용할 수 없다.

     - val로 프로퍼티 선언 시 사용할 수 없다.

     - 원시 자료형에는 사용할 수 없다.

class Book3(lateinit var title: String) // 오류 발생 : 주 생성자 안에서 선언 시 사용 불가

lateinit var title: String? // 오류 발생 : nullable 타입 사용 불가

lateinit var title: String // 오류 발생 : getter / setter 사용 불가
    get() {return field}
    set(value: String) {field = value}
    
lateinit val title : String // 오류 발생 : val로 선언 시 사용 불가

lateinit var title : Int // 오류 발생 : 원시 자료형 사용 불가

 

* 원시 자료형과 참조 자료형

     - 참고 글 : https://jaeyeong951.medium.com/%EC%BD%94%ED%8B%80%EB%A6%B0%EC%9D%98-%EC%9B%90%EC%8B%9C-%ED%83%80%EC%9E%85-a07f698a3581

 

코틀린의 원시 타입

코틀린은 자바와 달리 원시 타입과 래퍼 타입을 구분하지 않는다. 이번에 그 이유와 코틀린의 내부에서 어떻게 원시 타입에 대한 래핑이 작동하는지 살펴보자.

jaeyeong951.medium.com

 

3. lazy

• 선언 시 초기값을 할당하지 않았다가, 변수를 호출 또는 접근 시 초기화한다.

• 사용할 수도 있고 그렇지 않을 수도 있는 변수들, 그 중 코드가 많이 무거운 변수들에게 주로 사용.

• 람다 함수를 사용한다. -> return 키워드를 사용하는 것이 아닌 마지막 줄이 자동 리턴.

• lazy 함수 안에 다른 작업도 가능하지만 리턴 값은 꼭 넣어야 함.

class Book4() {
    val title: String by lazy {
        println("lazy 사용") // 다른 작업 가능.
        //return "셜록홈즈" // 오류 발생 : return 키워드 불가능
        //title = "셜록홈즈" // 오류 발생 : title 인식 못 함.
        //field = "셜록홈즈" // 오류 발생 : field는 getter / setter에서만 사용 가능. field 인식 못함.
        "셜록홈즈" // 맨 마지막 줄 return됨.
    }
}
val book4 = Book4()
println(book4.title)

 

메소드(Method)

• 클래스(객체)가 가지고 있는 함수

class FootballPlayer(name: String, uniform: String, ball: String) {
    val name: String
    val uniform: String
    val ball: String

    init {
        this.name = name
        this.uniform = uniform
        this.ball = ball
    }

    fun kick() { // kick() 메소드
        // 반복, 예외처리, 흐름제어 등
        println("${name}이(가) 공을 찬다.")
    }

    fun pass() { // pass() 메소드
        println("${name}이(가) 패스한다.")
    }
}
val fbPlayer1 = FootballPlayer("홍길동", "빨간색 유니폼", "축구공")
val fbPlayer2 = FootballPlayer("고길동", "파란색 유니폼", "축구공")
fbPlayer1.kick()
fbPlayer2.pass()

* 클래스 내부에서만 사용할 메소드는 네이밍할 때 _를 붙이는게 암묵적인 룰

 

 

 

 

 

 

 

 

이 글은

패스트 캠퍼스 Android 앱 개발의 정석 with Kotlin 올인원 패키지 Online

강의를 듣고 공부한 내용을 바탕으로 작성되었습니다.

 


728x90
댓글
공지사항