티스토리 뷰

Android/Kotlin

Getter 와 Setter

취뽀가자!! 2019. 4. 27. 00:22

코틀린은 Getter와 Setter가 자동 생성됩니다. 예제를 보면서 이해해 봅시다.

class Person {
    var age: Int = 0

    val name: String

    // 생성자에서 이름을 받는다.
    constructor(name: String){
        this.name = name
    }
}

코틀린에서는 var로 선언하는 변수는 Getter, Setter 전부 생성되고, val로 선언하는 변수는 Getter만 선언됩니다. 

 

테스트 코드를 작성하면서 확인해 봅시다.

class KotlinTest {
    @Test
    fun testGetterSetter() {

        // 코틀린의 Person 객체를 생성하고 이름을 "jwlee" 나이를 19으로 설정
        Person person = new Person("jwlee");
        person.setAge(19);

        // 설정한 값이 정상적인지 테스트
        Assert.assertEquals(19, person.getAge());
        Assert.assertEquals("jwlee", person.getName());
    }
}

이렇게 코틀린이 Getter, Setter를 자동으로 생성해 주는 이유는 소프트웨어를 개발하다 보면 꽤 많은 비중의 클래스가 특별한 로직 없이 단순히 데이터를 저장하는 용도로 사용되고, 그럴 경우 Getter와 Setter 코드는 뻔하기 때문입니다.

 

코틀린은 아예 생성자에서 값을 초기화하는 방법도 제공합니다.

class Person(val name: String) {

    var age: Int = 0

    var nickname: String = ""
}

var 키워드로 선언된 name은 어차피 생성자에서 초기화되어야 합니다. 사실 생성자 코드 역시 뻔하죠. 그래서 코틀린은 이처럼 클래스에 생성자와 속성을 같이 표현하는 방법을 제공합니다. 위의 코드는 맨 처음 작성한 코드와 완전히 같습니다.

 

이번에도 테스트 코드로 확인해 보겠습니다.

class KotlinTest {
    @Test
    fun testGetterSetter() {
        val person = Person("jwlee")

        // 코틀린은 age 를 직접 사용해도 자동으로 setter 가 불린다.
        person.age = 19

        // 설정한 값이 정상적인지 테스트
        // 마찬가지로 직접 프로퍼티 접근해도 자동으로 getter 가 불린다.
        Assert.assertEquals(19, person.age)
        Assert.assertEquals("jwlee", person.name)
    }
}

코틀린은 클래스의 프로퍼티에 직접적으로 값을 할당하거나 가져옵니다. 이렇게 해도 자동으로 Getter와 Setter가 호출됩니다.

 

자동으로 호출되는 Getter와 Setter 말고, 특정 기능을 추가하고 싶을 경우 다음과 같이 할 수 있습니다.

class Person(val name: String) {
    var age: Int = 0

    // 닉네임 - 소문자만 허용
    var nickname: String = ""
        set(value) {
            // field 는 Setter 의 대상이 되는 field 를 의미
            field = value.toLowerCase()
    }
}

코틀린은 java처럼 'this.nickname = nickname'으로 바로 접근하지 않고 field라는 키워드를 쓰고 있습니다. field는 Setter 메서드 내의 값을 적용할 영역을 의미합니다. 코틀린에서 이런 문법을 사용하는 이유는 코틀린은 Field를 사용하지 않고 Property를 사용하기 때문에 자동으로 Setter 혹은 Getter가 호출됩니다. 이럴 경우 setNickname() 메서드가 또 setNickname() 함수를 호출하게 되면서 StackOverFlow 에러를 발생시키게 되죠. 테스트 코드를 작성하면서 확인해 봅시다.

class Kotlin {
    @Test
    fun testSetNickname() {
        val person = Person("jwlee")
        // 대문자가 포함된 문자열을 닉네임으로 설정해도 소문자로 저장한다.
        person.nickname = "Banana"
        // 대문자가 포함된 문자열이 소문자로 되었는지 확인
        Assert.assertEquals("banana", person.nickname)
    }
}

결국 코틀린은 클래스의 프로퍼티 접근자인 Getter와 Setter를 기본적으로는 자동으로 생성하고, 필요할 때만 코드를 작성하게 되는 것이죠.

'Android > Kotlin' 카테고리의 다른 글

클래스 위임  (1) 2019.04.28
클래스 상속  (0) 2019.04.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함