🖇 java → kotlin 기초 (class)

박준규·2022년 10월 23일
0

코틀린

목록 보기
19/19

최근 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의 getter, setter 그리고 Java

본래 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로 어떻게 변경되는지 개인적으로 무조건 알아야 된다고 생각든다.

  1. kotlin의 class는 java에선 final이다.
    • 무차별 상속을 막기 위해서 만들어진 기능이다.
    • 대규모 시스템의 경우 객체 지향의 특성 상 상속으로 인해 생기는 종속성을 최대한 방지하기 위한다고 생각하면, 왜 final을 default로 내렸는지 이해된다. 그리고 이러한 기능은 함수(method)에도 적용된다.
    • 참고로 상속을 하고 싶다면, class앞에 open이라는 keyword를 작성하면 된다.
  2. kotlin의 var 키워드를 작성하면 getter와 setter가 자동으로 만들어진다.

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

}
profile
'개발'은 '예술'이고 '서비스'는 '작품'이다

0개의 댓글