본문 바로가기
IT/Java & Kotlin

코틀린 Property (속성) : 데이터 캡슐화의 간편한 방법

by 큰공 2024. 4. 19.
728x90
반응형

Kotlin 에서 속성 (Property)에 대해서 들어 본적이 있는데, 이번 포스팅에서는 속성(Property) 뭔지 파헤쳐 보도록 하겠습니다.

Property란 무엇인가요?

코틀린에서 Property는 클래스의 멤버로서 데이터를 캡슐화하고 외부에 노출할 때 사용됩니다. Property는 필드와 getter/setter 메서드를 한 번에 정의하는 편리한 방법을 제공합니다.

Property 선언 방법

코틀린에서 Property를 선언하는 방법은 간단합니다. 다음은 Property를 선언하는 예제입니다.

class Person {
    var name: String = "John" // 가변(mutable) Property 선언
    val age: Int = 30 // 불변(immutable) Property 선언
}

단순히 코드 상으로 봤을 때, Java에서 사용하는 Class 내부의 멤버변수와 차이가 없어 보이긴합니다. 하지만, getter와 setter를 자동으로 생성해준다는 눈에 보이지 않는 차이점이 있습니다./

Getter / Setter

코틀린에서는 클래스의 속성을 선언할 때 자동으로 게터(Getter)와 세터(Setter)를 생성해줍니다. 이것은 프로퍼티(Property)를 사용하는 주요 이점 중 하나입니다. 자동으로 생성된 게터와 세터를 통해 클래스의 속성을 읽고 쓸 수 있으며, 필요한 경우에는 커스텀 로직을 추가할 수도 있습니다. 아래에서는 코틀린에서 게터와 세터가 어떻게 자동으로 생성되는지에 대해 상세히 설명합니다.

자동 생성 규칙

코틀린에서는 다음과 같은 규칙에 따라 게터와 세터가 자동으로 생성됩니다.

  • var 키워드로 선언된 가변(mutable) 프로퍼티의 경우에는 자동으로 게터와 세터가 생성됩니다.
  • val 키워드로 선언된 불변(immutable) 프로퍼티의 경우에는 자동으로 게터만 생성됩니다.

Java와 비교

위의 Kotlin 으로 작성된 코드를 Java 와 비교하면 아래 코드와 같습니다.

public class Person {
    private String name = "John"; // 가변(mutable) Property 선언
    private final int age = 30; // 불변(immutable) Property 선언

    // 가변(mutable) Property인 name의 getter와 setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // 불변(immutable) Property인 age의 getter
    public int getAge() {
        return age;
    }
}

위의 Java 코드에서는 Kotlin의 Property를 Java에서는 멤버 변수와 메서드로 나누어서 구현하였습니다.

Kotlin에서는 프로퍼티를 선언하면 컴파일러가 자동으로 getter와 setter를 생성해주지만, Java에서는 이러한 기능이 없기 때문에 직접 getter와 setter 메서드를 작성해주어야 합니다.

또한, Kotlin의 val 키워드로 선언된 불변(immutable) Property는 Java에서는 final 키워드를 사용하여 상수로 선언됩니다.

age 는 상수로써 get 만 가능하고 set은 불가능하게 됩니다.

속성(Property의 활용)

Property는 클래스의 속성을 효율적으로 관리하고, 코드를 간결하게 만드는 데 사용될 수 있습니다. 예를 들어, 다음은 Property를 사용하여 Person 클래스의 이름을 변경하는 예제입니다.

fun main() {
    val person = Person()
    println("기본 이름: ${person.name}")
    person.name = "Alice"
    println("변경된 이름: ${person.name}")
}

동일한 역할을 하는 Java 코드도 살펴보도록 하겠습니다.

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println("기본 이름: " + person.getName());
        person.setName("Alice");
        System.out.println("변경된 이름: " + person.getName());
    }
}

person class 의 멤버변수는 private로 선언되어서 기본적으로 바로 접근이 불가능합니다. 이에 Java에서는 set, get 메소드를 직접 만들어서 사용하게 됩니다.

 

Kotlin 에서는 이런 set, get 메소드가 자동으로 생성이되어서, person.name 과 같이 해당 속성을 그대로 사용할수도 있고, person.name = "Alice" 와 같이 속성에 바로 문자열을 대입할 수 도 있습니다.

Backing Field

코틀린은 Property의 내부 구현에 사용되는 Backing Field를 자동으로 생성합니다. 이는 기본적으로 Property 값을 저장하는 데 사용됩니다.

 

예를 들어, 다음과 같은 코틀린 클래스가 있다고 가정해봅시다:

class Person {
    var name: String = "John"
}

위의 코드에서는 name이라는 프로퍼티를 선언했습니다. 코틀린 컴파일러는 이 프로퍼티에 대해 자동으로 다음과 같은 게터와 세터를 생성합니다:

class Person {
    private var _name: String = "John"

    var name: String
        get() = _name
        set(value) {
            _name = value
        }
}

위 두 코드는 사실상 같은 코드라고 보는게 맞습니다.

 

코틀린에서는 프로퍼티의 값을 저장하기 위한 내부적인 변수인 _name이라는 이름의 backing field를 사용합니다. 이 backing field를 통해 실제 값을 저장하고 게터와 세터에서 이 backing field에 접근하여 값을 가져오거나 설정합니다.

 

따라서, 코틀린에서는 간단한 프로퍼티를 선언하더라도 컴파일러가 내부적으로 getter와 setter를 생성하여 사용자가 getter와 setter를 명시적으로 작성하지 않아도 됩니다. 이는 코드를 간결하게 작성할 수 있게 해주고, 일관된 방식으로 프로퍼티를 다룰 수 있도록 합니다.

교육자료

https://developer.android.com/codelabs/basic-android-kotlin-compose-classes-and-objects?hl=ko#4

 

Kotlin에서 클래스 및 객체 사용  |  Android Developers

Kotlin에서 클래스 및 객체의 사용 방법을 알아봅니다.

developer.android.com

결론

코틀린에서의 속성은 클래스 본문에 정의된 변수이다.

728x90
반응형

댓글