코딩하는 개굴이

[Kotlin] Kotlin <--> Java 클래스의 Getter, Setter 호출하기 본문

안드로이드/KOTLIN

[Kotlin] Kotlin <--> Java 클래스의 Getter, Setter 호출하기

개굴이모자 2023. 5. 7. 22:19
반응형

 

Java/Kotlin 이 함께 사용되는 프로젝트의 경우 상호간의 클래스 사용에 주저한 적이 있을 것이다.

두 언어는 컴파일러가 큰 어려움 없이 사용할 수 있도록 해주지만, 아래와 같이 명확하게 개념을 짚어두고자 한다. 

 

해당 내용은 fast campus 의 “실무 프로젝트로 배우는 Kotlin & Spring : 리팩토링부터 서비스 구현까지” 강의를 기반으로 작성되었음을 알립니다.


Java 에서 Kotlin 클래스의 Getter, Setter 호출하기

아래와 같은 Student.kt 로 클래스를 둔다고 가정하자.

class Student {
	var name: String? = null
	var id: Int? = null
	val age: Int = 10
	var grade: String? = null //접근 제어자를 사용하면 grade 에 대한 값을 변경하는 것은 Student 클래스 내부에서만 가능하다.
		private set

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

	@JvmField
	var nickname: String? = null
}

Java 에서는 Kotlin 클래스를 아래와 같이 사용한다.

public static void main(String[] args) {
	Student student = new Student();

	//가변 변수의 처리 -> set/get 을 사용한다.
	//kotlin 클래스의 프로퍼티 지정
	student.setName("스티브");
	student.setId(123);

	//kotlin 클래스의 값 가져오기
	System.out.println(student.getName());
	System.out.println(student.getId());

	//불변 변수의 처리
	//student.setAge(11); -> 불변 변수의 경우 내부적으로 setter를 생성해주지 않기 때문에, 컴파일에러가 발생한다.

	//접근제어가 걸려있는 변수의 처리
	//student.setGrade("2"); -> var 이지만 접근제어로 setter 가 걸려있으므로, 역시 컴파일 에러가 발생한다.
	student.changeGrade(2); //이렇게는 가능하다.
	System.out.println(student.getGrade());

	//코틀린의 프로퍼티를 자바로 변환할때는 getter/setter 로만 가능하지만
	//JVM field 라는 어노테이션을 자용하면 자바 프로퍼티로 접근할 수 있게 된다.
	student.nickname = "스티비";
	System.out.println(student.nickname);
}

 

Kotlin 에서 Java 클래스의 Getter, Setter 호출하기

public class Person {
	private String name;
	private String id;
	public String getName() { return name; }
	public void setName(String name) { this.name = name; }
	public String getUUId() { //실질적으로 변수/프로퍼티가 없는 getter
		return UUID.randomUUID().toString();
	}

	//kotlin 컴파일러는 get/set 이 짝일 경우에만 프로퍼티를 생성해주므로, 아래의 경우 프로퍼티형식으로 사용은 불가하다. 자바형으로는 가능하다.
	public String myId() { return id; }
	public void setId(String id) { this.id = id; }
}

위와 같은 자바 클래스를 kotlin 에서 사용한다고 가정하자. 

Kotlin 에서 Java 의 클래스를 사용할 수 있는 방법은 아래와 같다.

fun main() {
	//자바와 같이 set/get 하는 방법 -> 가능은 하지만 권장하지는 않음.
	val person1 = Person()
	person1.setName("토니")
	println(person1.name)

	//코틀린의 스타일 -> 직접적으로 프로퍼티를 접근한다. 자바 클래스를 사용할 때도 프로퍼티 문법을 사용할 수 있다.
	val person2 = Person()
	person2.name = "위도우"
	println(person2.name)

	//프로퍼티가 실질적으로 존재하지 않아도 함수의 시작이 Get 일 경우 프로퍼티처럼 사용할 수 있다.
	println(person2.uuid)
}
반응형
Comments