신규 블로그를 만들었습니다!
들어가기 앞서, 클래스에 대한 간단한 개념을 알아야하는데, 우리가 클래스를 사용할 때는... 내부의 데이터를 캡슐화(encapsulate)하고, 캡슐화한 데이터를 다루는 코드를 클래스라는 하나의 주체안에 가둬두기 위해 사용합니다. 즉, 필드(field)를 이용해서 데이터를 저장하고, 접근자 메소드(getter, setter)를 이용해서 데이터에 접근을 합니다.
참고. 프로퍼티
필드와 접근자 메소드를 하나로 합친것을 프로퍼티라 합니다.
Java에서 필드(Field)를 1개 생성할때 불편함은 없습니다. 하지만, 필드(Field)가 늘어날수록 만들어야 하는 getter, setter가 많아집니다. 코틀린에서는 이런 번거로운 작업을 하지 않도록 도와줍니다. 예를들어서 Java 코드와 Kotlin 코드에서 살펴봅시다.
Java에서 필드 생성하기
Person이라는 class를 만들고, name이라는 필드를 만들도록 하겠습니다.
public class Person {
private String name;
// constructor
public Person(String name){
this.name = name;
}
// get set method
public String getName() {
return this.name;
}
public void setName(String name){
this.name = name;
}
}
위와 같이 name이라는 필드를 만들고, getter와 setter, 생성자를 만듭니다. 이렇게 name이란 변수 하나에 코드가 20줄 가까이 나오게 됩니다. 하지만 Kotlin은 매우 간단합니다.
Kotlin에서 필드 생성하기
코드를 보면, 너무 짧아서 허탈함(?)과 동시에 매우 간단하다고 느낄 수 있습니다.
class Person(var name: String)
어떻게 한줄로 위의 자바코드를 다 표현하는것인가? 궁금하실 수 있습니다. 코틀린에서는 위와같이 변수를 만들어주기만해도, getter와 setter를 내부적으로 생성해줍니다. 그래서, 개발자가 따로 만들어줄 번거로움이 사라집니다.
그리고, Kotlin에서는 기본적으로 scope(범위)가 public입니다. 그래서, Java처럼 class앞에 public을 따로 써주지 않아도 됩니다. 즉, 생략이 가능합니다. 내부 name이란 필드는 private 으로 생성이 됩니다.
다른 예제를 살펴봅시다...
1
2
3
4
5
|
class Person2(
val name: String, // 읽기 전용 프로퍼티로 private field와 public getter 함수를 생성한다.
var age: Int, // 쓰기도 가능한 프로퍼티로 private field와 public getter, public setter 함수를 생성한다.
var isMerried: Boolean
)
|
cs |
name은 val로 선언하고, age와 isMerried는 var로 선언한 것을 확인 할 수 있습니다. val은 읽기 전용 변수로 immutable한 변수입니다. 반면 var는 쓰기도 가능한 변수로 mutable한 변수입니다. 그래서, val은 getter 함수만 만들어지고, var는 getter와 setter함수가 만들어집니다.
var와 val의 차이점을 모른다면?
2019/02/04 - [Language/Kotlin] - 코틀린의 변수 사용법 및 val과 var의 차이점
사용법
Java에서는 필드의 범위가 private하기 때문에, getter, setter를 이용해서 field에 접근합니다. 예를들어, name이라는 필드가 있을때, getName()이라는 메소드와 setName()이라는 메소드를 이용해서 데이터에 접근하죠.
Kotlin에서는 이렇게 만들어진 클래스를 사용할 때, 어떻게 사용할까요?
class Person(
val name: String,
var age: Int,
var isMerried: Boolean
)
fun main(args: Array<String>){
val person = Person("Hongku", 27, true)
person.isMerried = false
println("Name : ${person.name}")
println("Age : ${person.age}")
println("isMerried : ${person.isMerried}")
}
위와 같이 그냥 객체안의 변수를 사용하듯이 편하게 사용하면 됩니다. 사실 보기에는 getter, setter를 사용하지 않는것처럼 보이지만 내부적으로는 getter, setter를 이용하는 것과 같습니다.
실행 결과
Name : Hongku
Age : 27
isMerried : false
커스텀 접근자 만들기
하지만, 개발자가 원하는대로 접근자 메소드를 만들고 싶을 수 도 있습니다. 이때 어떻게 접근자 메소드를 생성하는지 살펴봅시다.
class Rectangle(val height: Int, val width: Int){
val isSquare: Boolean
get(){
return height == width
}
}
위와 같이, getter 메소드를 만들 수 있습니다. setter 메소드도 똑같이 set(){}을 이용해서 생성 할 수 있습니다.
정리하면...
var <propertyName> [: <propertyType>]
[<getter>]
[<setter>]
본 글은 Dmitry Jemerov, Svetlana Isakova의 "Kotlin in action" 책을 참고하여 작성한 글입니다.
다른 글
2019/02/04 - [Language/Kotlin] - 코틀린의 메소드 사용방법(Kotlin)
2019/02/06 - [Language/Kotlin] - 코틀린의 문자열 템플릿(Kotlin String Templates)
2019/02/05 - [Algorithm/백준 온라인 저지] - 백준 10172번 개, 코틀린으로 풀어보기
2019/02/07 - [Algorithm/백준 온라인 저지] - 백준 2438번 별찍기, 코틀린으로 풀기
'Language > Kotlin' 카테고리의 다른 글
코틀린, enum class와 when 사용하기 (0) | 2019.02.11 |
---|---|
코틀린의 enum class 사용방법 (0) | 2019.02.10 |
코틀린의 문자열 템플릿(Kotlin String Templates) (0) | 2019.02.06 |
코틀린의 변수 사용법 및 val과 var의 차이점 (0) | 2019.02.04 |
코틀린의 메소드 사용방법(Kotlin) (0) | 2019.02.04 |
최근댓글