밤빵's 개발일지
[TIL]20241011 자바 일반클래스& 코틀린 데이터클래스 본문
자바에서 클래스를 사용해 객체를 정의할 때, equals(), hashCode(), toString() 등의 메서드를 직접 구현해야 한다. 특히, 많은 필드를 가진 객체를 정의할 때 이 메서드들을 일일이 작성하는 것은 반복적이고, 실수를 유발할 수 있는 작업이다. 그러나 코틀린에서는 데이터 클래스라는 개념을 통해 이러한 반복적인 작업을 자동으로 처리해준다.
▶자바의 일반 클래스
자바에서 일반 클래스를 사용해 데이터를 담는 객체를 만들 때, 객체의 동등성 비교(equals()), 해시값 생성(hashCode()), 객체의 문자열 표현(toString()) 등을 직접 구현해야 한다. 이는 특히 데이터 중심의 클래스를 작성할 때 번거롭다.
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
→ equals(): 두 객체가 같은지 비교하는 메서드. 객체의 필드 값을 비교하여, 동일한 데이터를 가지고 있는지 확인한다. 자바에서는 직접 구현해야 하며, 실수를 방지하기 위해 Objects.equals()와 같은 유틸리티 메서드를 사용하는 것이 좋다.
→ hashCode(): 해시값을 생성하는 메서드로, 객체가 해시 기반 컬렉션(Set, Map 등)에서 올바르게 동작하도록 보장한다. 이 메서드 역시 직접 구현해야 한다.
→ toString(): 객체의 문자열 표현을 정의하는 메서드로, 주로 디버깅이나 로그 출력 시 유용하다.
자바에서는 위와 같은 메서드를 직접 구현해야 하므로, 필드가 많을수록 코드가 길어지고 복잡해지며, 유지보수가 어려워진다.
▶코틀린의 데이터 클래스
코틀린의 데이터 클래스(Data Class)는 자바와 달리, 데이터를 담는 목적의 클래스를 쉽게 정의할 수 있다. equals(), hashCode(), toString() 같은 메서드를 자동으로 생성해주기 때문에 코드가 간결해지고, 유지보수가 쉬워진다.
data class Person(val name: String, val age: Int)
→ 코틀린의 데이터 클래스는 자바의 일반 클래스에서 구현했던 여러 메서드를 자동으로 제공한다. 위 코드에서 Person 클래스는 주 생성자에서 받은 name과 age 필드를 바탕으로, equals(), hashCode(), toString() 메서드를 자동으로 생성한다.
▷데이터 클래스에서 자동으로 생성된 메서드:
→ equals(): 객체 간 동등성을 비교하기 위해 자동으로 생성된다.
→ hashCode(): 해시 기반 컬렉션에서 사용할 해시값을 자동으로 계산해준다.
→ toString(): 객체의 필드 값을 포함한 문자열 표현을 자동으로 생성한다.
→ copy(): 객체를 복사하면서 일부 필드의 값을 변경할 수 있는 메서드를 제공한다. 이는 자바의 일반 클래스에서는 제공되지 않는 기능이다.
→ componentN(): 객체의 각 프로퍼티를 구조 분해 할당(destructuring) 할 수 있는 메서드를 제공한다.
▷코틀린 데이터 클래스의 간단한 사용 예시:
fun main() {
val person1 = Person("Alice", 30)
val person2 = Person("Alice", 30)
println(person1) // 출력: Person(name=Alice, age=30)
println(person1 == person2) // 출력: true (equals() 자동 생성)
println(person1.hashCode()) // 출력: hashCode 값
val person3 = person1.copy(age = 31)
println(person3) // 출력: Person(name=Alice, age=31)
}
→ 자바에서는 일일이 구현해야 했던 equals(), hashCode(), toString()이 모두 자동으로 생성되고, copy() 메서드로 쉽게 객체를 복사할 수 있음을 볼 수 있다.
▶자바와 코틀린의 차이점 정리
항목 | 자바 일반 클래스 | 코틀린 데이터 클래스 |
equals() 구현 | 직접 구현해야 함 | 자동 생성됨 |
hashCode() 구현 | 직접 구현해야 함 | 자동 생성됨 |
toString() 구현 | 직접 구현해야 함 | 자동 생성됨 |
객체 복사 | 직접 새로운 객체를 생성해야 함 | copy() 메서드로 간단히 복사 가능 |
구조 분해 할당 | 지원하지 않음 | componentN() 메서드로 각 프로퍼티에 접근 가능 |
코드 가독성 | 필드가 많을수록 길고 복잡해짐 | 간결하고 직관적인 코드 작성 가능 |
장점 | 더 명시적이고 세밀한 구현이 가능 | 간결하고 반복적인 작업을 줄여줌 |
단점 | 코드가 길어지고 유지보수가 어려울 수 있음 | 자동 생성되는 메서드에 대한 세밀한 제어가 어려울 수 있음 |
▶데이터 클래스의 장단점
▷장점
- 코드 간결성: equals(), hashCode(), toString() 등의 메서드를 직접 구현하지 않아도 되므로 코드가 간결해지고, 유지보수가 쉬워진다.
- 자동화된 메서드 제공: 데이터 중심의 클래스를 작성할 때 필요한 기본 기능을 자동으로 제공해준다.
- 객체 복사 편의성: copy() 메서드를 통해 쉽게 객체를 복사할 수 있어 불변 객체를 처리하는 데 유리하다.
- 구조 분해 할당 지원: componentN() 메서드를 통해 객체의 프로퍼티를 간단히 분해하여 사용할 수 있다.
▷단점
- 자동 생성 메서드의 제한: 자동으로 생성된 메서드가 세밀한 제어가 필요할 때는 직접 오버라이드해야 한다.
- 제한된 상속 기능: 데이터 클래스는 abstract, sealed, open과 같은 키워드를 사용할 수 없어, 상속이 제한된다.
자바에서는 객체의 동등성 비교, 해시값 계산, 문자열 표현 등을 직접 구현해야 하며, 이로 인해 코드가 복잡해지는 경우가 많지만, 코틀린의 데이터 클래스는 이러한 메서드들을 자동으로 제공하여 코드의 간결성을 높이고, 유지보수를 쉽게 해준다. 특히 copy() 메서드를 통해 불변 객체를 간편하게 복사할 수 있는 점은 코틀린에서 데이터를 다룰 때 매우 유용한 기능이다.
'Kotlin' 카테고리의 다른 글
[TIL]20241013 스마트캐스팅(Smart Casting) (0) | 2024.10.13 |
---|---|
[TIL]20241012 when 표현식 (0) | 2024.10.12 |
[TIL]20241010 데이터 클래스(Data Class) (0) | 2024.10.10 |
[TIL]20241009 Extension Functions (0) | 2024.10.09 |
[TIL]20241008 코틀린의 함수 선언 & 사용법 (0) | 2024.10.08 |