안드 공부를 해볼까?

[Kotlin] 클래스와 프로퍼티 본문

문법/Kotlin

[Kotlin] 클래스와 프로퍼티

문바리 2022. 12. 21. 17:48
728x90

1. 개요

이 포스트는 Kotlin in Action을 기반으로 작성되었습니다.

지난 포스트는 코틀린의 변수와 함수를 간단하게 배웠습니다.

이번 포스트는 코틀린에서의 클래스와 프로퍼티를 배우겠습니다.

2. 목차

- 코틀린에서의 클래스

- 프로퍼티

- 접근자 커스텀하기

3. 본문

1. 코틀린에서의 클래스

먼저 자바에서의 클래스를 생각해보겠습니다.

public class Student {
    public final String name;
    public final int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

클래스 내부에 프로퍼티들이 있고 생성자가 있습니다. 이것을 코틀린으로 바꿔보면..

class Student constructor(
    val name : String,
    var age : Int
)

끝입니다!

코틀린은 자바와 다르게 생성자를 클래스 옆에 바로 적을 수 있습니다.

이를 주생성자라고 합니다.(constructor는 생략가능)

또한 자바에서 일일이 다 적어야하는 접근자 또한 간단하게 처리 가능합니다.

2. 프로퍼티

클래스라는 개념의 목적은 데이터를 캡슐화 하고 캡슐화한 데이터를 다루는 코드를 한 주체 아래 가두는 것입니다.

그래서 자바에서 접근자를 사용할 때 변수의 접근 제어자는 private, 가져오는 메소드는 public으로 만들었죠.

 

코틀린에서는 접근자와 필드를 프로퍼티라고 합니다.

마찬가지로 val은 읽기전용, var은 읽고 쓰고 둘다 가능합니다.

class Student (
    // val은 접근자만 생성된다
    val name : String,
    // var은 접근자, 설정자 둘다 생성된다.
    var age : Int
)

클래스 내부에 따로 설정해주지 않으면 default로 생성됩니다.

fun main(args: Array<String>) {
    val bob = Student("Bob", 26)
    print(bob.name)
    // val이기 때문에 바꾸지 못한다.
    // bob.name = "ho"
    bob.age = 27
}

다음 예제를 보면 알 수 있습니다.

자바에서는 bob.getName()을 사용해야 했지만 코틀린에서는 default 접근자로 그냥 가져올 수 있습니다.

또한 객체 생성시 코틀린은 new를 사용하지 않습니다.

3. 접근자 커스텀 하기

앞서본 클래스를 활용하여 접근자를 커스텀해보겠습니다.

fun main(args: Array<String>) {
    val bob = Student("Bob", 26)
    val ho = Student("Ho", 18)

    print("bob은 고등학생일까? ${bob.isHighSchool}")
    print("ho는 고등학생일까? ${ho.isHighSchool}")
}

class Student (
    val name : String,
    var age : Int
){
    val isHighSchool : Boolean
    get() {
        return age in 17..19
    }
}

여기서 isHighSchool은 고등학생인지 판별하는 변수입니다.

변수 초기화를 안했지만 이 변수를 사용할 때, get() 내부 블럭에 있는 내용을 반환합니다.

따라서 위의 출력은 false, true가 나오게 됩니다.(${}은 문자열 템플릿 입니다.)

 

자바에서는 따로 메소드를 만들어서 isHighSchool()을 해야했을 것 입니다.

물론 코틀린도 사용할 수 있습니다. 성능이나 구현상에 차이가 거의 없습니다.

다만 일반적으로 프로퍼티를 정의하고 싶다면 프로퍼티로 보여줘야 하기 때문에 위와 같이 하는 것을 선호합니다.

4. 마무리

이번 포스팅은 클래스와 프로퍼티에 대해 학습했습니다.

클래스는 자바와 다르게 class 클래스 이름(프로퍼티 작성)으로 생성 가능합니다.

또한 다른 프로퍼티를 활용해서 새로운 프로퍼티를 생성한다면 get을 사용하여 커스텀하는 방법을 쓰는 것을 권장합니다.

반응형
Comments