실무 프로젝트로 배우는 Kotlin & Spring/JAVA 프로젝트에 코틀린 도입하기

Getter, Setter 호출하기

webmaster 2022. 10. 23. 17:24
728x90

JAVA에서 Kotlin Getter/Setter 호출하기

Student Kotlin 클래스

class Student {

    @JvmField
    var name: String? = null

    var birthDate: LocalDate? = null

    val age: Int = 10

    //var 키워드 setter 제거
    var grade: String? = null
        private set //클래스 내부에서만 setter를 사용할 수 있다

    fun changeGrade(grade: String) {
        this.grade = grade
    }
}

JAVA에서 호출하기

import java.time.LocalDate;

public class JavaGetterSetterExample {

  public static void main(String[] args) {
    Student student = new Student();
    //setter
    //student.setName("스티브로저스");
    //student.setBirthDate(LocalDate.of(1918, 7, 4));

    //getter
    //System.out.println(student.getName());
    //System.out.println(student.getBirthDate());

    //student.setAge(10);//컴파일 오류 //val 키워드로 선언한 프로퍼티는 setter가 없다.
    System.out.println(student.getAge());


    //student.setGrade(""); //var 키워드지만 private로 선언했기 때문에 외부에서 호출 x
    student.changeGrade("A"); //setter가 아닌 볊도의 메서드를 만들어서 값을 변경하는 방식으로 사용해야한다
    System.out.println(student.getGrade());


    //JVM 필드 사용
    student.name = "스티브로저스";
    System.out.println(student.name);
    //JVMfield를 사용하면 getter, setter를 통해서 접근하는 것이 아닌 프로퍼티로 접근해야한다
  }

}
  • 코틀린에서 val 키워드로 생성된 프로퍼티는 불변으로 JAVA에서 getter만 존재한다.
  • 코틀린에서 var 키워드로 생성된 프로퍼티는 가변으로 JAVA에서 getter, setter 모두 존재한다.
    • setter를 private 가시성으로 변경한다면, var로 선언하더라도 setter를 없앨 수 있고, 값을 변경하기 위해서는 내부에서만 변경하거나, 별도의 외부 접근 메서드를 만들어서 변경해야 한다.
  • @JvmField 사용하면, getter, setter를 쓰지 않고, 자바 프로퍼티로 접근이 가능하다.

Kotlin에서 JAVA Getter/Setter 호출하기

JAVA Person.class

import java.util.UUID;

public class Person {

  private String name;
  private int age;
  private String address;

  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 String myAddress() { //getter가 아닌 myAddress일 경우
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public String getUUID(){
    return UUID.randomUUID().toString();
  }
}

Kotlin에서 호출하기

fun main() {
    //자바 스타일 //IntelliJ에서도 경고 표기
    val person = Person()
    person.setName("토니스타크")
    person.setAge(44)
    person.setAddress("스타크타워")

    println(person.getName())
    println(person.getAge())

    //코틀린 스타일  => 프로퍼티처럼 사용해라
    val person2 = Person()
    person2.name = "토니스타크"
    person2.age = 44
    println(person2.name)
    println(person2.age)

    //프로퍼티가 없음에도 게터 메서드라면 프로퍼티처럼 사용 가능하다
    println(person.uuid) //메서드 시작이 get으로 시작하기 때문에 코틀린에서 프로퍼티처럼 사용가능

    //세터가 있음에도 컴파일 오류 발생
    //person2.address = "" //setter가 있지만, getter가 없으므로 코틀린 컴파일러가 만들어 주지 않는다

    //address를 가져오는 메서드를 게터가 아닌 my로 했기 때문에 세터도 생성되지 않는다
    person2.myAddress() //메서드를 직접 호출하는 방법밖에 없다.
}
  • Kotlin에서도 자바의 getter/setter를 호출할 때, 기존 자바의 스타일과 동등하게 사용할 수 있지만, 추천하지 않는다.
    • IntelliJ와 같은 IDE에서도, 프로퍼티 방식으로 호출하도록 경고(노란 밑줄)한다.
  • 프로퍼티가 없더라도, getter 메서드가 존재한다면, 프로퍼티처럼 사용 가능하다(getUUID)
  • setter가 있더라도, getter가 없을 경우, kotlin에서 setter를 호출하지 못한다(코틀린 컴파일러가 만들어주지 않는다)
    • 직접 만든 메서드를 호출해서 가지고 오는 방법 밖에 없다(myAddress)
728x90