티스토리 뷰

Kotlin을 새롭게 접하면서 Java에서는 찾아볼 수 없었던 새로운 문법을 발견하게 되었다. 

1
2
3
data class Member(
    ...
)

class 앞에 static이나 접근제어자가 아니고 무슨 기능을 하는지 예상이 가지 않았다.

 

찾아보니 POJO(Plain Old Java Object) 클래스라고 불리는 데이터를 나타내는 클래스를 쉽게 구현하기 위해서 코틀린에서 제공하는 간편한 문법이라고 한다.

(POJO라는 개념에 대해서도 좀 더 알아보았는데 말 그대로 해석하면 '오래된 방식의 간단한 자바 오브젝트'라는 뜻이다. 자바가 가지고 있는 객체 지향의 장점을 끌어올리기 위해서 POJO를 지향해야 한다고 한다.)

 

예로 들어 13개의 필드를 가지는 Member라는 클래스를 구현하기 위해 Java의 코드로 작성한다면 다음과 같이 나타낼 수 있을 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Member {
    String sns_platform;
    String last_login;
    String email;
    String nickname;
    String profile_image;
    int career;
    String website;
    boolean is_registered;
    boolean  is_admin;
    String phone_number;
    String  contact_method;
    String updated_at;
    String created_at;
    
    public Person(String name, int age, String gender) {
        this.sns_platform = sns_platform;
        this.last_login = last_login;
        this.email = email;
        this.nickname = nickname;
        this.profile_image = profile_image;
        this.career = career;
        this.website = website;
        this.is_registered = is_registered;
        this.is_admin = is_admin;
        this.phone_number = phone_number;
        this.contact_method = contact_method;
        this.updated_at = updated_at;
        this.created_at = created_at;
    }
    
    // getter & setter 생략
}

이렇게만 봐도 상당히 길어보이는데 필드를 활용하고 입력하는데 사용되는 getter, setter 메서드를 생략하였는데 아마 코드 길이가 2배는 더 길어질 것이다.

 

하지만 코틀린의 data 문법을 활용한다면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
data class Member(
    val sns_platform: String,
    val last_login: String,
    val email: String,
    val nickname: String,
    val profile_image: String,
    val career: Int,
    val website: String,
    val is_registered: Boolean,
    val is_admin: Boolean,
    val phone_number: String,
    val contact_method: String,
    val updated_at: String,
    val created_at: String,
)

마법처럼 코드가 말도 안 되게 짧아졌다. 하지만 이 놀라운 data class는 생성자부터 getter와 setter 메서드를 지원한다!!

 

data class를 활용하기 위해서는 다음의 제한 사항이 있다고 한다.

  • 기본 생성자에 최소 하나의 파라미터가 있어야 함.
  • 기본 생성자의 파라미터는 val이나 var이어야 함.
  • 데이터 클래스는 abstract, open, selaed, inner가 아니어야 함.

 

그 밖에도 지원하는 것

1. Canonical Methods

캐노니컬 메서드는 Any에 선언된 메서드이다.

(Any는 Java의 Object와 같이 모든 객체의 조상이 되는 객체다.)

  • equals(other:Any?): Boolean : 참조 주소가 아닌 데이터 클래스 간 값의 일치를 비교하는 메서드
  • hashCode(): Int : 인스턴스의 숫자 표현.
  • toString(): String : 인스턴스의 문자열 표현. 데이터 클래스는 기본값이 멤버 변수 값을 나열하도록 정의되어 있다. 

 

2. copy() 메서드

인스턴스를 깊은 복사(Deep copy)하는 메서드. copy() 메서드를 통해서 원하는 파라미터를 오버라이딩해서 데이터 클래스의 새로운 인스턴스를 생성할 수 있다.

1
2
val weekyear = Member("Weekyear", 28, "Android", "Kotlin")
val jun = weekyear.copy(name = "Jun")  // 이름만 Jun으로 바꾸고 나이와 성별은 weekyear에서 복사

 

3. 디스트럭쳐링(Destructuring)

하나의 인스턴스를 여러 개의 변수로 분리하는 것을 디스트럭쳐링이라고 부른다. 데이터 클래스는 디스트럭쳐링을 지원한다. 사용법은 다음과 같다.

1
2
val james: Person = Person("James", 20, "male")
val (name, age, gender) = james

 

age라는 변수가 필요없다면 '_' 로 대체할 수 있다. 

1
val (name, _, gender) = james

 

참고 자료

readystory.tistory.com/85

 

코틀린(Kotlin)의 데이터 클래스(data class)

자바와 코틀린의 data class 이름, 나이, 성별을 갖는 데이터 클래스가 있다고 하자. 자바로 구현한다면 아래와 같을 것이다. public class Person { String name; int age; String gender; public Person(String..

readystory.tistory.com

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함