최근 Spring에서 java → kotlin으로 Refactoring 하는 것에 무척이나 관심이 많아졌다. 그래서 오늘은 java가 kotlin으로 어떻게 변경될 수 있을지 알아보는 것으로 한 주를 시작해보려고 한다. 아주 기초적으로...
본 코드는 Fastcampus의
실무 프로젝트로 배우는 Kotlin & Spring : 리팩토링부터 서비스 구현까지
라는 강의 보고 작성되었습니다.
지금부터 할 것은 자바의 main method를 작동시키면서 getter, setter는 koltin으로 되어 있는 경우를 사용하는 코드이다.
kotlin으로 getter, setter를 구현하는 경우는 매우 간편하다. data class를 통해 hashCode나 equals, toString를 자동으로 구현하게 할 수 있지만, 단순히 getter, setter를 구현하는 것
이라면, kotlin의 class
를 사용해도 상관없다. 다음과 같이 말이다.
본래 kotlin의 코드는 다음과 같다.
import java.util.*
class Person {
var name: String? = null
var birthDate: LocalDate? = null
// LocalDate는 따로 import 해주어야 한다.
val age: Int = 10
}
위 코드를 java로 변경하면, 다음과 같이 바뀌게 된다.
import java.util.*
public final class Student {
@Nullable
private String name;
@Nullable
private LocalDate birthDate;
private final int age = 10;
@Nullable
public final String getName() {
return this.name;
}
public final void setName(@Nullable String var1) {
this.name = var1;
}
@Nullable
public final LocalDate getBirthDate() {
return this.birthDate;
}
public final void setBirthDate(@Nullable LocalDate var1) {
this.birthDate = var1;
}
public final int getAge() {
return this.age;
}
}
code를 작성해야 할 것이 확실히 줄어드는 것이다. 코드 생산성이 압도적으로 높아진다.
물론 kotlin에서 java로
어떻게 변경되는지 개인적으로 무조건 알아야 된다
고 생각든다.
final
이다.open
이라는 keyword를 작성하면 된다.kotlin에서의 class는 getter와 setter는 자동으로 만들지만, hashcode와 equals, toString은 만들어지지 않는다. 이점을 유의해야 한다.
그리고 이 둘 모두 java의 main이건, kotlin의 main이건 상관없이 작동한다.
public class Main {
public static void main(String [] args) {
Student student = new Student();
student.setName("junku");
sutdent.setBirthDate(LocalDate.of(2022, 10, 23));
System.out.println(student.getName()); // junku
System.out.println(student.getBirthDate()); // 2022-10-23
}
}
그러면 지금의 반대는 어떻게 될까? java의 class를 이용하면서 main을 kotlin으로 두고 code를 짜면 다음과 같다.
import java.util.*
public class Student {
private String name;
private LocalDate birthDate;
private int age;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getBirthDate() {
return this.birthDate.toString();
}
public void setBirthDate(LocalDate birthDate) {
this.birthDate = birthDate;
}
public String getAge() {
return this.age;
}
}
java의 class를 위와 같이 작성하고 kotlin의 경우 다음과 같이 작성하면 된다.
fun main() {
val person = Person()
person.setName("junku")
person.setBirthDate(LocalDate.of(2022, 10, 22))
println(person.getName()) // junku
println(person.getBirthDate()) // 2022-10-22
// 사실 이러한 접근 보다는 kotlin에서는 property로 접근하는 것을 권장함.
println(person.name) // junku
println(person.birthDate) // 2022-10-22
}
그리고 무엇보다. 다음과 같은 method를 java class에 추가했다고 해보자.
import java.time.LocalDate;
import java.util.UUID;
public class Person {
...
public String getUUID() {
return UUID.randomUUID().toString();
}
}
코드에 있는 그대로 UUID라는 property는 없다. 하지만, kotlin은 이 메소드의 name을 통해 property에 접근할 수 있다.
왜냐하면 앞의 get이라는 keyword를 보고 알아서 만들어 두기 때문이다, 하지만 method의 name 앞에 get
이 없다면, 만들지 않아서 property로 접근이 불가능하다는 점을 기억하자.
즉 현재는 아래의 코드가 가능하다.
fun main() {
val student = Student()
println(student.uuid) // 9e778488-b671-4c40-a0f8-8b05f751b2e4
}