문제

Learn about classesproperties and data classes and then rewrite the following Java code to Kotlin:

public class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

Afterward, add the data modifier to the resulting class. The compiler will generate a few useful methods for this class: equals/hashCode, toString, and some others.

class Person

fun getPeople(): List<Person> {
    return listOf(Person("Alice", 29), Person("Bob", 31))
}

fun comparePeople(): Boolean {
    val p1 = Person("Alice", 29)
    val p2 = Person("Alice", 29)
    return p1 == p2  // should be true
}

data class Person (
    val name: String,
    val age: Int
    )

fun getPeople(): List<Person> {
    return listOf(Person("Alice", 29), Person("Bob", 31))
}

fun comparePeople(): Boolean {
    val p1 = Person("Alice", 29)
    val p2 = Person("Alice", 29)
    return p1 == p2  // should be true
}

풀이

관련된 데이터 여러 개를 클래스로 묶어서 이용하려는 클래스를 보다 편하게 이용하기 위해서 data 클래스를 사용한다.

자바 코드에서 Person 클래스는 한 번 생성된 이후에는 nameage 값을 변경할 수 없도록 private final 제어자를 이용하여 만들었다.

코틀린으로 바꿔서 작성할 경우 val 키워드를 이용하여 작성해주면 된다.

참고

변수 선언법

  • val : 불변 변수로, 값의 읽기만 허용되는 변수(Value)
  • var : 가변 변수로 값의 읽기와 쓰기가 모두 허용되는 변수(Variable)

data class

일반 클래스와 data 클래스의 다른점은 class 앞에 data 예약어가 붙는다.

  • data 클래스 생성 조건

    • 주 생성자를 선언해야 하며 주 생성자의 매개변수는 최소 하나 이상이어야 한다.
    • 모든 주 생성자의 매개변수는 var 혹은 va로 선언해야 한다.
    • abstract, open, sealed, inner 등의 예약어를 추가할 수 없다.
  • data 클래스 생성시 컴파일러가 자동으로 생성해주는 것들

    • 주 생성자 : 선언된 모든 프로퍼티를 파라미터로 가지는 생성자
    • equals() : 객체의 모든 프로퍼티를 비교하여 두 객체가 같은지 확인하는 메서드
    • hashCode() : 객체의 해시 코드를 반환하는 메서드
    • toString() : 객체의 내용을 문자열로 반환하는 메서드
    • componentN() : 객체의 프로퍼티를 개별적으로 반환하는 함수들
    • copy() : 객체를 복사하면서 일부 프로퍼티를 변경할 수 있는 메서드
profile
개발하는 다람쥐

0개의 댓글