이번에는, 코틀린에서 클래스 선언하는 기본 문법을 살펴보고,
코틀린을 활용하면, 더 적은 양의 코드로 클래스와 관련 있는 대부분의 작업을 수행할 수 있다는 사실을 알아보고자 합니다.
/** 자바 클래스 Person */
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
자바에서는 필드가 둘 이상으로 늘어나면 생성자인 Person(String name)의 본문에서 파라미터를 같은 필드에 대입하는 대입문의 수도 늘어나게 되는데, 코틀린에서는 그런 필드 대입 로직을 훨씬 더 적은 코드로 작성할 수 있습니다.
/** 코틀린으로 변환한 Person 클래스 */
class Person(val name: String)
엄청나게 간결하지 않나요?
이런 유형의 클래스(코드 없이 데이터만 저장하는 클래스)를 값 객체라고 부르며, 다른 최신 언어에서도 값 객체를 간결하게 기술할 수 있는 구문을 제공하고 있습니다.
물론, 인텔리J 기반 IDE에서 제공해주는 Generator를 이용하면, 손쉽게 Constructor, Setter/Getter를 자동 생성해주기 때문에, 큰 메리트가 없다고 생각되긴 하지만... 가독성 측면에서는 나름 괜찮은 것 같습니다 ㅎㅎ
프로퍼티
우리가 이미 분명히 알고 있는 클래스라는 개념의 목적은, 데이터를 캡슐화 하고, 캡슐화한 데이터를 다루는 코드를 한 객체 아래 가둬두는 것입니다.
자바에서는, 데이터를 필드(field)에 저장하며, 멤버 필드의 접근자는 보통 비공개(private)로 선언합니다.
클래스는 자신을 사용하는 클라이언트가 그 데이터에 접근하는 통로로 쓸 수 있도록, 접근자 메소드를 제공하는데,
이는 보통 데이터를 읽기 위한 게터(getter)와, 데이터를 변경하게 허용하는 세터(setter)를 말할 수 있습니다.
자바에서는 이러한 필드와 접근자를 프로퍼티(property)라고 부릅니다.
코틀린은 프로퍼티를 언어 기본 기능으로 제공하며, 코틀린 프로퍼티는 자바의 필드와 접근자 메소드를 완전히 대신합니다.
프로퍼티를 선언할 때는, 이전 포스팅의 변수 선언 방법과 마찬가지로, val이나 var를 사용합니다.
val로 선언한 프로퍼티는 읽기 전용이며, var로 선언한 프로퍼티는 변경 가능합니다.
class Person (
//읽기 전용 프로퍼티로, 비공개 필드와 읽기 전용의 게터(getter)를 만들어낸다.
val name: String,
//변경 가능한 프로퍼티로, 비공개 필드와 게터(getter)/세터(setter)를 만들어낸다.
var age: Int
) //값객체 정의로, 괄호로 묶은것에 유의해주세요!
위와 같이, 코틀린은 값을 저장하기 위한 비공개 필드와 그 필드에 값을 저장하기 위한 세터(setter), 값을 읽기 위한 게터(getter)로 이뤄진 간단한 디폴트 접근자 구현을 제공합니다.
이렇게 선언한 코틀린 클래스는, 어떤 언어(자바 or 코틀린)로 정의했는지에 관계없이 자바 클래스와 코틀린 클래스를 동일한 방식으로 사용할 수 있습니다.
/** 자바에서 Person 클래스를 사용하는 방법 */
Person person = new Person("안드로이드", 10);
System.out.println(person.getName());
System.out.println(person.getAge());
person.setAge(20);
/** 코틀린에서 Person 클래스를 사용하는 방법 */
val person = Person("안드로이드", 10) //new 키워드를 사용하지 않고, 생성자를 호출한다.
println(person.name) //프로퍼티 이름을 직접 사용해도 코틀린이 자동으로 게터를 호출해준다.
println(person.age)
person.age = 20
커스텀 접근자
앞에서 다룬, 프로퍼티의 접근자 메소드(세터,게터)에 대해 커스텀할 순 없을까? 라는 의문이 생길 수도 있습니다.
그래서 이번에는, 프로퍼티 접근자를 직접 커스텀하는 방법에 대해 알아보려고 합니다.
예제로, 직사각형 클래스인 Rectangle을 정의하면서, 자신이 정사각형인지 알려주는 기능을 만들어보겠습니다.
직사각형이 자기가 정사각형인지를 별도의 필드에 저장할 필요가 없이, 사각형의 너비와 높이가 같은지만 검사하면 정사각형의 여부를 알 수 있을 것 같습니다.
class Rectangle(val width: Int, val height: Int) {
val isSquare: Boolean
get() { //프로퍼티 게터 선언
return width == height
}
}
/** 실제 사용 시 */
val rectangle = Rectangle(30, 40)
println(rectangle.isSquare)
>> false
위와 같이, 프로퍼티 바로 다음 라인에서 접근자 메소드(set / get)를 선언하여 접근자를 커스텀할 수 있음을 알아보았습니다.
'코틀린' 카테고리의 다른 글
코틀린(Kotlin) - 예외 처리 (0) | 2020.01.19 |
---|---|
코틀린(Kotlin) - 이터레이션 : while과 for 루프 (0) | 2020.01.19 |
코틀린(Kotlin) - when과 스마트 캐스트 (0) | 2020.01.12 |
코틀린(Kotlin) - 기본 요소 : 함수와 변수 (1) | 2019.12.23 |
코틀린(Kotlin) 을 해야하는 이유! (2) | 2019.12.18 |