티스토리 뷰
본 포스팅의 내용은 [깡샘의 코틀린 프로그래밍]을 공부하고 작성자가 생각을 정리하기 위해서 작성한 글이므로 더욱 자세한 내용을 알고 싶으신 분은 [깡샘의 코틀린 프로그래밍]을 강력 추천합니다!!
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 메서드를 제공함으로써 변수를 이용할 수 있게 하자는 개념
- 정보은닉 : 캡슐화를 하게 되면 외부에서는 실제 클래스 내에서 데이터가 어떻게 처리되는지 알 수 없다.
- 유지 보수성 : 변수를 직접 이용하게 되면 해당 변수를 다루는 로직을 모두 고쳐야 하지만 변수를 이용하는 방법을 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 함수를 포함하는 변수로 볼 수 있다.
반응형
'Programming > 코틀린(Kotlin)' 카테고리의 다른 글
추상 클래스와 인터페이스의 사용 목적 (0) | 2021.04.12 |
---|---|
[코틀린] 09. 상속 (feat. 깡샘) (0) | 2021.04.12 |
[코틀린] 07. 클래스 (feat. 깡샘) (0) | 2021.04.08 |
[코틀린] 06. 흐름 제어 구문과 연산자 (feat. 깡샘) (0) | 2021.04.05 |
[코틀린] 05. 데이터 타입 (feat. 깡샘) (2) | 2021.04.04 |
댓글