코틀린 (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 프로퍼티
  • 읽기 전용 프로퍼티
  • private name: String 프로퍼티 생성
  • public getName() : String 함수 생성
var 프로퍼티
  • 쓰기 가능 프로퍼티
  • private isCareer: Boolean 프로퍼티 생성
  • public isCareer() 함수 생성
  • public setCareer() 함수 생성
코틀린에서 클래스만 생성하면 멤버변수와 setter/getter 가 자동으로 생성되어 아래처럼 바로 사용할 수 있습니다.

val person = Person("zerogdev", true)
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 //식으로 가능
}

프로퍼티 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 프로퍼티는 set(), get() 모두 구현해야 합니다.
get() 의 field 는 예약어로 값 자체를 가리킵니다.
weightsetter getter 함수가 생성되고 멤버변수가 생성됩니다.

프로퍼티 - 클래스에 멤버변수 직접 선언하기

자바 클래스 멤버변수처럼 직접 멤버변수처럼 프로퍼티를 선언할 수 있습니다.

class Rectangle(val height: Int, val width: Int) {
    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
}

프로퍼티 접근자 가시성 변경

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 접근 불가


*개인적으로 코틀린을 공부하면서 정리한 자료입니다. 수정 사항 및 이슈가 있는 경우 메일 부탁드립니다.

댓글

이 블로그의 인기 게시물

코틀린 (Kotlin) filter, map, all, any, count, find, groupBy, flatMap 함수 정리

코틀린 (Kotlin) 인터페이스 정리

RecyclerView 에서 notifyItemChanged()의 payload 이해하기