Kotlin

[android : kotlin] 코틀린 게터와 세터(get, set) 사용법 및 예제

자바 언어의 경우 게터(Getters)와 세터(Setters)를 직접 구현해야한다. 클래스 내에 선언한 필드가 많아지게되면 노가대성 코딩이 따로 없다. 하지만 다행스럽게도 이클립스 툴에서 자동 생성 기능을 지원함으로 문제가 되지는 않는다.

코틀린 게터와 세터(get, set) 사용

코틀린에서는 이런 번거로운 작업을 하지 않아도 된다. 변수를 만들면 자동으로 getters와 setters를 내부적으로 생성해준다. 눈에 보이지 않으니 참고!!! var로 선언한 변수의 경우 게터와 세터를 모두 생성해주며, val로 생성한 경우에는 값을 변경할 수 없음으로 게터(Getters)만 내부적으로 자동 생성된다.

val과 var의 차이점을 모른다면 아래글을 참고하여 확인하기 바란다.

[kotlin]코틀린 findViewById() 사용하는 방법(Java랑 다르다)

fun main() {
  
    //println(UserInfo("홍길동").name)     
    println(UserInfo("아이유","서울시...").company) 
    
}
  
class UserInfo {   
    
    //아래 클래스의 멤버변수는 모두 게터와 세터가 내부적으로 자동으로 생성된다.
    var name: String  //클래스의 멤버 변수(게터,세터 생성)
    var address: String  //클래스의 멤버 변수(게터,세터 생성)
    var phone: String  //클래스의 멤버 변수(게터,세터 생성)
    var sex: Int  //클래스의 멤버 변수(게터,세터 생성)
    val company: String = "UB"  //게터만 생성됨
    
    //생성자 오버로드
    constructor(_name: String, _address: String="없음", _phone: String="없음", _sex: Int = 1) {
        this.name = _name
        this.address = _address
        this.phone = _phone
        this.sex = _sex 
        this.company = "ghgh"  //값을 설정할수 없음으로 오류발생함 (Val cannot be reassigned)
    } 
}

데이터를 개조하여 가져오고 싶을 경우에는 게터(Getters)를 변경해야 한다.  이때 field 키워드를 사용하여 get()와 set() 내부에서 속성값을 직접 가져오거나 변경이 가능하고, 내부에서 게터와 세터가 호출되지 않도록 해줌으로 속성을 참조할 때 발생하는 재귀 호출을 막을 수 있다.

fun main() { 
    val userInfo = UserInfo("IU","서울시...")
    println("사용자명 : ${userInfo.name}")
    println("주소 : ${userInfo.address}")
    
    val userInfo2 = UserInfo("홍길동","서울")
    println("사용자명2 : ${userInfo2.name}")
    println("주소2 : ${userInfo2.address}")
}
  
class UserInfo {

    public var name: String
        get() {
            return if (field == "IU") "아이유는 사랑입니다."
            else field
        }
    public var address: String
    	set(value) {
            if(value == "서울") field = "서울시 강동구 암사동"
            else field = value
        }
    public var phone: String
    public var sex: Int


    constructor(_name: String, _address: String = "없음", _phone: String = "없음", _sex: Int = 1) {
        this.name = _name
        this.address = _address
        this.phone = _phone
        this.sex = _sex
    }
}

[출력결과]

사용자명 : 아이유는 사랑입니다.
주소 : 서울시...
사용자명2 : 홍길동
주소2 : 서울시 강동구 암사동

[REFERENCE]

코틀린공식문서 Properties and Fields

Leave a Reply

error: Content is protected !!