신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

들어가기 앞서, 클래스에 대한 간단한 개념을 알아야하는데, 우리가 클래스를 사용할 때는... 내부의 데이터를 캡슐화(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함수가 만들어집니다.

 

 

사용법

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)

 

코틀린의 메소드 사용방법(Kotlin)

코틀린에서 메소드를 만드는 방법을 알아보고, 반환값이 있는 메소드 생성하는 법과 반환값이 없는 메소드 생성하는 법을 살펴본다. 그리고, 자바와 달리 코틀린에서만 사용가능한 메소드 정의 법(식이 문장인 메..

hongku.tistory.com

2019/02/06 - [Language/Kotlin] - 코틀린의 문자열 템플릿(Kotlin String Templates)

 

코틀린의 문자열 템플릿(Kotlin String Templates)

코틀린에는 문자열 템플릿이란 것이 있습니다. 문자열 안에서 외부에 있는 변수를 가져올 수 있는 방법입니다. 예를들어서 Java에서 "Hello, Kotlin!"을 찍어본다고 합시다. (이때 "Kotlin"은 name이라는 변수에..

hongku.tistory.com

2019/02/05 - [Algorithm/백준 온라인 저지] - 백준 10172번 개, 코틀린으로 풀어보기

 

백준 10172번 개, 코틀린으로 풀어보기

해당 문제는 직접 풀어보고 작성한 글 입니다. 궁금한점이 있거나 더 효율적인 방법으로 푸는 방법이 있다면 댓글로 알려주세요~ 코드와 풀이는 아래에 있습니다. 문제를 아시는분은 문제설명을 생략하고 아래쪽에..

hongku.tistory.com

2019/02/07 - [Algorithm/백준 온라인 저지] - 백준 2438번 별찍기, 코틀린으로 풀기

 

백준 2438번 별찍기, 코틀린으로 풀기

해당 문제는 직접 풀어보고 채점도 마친 뒤에 작성한 글입니다. 궁금한점이 있거나, 틀린부분(?) 또는 효율적인 부분이 있다면 댓글로 알려주세요. 문제 풀이는 아래에 위치해 있습니다. 문제를 알고 있다면, 생략..

hongku.tistory.com

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기