티스토리 뷰

본 포스팅의 내용은 [깡샘의 코틀린 프로그래밍]을 공부하고 작성자가 생각을 정리하기 위해서 작성한 글이므로 더욱 자세한 내용을 알고 싶으신 분은 [깡샘의 코틀린 프로그래밍]을 강력 추천합니다!!

1. 코틀린에서 프로퍼티 이용

1.1. 프로퍼티란?

  • 코틀린에서는 클래스의 변수를 프로퍼티라고 부른다. val이나 var로 선언되는 변수들이 프로퍼티다.
  • 프로퍼티는 getter와 setter 함수가 내장되어 있다.
  • 프로퍼티를 선언할 때 초깃값과 getter, setter는 선택사항이다.
// 프로퍼티 형식
var <propertyName>[: <PropertyType>] [=<property_initializer]
    [<getter>]
    [<setter>]

// 예시
var name: String = "weekyear"
    get() = field
    set(value) = { field = value }
  • var로 선언한 변수는 get(), set()이 추가되며, val로 선언한 변수는 값을 변경할 수 없으므로 get()만 추가된다.
  • get(), set() 함수의 field는 프로퍼티에 저장된 값 자체를 지칭하는 예약어이다.

getter/setter 함수를 활용하여 변수에 접근하는 이유

클래스의 변수는 캡슐화하여 정보은닉과 유지 보수성을 목적으로 한다.

캡슐화 : 변수를 캡슐(예로들어 클래스)로 묶어 외부에서 직접 이용하지 못하게 보호하고, 대신 getter/setter 메서드를 제공함으로써 변수를 이용할 수 있게 하자는 개념

  1. 정보은닉 : 캡슐화를 하게 되면 외부에서는 실제 클래스 내에서 데이터가 어떻게 처리되는지 알 수 없다.
  2. 유지 보수성 : 변수를 직접 이용하게 되면 해당 변수를 다루는 로직을 모두 고쳐야 하지만 변수를 이용하는 방법을 getter/setter 메서드로 한정해놓으면 getter/setter 메서드 로직만 고치면 된다.

1.2. 사용자 정의 프로퍼티

  • 사용자 정의 프로퍼티를 만들 때 규칙
    • get( ), set( ) 함수 내부에서는 프로퍼티 값을 field로 접근한다.
    • var로 선언한 프로퍼티는 set( )과 get( ) 함수를 모두 정의할 수 있지만 val로 선언한 프로퍼티는 set( )함수를 정의할 수 없다.
    • val로 선언한 프로퍼티는 get( ) 함수를 정의하면 초깃값을 명시하지 않아도 된다.
    • var로 선언한 프로퍼티는 get( ) 함수를 정의하더라도 초깃값을 명시해야 한다.

1.3. 주 생성자와 프로퍼티

  • 지역 변수는 프로퍼티가 아니므로 get( ), set( ) 함수를 제공하지 않는다.
  • 프로퍼티로 이용할 수 있는 변수는 어떤 블록 { }에도 포함되지 않는 최상위 레벨 변수와 클래스 내부에 선언한 멤버 변수 뿐이다.
  • 주 생성자의 매개변수는 get( ), set( ) 함수를 정의할 수 없지만 클래스에 프로퍼티를 별도로 생성하여 주 생성자의 매개변수를 적용하여 사용 가능하다.

2. 프로퍼티 초기화

  • 프로퍼티는 선언과 동시에 초깃값을 대입해 초기화해야 한다.
  • 하지만 상황에 따라서 선언과 동시에 초깃값을 대입할 수 없을 때가 있다.

2.1. 초기화 블록에서 초기화

  • 클래스의 프로퍼티를 선언하면서 동시에 초깃값을 대입하지 않고, 초기화 블록에서 프로퍼티를 초기화해 사용할 수 있다.
class User {
    var name: String
    var age: Int

    init {
        name = "weekyear"
        age = "28"
    }
}
  • 클래스의 프로퍼티는 꼭 초기화해야 하지만, 객체를 생성할 때 가장 먼저 실행되는 부분이 초기화 블록이므로 여기서 초기화하면 프로퍼티 선언문에 초깃값을 대입하지 않아도 된다.

2.2. null 허용으로 선언

  • 프로퍼티를 초기화하는 두 번째 방법은 프로퍼티를 null 허용으로 선언해 null로 초기화하는 방법이다.

2.3. 늦은 초기화

  • 프로퍼티를 null 허용으로 선언하지 않고 프로퍼티 초기화를 미루는 방법도 있다. lateinit 예약어를 사용한다.
  • 늦은 초기화를 이용하면 프로퍼티의 선언과 동시에 초기화하지 않아도 되지만 다음의 제약사항이 있다.
    • lateinit은 var로 선언한 프로퍼티에만 사용할 수 있다.
    • lateinit은 클래스 몸체에 선언한 프로퍼티에만 사용할 수 있다. 주 생성자에는 사용할 수 없다.
    • lateinit은 사용자 정의 getter/setter를 사용하지 않은 프로퍼티에만 사용할 수 있다.
    • null 허용 프로퍼티에는 사용할 수 없다.
    • 기초 타입 프로퍼티에는 사용할 수 없다.
lateinit var lateData: String

2.4. 초기화 미루기

  • 프로퍼티 선언 시점에 초기화하는 것이 아니라, 실제 프로퍼티를 이용하는 시점에 초기화할 수 있다.
  • 프로퍼티에 by lazy { }로 선언하여 프로퍼티의 초기화를 lazy 영역에서 진행하면 된다.
  • lazy 사용은 다음의 규칙이 있다.
    • 호출 시점에 초기화 진행
    • val로 선언한 프로퍼티에만 사용 가능
    • 클래스 몸체 이외에 최상위 레벨에서 사용 가능
    • 기초 타입에도 사용 가능
  • lazy 블록은 여러 줄로 작성할 수 있지만 표현식이므로 가장 마지막 줄의 데이터가 lazy를 적용한 프로퍼티 값으로 초기화된다.
val name: String by lazy {
    "weekyear"
}

자바 vs. 코틀린

코틀린에서는 필드(field)를 제공하지 않는다.

  • 자바에서는 흔히 클래스의 변수를 필드라고 한다. 그런데 코틀린에서는 필드를 제공하지 않으며, 반대로 자바에서는 코틀린의 프로퍼티라는 개념이 없다.
필드(field) : 클래스의 멤버 데이터로서 별도로 지정하지 않는 한 정적(static)이지 않다.
프로퍼티(property) : 사용자가 설정할 수 있는 객체의 특성이다.
  • 필드는 하나의 클래스 내에서만 사용하고자 하는 변수이며 프로퍼티는 외부에서 이용을 위해 getter/setter 함수를 포함하는 변수로 볼 수 있다.
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함