코틀린 (Kotlin) 클래스와 프로퍼티 정리
코틀린의 클래스 사용
코틀린은 public 이 기본으로 생략 가능합니다.코틀린의 클래스 선언은 자바의 멤버변수 선언없이 아래와 같이 사용합니다.
class Person(val name: String, var isCareer: Boolean)
위 코드는 자바에서 Person 클래스안에 String name과 boolean isCareer 멤버변수가 있는것과 같습니다.
프로퍼티 선언
코틀린에서는 자바의 private String name 을 프로퍼티라고 합니다.
class Person(
val name: String, //읽기 전용 val
var isCareer: Boolean //쓸수있는 var
)
val name: String, //읽기 전용 val
var isCareer: Boolean //쓸수있는 var
)
val 프로퍼티
- 읽기 전용 프로퍼티
- private name: String 프로퍼티 생성
- public getName() : String 함수 생성
- 쓰기 가능 프로퍼티
- private isCareer: Boolean 프로퍼티 생성
- public isCareer() 함수 생성
- public setCareer() 함수 생성
val person = Person("zerogdev", true)
person.name //getter() 사용(자바-> person.getName() )
person.isCareer = false //setter() 사용(자바-> person.setCareer(false) )
person.name //getter() 사용(자바-> person.getName() )
person.isCareer = false //setter() 사용(자바-> person.setCareer(false) )
자바 코드에 setter(), getter() 가 있는경우에는 var 처럼 사용되고 getter() 만 존재하는경우 val 처럼 사용합니다.
프로퍼티 - val 커스텀 접근자
클래스의 프로퍼티는 위에서 본것처럼 기본으로 생성되는 getter/setter 를 생성해주만, 커스텀한 getter/setter 를 생성할 수 있습니다.
class Rectangle(val height: Int, val width: Int) {
val isSquare: Boolean
get() { //프로퍼티에 대한 getter() 커스텀 접근자
return height == width
}
val isNotSquare: Boolean
get() = height != width //식으로 가능
}
val isSquare: Boolean
get() { //프로퍼티에 대한 getter() 커스텀 접근자
return height == width
}
val isNotSquare: Boolean
get() = height != width //식으로 가능
}
프로퍼티 isSquare 에 get() { ... } 를 사용하면 getter 를 커스텀하게 구현할 수 있습니다.
val 은 읽기전용이기때문에 get() 만 사용가능합니다.
var 는 set(..) 도 가능합니다.
isNotSquare 프로퍼티처럼 블럭( {...} ) 없이 = 으로도 사용할 수 있습니다.
isSquare 와 isNotSquare는 isSquare 와 isNotSquare 는 멤버변수가 생성되지 않는데 field 예약어가 사용되지 않았기 때문입니다.
프로퍼티 - var 커스텀 접근자
프로퍼티의 경우 아래처럼 프로퍼티를 직접 구현 할 수 있습니다.
class Rectangle(val height: Int, val width: Int) {
var weight: Int = 0
set(value) {
field = value + 10
}
get() = field - 10
}
var weight: Int = 0
set(value) {
field = value + 10
}
get() = field - 10
}
var 프로퍼티는 set(), get() 모두 구현해야 합니다.
get() 의 field 는 예약어로 값 자체를 가리킵니다.
weight는 setter 와 getter 함수가 생성되고 멤버변수가 생성됩니다.
프로퍼티 - 클래스에 멤버변수 직접 선언하기
자바 클래스 멤버변수처럼 직접 멤버변수처럼 프로퍼티를 선언할 수 있습니다.
class Rectangle(val height: Int, val width: Int) {
var area: Int = height //초기화 필요
var volume: Int = 0 //초기화 필요
}
var area: Int = height //초기화 필요
var volume: Int = 0 //초기화 필요
}
var/val 로 멤버변수 영역에 초기화와 함께 선언하면, 멤버변수가 생성되고 getter 와 setter 가 자동 생성됩니다.
프로퍼티 - 클래스 데이터 직접 구현
클래스 이름 옆에 프로퍼티를 작성하는데 val/var 를 붙이면 자동으로 getter/setter 가 생성합니다.하지만, 프로퍼티의 getter 와 setter 를 직접 구현하고 싶은 경우가 있습니다.
이 경우에는 val/var 를 붙이지 않으면 자동으로 생성되지 않습니다.
아래 코드에서 생성자 파라메터인 height 는 getter/setter 가 없기때문에 height 를 접근할수도 사용할 수도 없습니다.
그래서 height 가 사용할 수 있도록 위 코드처럼 직접 구현해야 됩니다.
val height: Int = height 처럼 넘겨받은 값으로 프로퍼티를 초기화합니다.
그리고 get() = field + 1 으로 커스텀하게 getter() 를 구현할 수 있습니다.
class Rectangle(val height: Int, val width: Int) {
val height: Int = height //초기화 필요
get() = field + 10
}
val height: Int = height //초기화 필요
get() = field + 10
}
프로퍼티 접근자 가시성 변경
setter 커스텀 접근자에 가시성을 변경할 수 있습니다.예를 들어 setter 에 private 를 설정하면 외부에서 setter 를 호출할 수 없습니다.
getter 커스텀 접근자는 프로퍼티와 같은 가시성을 갖습니다
public 인 프로퍼티에 private get 은 불가능합니다.
//접근자의 가시성
//기본적으로 프로퍼티의 가시성과 같지만 변경가능하다
class LengthCounter {
private var p: Int = 0 //private 접근자는 외부 접근 할수 없음
var counter: Int = 0
private set //외부에서 setter 접근할 수 없음
var total : Int = 0
private set(v : Int) {
field += v
}
private get //Error!!! get 은 프로퍼티와 같은 가시성을 갖는다
fun addWord(word: String) {
counter += word.length //내부에서 counter.set() 접근 가능
total = counter //내부에서 total.set() 접근 가능
}
}
//사용
val lengthCounter = LengthCounter()
lengthCounter.addWord("zerog")
lengthCounter.addWord("zerogdev")
Log.d("${lengthCounter.total}") //getter 호출
lengthCounter.counter = 0 //컴파일 에러 setter 접근 불가
lengthCounter.total = 1 //컴파일 에러 setter 접근 불가
//기본적으로 프로퍼티의 가시성과 같지만 변경가능하다
class LengthCounter {
private var p: Int = 0 //private 접근자는 외부 접근 할수 없음
var counter: Int = 0
private set //외부에서 setter 접근할 수 없음
var total : Int = 0
private set(v : Int) {
field += v
}
private get //Error!!! get 은 프로퍼티와 같은 가시성을 갖는다
fun addWord(word: String) {
counter += word.length //내부에서 counter.set() 접근 가능
total = counter //내부에서 total.set() 접근 가능
}
}
//사용
val lengthCounter = LengthCounter()
lengthCounter.addWord("zerog")
lengthCounter.addWord("zerogdev")
Log.d("${lengthCounter.total}") //getter 호출
lengthCounter.counter = 0 //컴파일 에러 setter 접근 불가
lengthCounter.total = 1 //컴파일 에러 setter 접근 불가
*개인적으로 코틀린을 공부하면서 정리한 자료입니다. 수정 사항 및 이슈가 있는 경우 메일 부탁드립니다.
댓글
댓글 쓰기