Properties & Field
자바에서는 프로퍼티를 지원하지 않는다.
따라서 getter나 setter를 만들어서 변수에 접근해야 했다. 하지만 코틀린에서는 프로퍼티를 지원하기 때문에
getter나 setter를 만들지 않아도 된다.
class Address{
var name: String = "Kotlin"
val city: String = "Seoul"
}
fun copyAddress(address: Address): Address{
val result = Address()
result.name = address.name
return result
}
사실 프로퍼티는 getter와 setter가 있지만 생략 가능하다.
public static final void main() {
Address obj = new Address();
String var1 = obj.getName();
boolean var2 = false;
System.out.println(var1);
}
decompile 한 코드이다. getName()이라는 함수를 만들지 않아도 자동으로 만들어 사용한다.
class Address{
var name: String = "Kotlin"
get(){
return field
}
set(value) { field = value }
}
사실은 이러한 형태의 class가 사용되는 것이다.
프로퍼티는 초기화를 해줘야 한다.
그리고 getter에서 타입을 추론할 수 있는 경우에는 프로퍼티의 타입을 생략할 수 있다.
Backing Fields
코틀린 클래스는 field를 가질 수 없다.
field는 예약어로 자동으로 만들어진다. 이를 automatic backing field라고 한다.
따라서 field는 프로퍼티의 accessor에서만 사용 가능하다.
이런 automatic backing field가 생성되는 조건이 있다.
- accessor 중 1개라도 기본 구현을 사용하는 경우
- custom accessor에서 field 식별자를 참조하는 경우
val isEmpty: Boolean
get() = this.size == 0
위와 같은 경우에는 read only 프로퍼티를 선언했기 때문에 setter는 정의할 수 없고 getter만 정의가 가능한데 field를 참조하지 않았기 때문에 backing field가 생성되지 않는다.
Backing Properties
implicit backing field방식이 맞지 않는 경우에는 backing property를 사용할 수 있다.
private var _table: Map<String, Int>? = null
public val table: Map<String, Int>
get(){
if(_table == null){
_table = HashMap()
}
return _table ?: throw AssertionError("null ")
}
Compile-Time Constants
const moodifier를 이용하여 컴파일 타임 상수를 만들 수 있다.
- Top-level
- object의 멤버
- String이나 프리미티브 타입으로 초기화된 경우
Late-Initialized Properties
일반적으로 프로퍼티는 non-null 타입으로 선언된다. non-null 타입 프로퍼티를 사용하고 싶지만, 생성자에서 초기화해줄 수 없는 경우가 있다. 이럴 때는 나중에 초기화될 것이라고 명시해 줘야 한다.
public class MyTest{
lateinit var subject: TestSubject
@SetUp fun setup(){
subject = TestSubject()
}
@Test fun test(){
subject.method()
}
}
- 클래스의 바디에서 선언된 프로퍼티만 가능
- 기본 생성자에서 선언된 프로퍼티는 불가능
- var 프로퍼티만 가능
- custom accessor가 없어야 한다.
- 프리미티브 타입이면 안된다.
Properties & Field
자바에서는 프로퍼티를 지원하지 않는다.
따라서 getter나 setter를 만들어서 변수에 접근해야 했다. 하지만 코틀린에서는 프로퍼티를 지원하기 때문에
getter나 setter를 만들지 않아도 된다.
class Address{
var name: String = "Kotlin"
val city: String = "Seoul"
}
fun copyAddress(address: Address): Address{
val result = Address()
result.name = address.name
return result
}
사실 프로퍼티는 getter와 setter가 있지만 생략 가능하다.
public static final void main() {
Address obj = new Address();
String var1 = obj.getName();
boolean var2 = false;
System.out.println(var1);
}
decompile 한 코드이다. getName()이라는 함수를 만들지 않아도 자동으로 만들어 사용한다.
class Address{
var name: String = "Kotlin"
get(){
return field
}
set(value) { field = value }
}
사실은 이러한 형태의 class가 사용되는 것이다.
프로퍼티는 초기화를 해줘야 한다.
그리고 getter에서 타입을 추론할 수 있는 경우에는 프로퍼티의 타입을 생략할 수 있다.
Backing Fields
코틀린 클래스는 field를 가질 수 없다.
field는 예약어로 자동으로 만들어진다. 이를 automatic backing field라고 한다.
따라서 field는 프로퍼티의 accessor에서만 사용 가능하다.
이런 automatic backing field가 생성되는 조건이 있다.
- accessor 중 1개라도 기본 구현을 사용하는 경우
- custom accessor에서 field 식별자를 참조하는 경우
val isEmpty: Boolean
get() = this.size == 0
위와 같은 경우에는 read only 프로퍼티를 선언했기 때문에 setter는 정의할 수 없고 getter만 정의가 가능한데 field를 참조하지 않았기 때문에 backing field가 생성되지 않는다.
Backing Properties
implicit backing field방식이 맞지 않는 경우에는 backing property를 사용할 수 있다.
private var _table: Map<String, Int>? = null
public val table: Map<String, Int>
get(){
if(_table == null){
_table = HashMap()
}
return _table ?: throw AssertionError("null ")
}
Compile-Time Constants
const moodifier를 이용하여 컴파일 타임 상수를 만들 수 있다.
- Top-level
- object의 멤버
- String이나 프리미티브 타입으로 초기화된 경우
Late-Initialized Properties
일반적으로 프로퍼티는 non-null 타입으로 선언된다. non-null 타입 프로퍼티를 사용하고 싶지만, 생성자에서 초기화해줄 수 없는 경우가 있다. 이럴 때는 나중에 초기화될 것이라고 명시해 줘야 한다.
public class MyTest{
lateinit var subject: TestSubject
@SetUp fun setup(){
subject = TestSubject()
}
@Test fun test(){
subject.method()
}
}
- 클래스의 바디에서 선언된 프로퍼티만 가능
- 기본 생성자에서 선언된 프로퍼티는 불가능
- var 프로퍼티만 가능
- custom accessor가 없어야 한다.
- 프리미티브 타입이면 안된다.