개발이 취미인 사람

[Kotlin] 클래스 Getter & Setter 본문

언어(Programming Language)/Kotlin

[Kotlin] 클래스 Getter & Setter

RyanSin 2021. 3. 2. 16:35
반응형

- 개요

안녕하세요. 이번 시간에는 코틀린에서 Getter & Setter에 대해 알아보겠습니다.

 

우리는 자바에서 클래스를 만들고 해당 변수에 접근을 할 때 우리는 Getter & Setter 메서드를 만들어서 사용했습니다.

 

//자바
public class Person {
    
    private String name;
    private int age;
    
    //생성자
    public Person(String name, int age){
        
        this.name = name;
        this.age = age;
    }

    /**
     * Getter & Setter
     */
    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

public class MyClass {

    public static void main(String[] args){

        Person person = new Person("개발이 취미인 사람", 24);

        System.out.println("이름 : "+person.getName());
        System.out.println("나이 : "+person.getAge());

        /**
         * 실행 결과
         * 
         * 이름 : 개발이 취미인 사람
         * 나이 : 24
         */
    }
}

 

코틀린에서는 Getter & Setter 메서드를 컴파일 시 생성합니다.(즉! 우리가 직접 메서드를 만들지 않아도 됩니다.)

 

지금부터 알아보겠습니다.

 

코틀린에서 기본적으로 클래스 생성 시 기본 생성자를 정의합니다.(사실 정의 안 하고 사용해도 됩니다.)

 

//코틀린 클래스 생성
class Person(var name: String, var age: Int)

 

소괄호 안에 해당 클래스에 속성을 정의합니다.

 

여기서 우리가 고려해야 될 부분은 var, val 그리고 아무것도 정의를 안 했을 때(var 또는 val 선언 안 함) 코틀린에서는

내부적으로 어떻게 동작하는지 알아야 합니다.

 

자료형, 변수, 상수 개념을 잘 이해하고 있다면 어렵지 않습니다. 혹시 개념을 잘 이해 못 하셨다면 아래 링크를 통해

학습하고 오시는 걸 추천드립니다.

any-ting.tistory.com/55

 

[Kotlin] 자료형, 변수, 상수 개념 및 사용법

- 개요 안녕하세요. 이번 시간부터 코틀린에 기본 문법에 대해 알아보겠습니다. InteliJ IDEA 개발 환경을 혹시 세팅하지 못하신 분들은 아래 링크를 통해 세팅하고 오시는 걸 추천드리겠습니다. any

any-ting.tistory.com

 

코틀린에서는 선언 방식에 따라 Getter, Setter 생성 유무를 판단합니다.

 

클래스 선언 Getter 생성 Setter 생성 유형
class Person(name: String) X X 생성자 매개변수
class Person(var name: String) O O 속성
class Person(val name: String) O X 속성

 

- 매개변수 선언 방식

class Person(name: String, age: Int)

표와 동일하게 코드를 만들어 Person 클래스에 name을 호출하려고 해도 안됩니다.

 

Unresolved reference: name 에러를 발생합니다.(확인되지 않은 참조: name)

 

그럼 var와 val은 어떻게 될까요?

 

- var & val 선언 방식

class Person(var name: String, val age: Int)

 

name 속성은 var로 age 속성은 val로 선언하고 테스트를 해보겠습니다.

 

fun main(){

    var person = Person("개발이 취미인 사람", 24)

    println("변경 전")
    println(person.name)
    
    
    person.name = "Ryan"
    
    println()
    println("변경 후")
    println(person.name)
    
    /**
     * 실행 결과
     * 변경 전
     * 개발이 취미인 사람
     * 
     * 변경 후
     * Ryan
     */
    
}

var로 선언한 name 속성 값은 참조할 수 있으며, 변경도 가능합니다. (읽기 & 쓰기 모두 가능)

 

그럼 val로 선언한 속성은 어떻게 될까요?

 

값을 변경하려고 하면 Val cannot be reassigned 에러를 발생합니다.

 

즉, val는 재할당이 불 가능하다는 에러입니다.

 

당연한 상황이긴 하지만 코틀린에서는 선언 방식에 따라 Getter & Setter 메서드를 생성합니다.

 

- 코틀린 클래스 자바에서 호출 & 자바 클래스 코틀린에서 호출

코틀린 클래스를 만들고 자바에서 호출할 때

 

기본적인 Getter & Setter을 생성할 때 만들어지는 변수가 적용됩니다.

 

//코틀린 클래스
class Person(var name: String, var isAge: Int)

 

//자바 호출
public static void main(String[] args){

	Person person = new Person("개발이 취미인 사람", 24);

	person.getName();
	person.isAge();

	person.setName("Ryan");
	person.setAge(12);

}

 

"is"라는 키워드를 앞에 붙여서 생성하지 않았다면 기본적인 getName() 형태로 호출할 수 있습니다.

 

"is"키워드를 붙이면 isAge()처럼 호출이 가능합니다.

 

자바 클래스를 만들고 코틀린에서 호출할 때

 

//자바 클래스

public class Person {

    private String name;
    private int isAge;

    //생성자
    public Person(String name, int isAge){

        this.name = name;
        this.isAge = isAge;
    }

    /**
     * Getter & Setter
     */
    public String getName() {
        return name;
    }

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

    public int getIsAge() {
        return isAge;
    }

    public void setIsAge(int isAge) {
        this.isAge = isAge;
    }
}

동일하게 호출하면 됩니다. :) 어렵지 않죠??

 

- 커스텀 Getter & Setter

코틀린에서 Getter과 Setter를 호출할 때 특정 연산을 할 수 있습니다.

 

class Person(name: String, age: Int){

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

        field = value
    }

    var age: Int = age
    get() {
        return age + 12
    }
    set(value){
        
     //여기서 field = age 초기 값을 나타냅니다.
     field = value
    }
    
}

 

get() = 을 통해 고정적인 값을 반환을 할 수 있지만, get(){ 연산 로직 작성 } 중괄호 안에 연산이 필요한 코드를 적용할 수도 있습니다.

 

이번 시간에는 Getter와 Setter에 대해 알아봤습니다.

 

감사합니다. :)