
Class는 프로그래밍에서 특정 종류의 "객체"를 만들기 위한 설계도 또는 틀
실생활 비유:
붕어빵 틀을 생각해 보자. 붕어빵 틀 하나로 슈크림 붕어빵, 팥 붕어빵 등 다양한 붕어빵을 만들어낼 수 있음. 여기서 '붕어빵 틀'이 바로 Class이고, '붕어빵' 하나하나가 Class로 만들어진 '객체(Object)'이다.
프로그래밍에서의 Class:
프로그래밍에서도 마찬가지입니다. 예를 들어, 우리가 "사람"이라는 개념을 코드로 표현하고 싶다고 해볼게요. 사람은 이름, 나이, 직업 등 여러 특징(속성)을 가지고 있고, 밥을 먹거나 잠을 자는 등 여러 행동(기능)을 할 수 있죠. 이러한 사람의 특징과 행동을 하나의 묶음으로 정의한 것이 바로 Class입니다.
// Class 정의 예시: 'Person'이라는 설계도를 만듭니다.
class Person {
// 1. 속성 (Property): 객체가 가질 수 있는 특징
var name: String = "" // 이름
var age: Int = 0 // 나이
// 2. 기능 (Method): 객체가 할 수 있는 행동
fun introduce() {
println("안녕하세요, 제 이름은 ${name}이고, ${age}살입니다.")
}
fun eat() {
println("${name}이/가 밥을 먹습니다.")
}
}
설명:
Class로 객체 만들기:
fun main() {
// Person 클래스(설계도)를 이용해서 '1hyung' 객체를 만듭니다.
val 1hyung = Person()
1hyung.name = "1hyung" // 1hyung 객체의 이름 설정
1hyung.age = 25 // 1hyung 객체의 나이 설정
// 1hyung 객체의 기능을 사용합니다.
1hyung.introduce() // 출력: 안녕하세요, 제 이름은 1hyung이고, 25살입니다.
1hyung.eat() // 출력: 1hyung이/가 밥을 먹습니다.
// 또 다른 Person 클래스(설계도)를 이용해서 '원형' 객체를 만듭니다.
val wonhyung = Person()
wonhyung.name = "원형" // 원형 객체의 이름 설정
wonhyung.age = 22 // 원형 객체의 나이 설정
wonhyung.introduce() // 출력: 안녕하세요, 제 이름은 원형이고, 22살입니다.
}
정리: Class는 객체의 '뼈대'이자 '설계도'로, 객체가 어떤 속성을 가지고 어떤 행동을 할 수 있는지 정의합니다. 대부분의 프로그래밍 언어에서 기본적으로 제공하는 개념이에요.
Data Class는 Kotlin 언어에서 제공하는 특별한 형태의 Class입니다. 이름에서도 알 수 있듯이, 주로 데이터를 저장하고 전달하는 목적으로 사용되는 클래스를 만들 때 유용합니다.
왜 Data Class가 필요할까?
우리가 Class를 만들 때, 때로는 객체의 속성(데이터)만 중요하고, 그 속성을 가지고 특별한 행동(기능)을 할 필요가 없는 경우가 많습니다. 예를 들어, 회원 정보를 담는 User 클래스, 상품 정보를 담는 Product 클래스 등이 그렇죠.
이런 데이터를 다루는 클래스를 만들 때, 우리가 코드로 직접 구현해야 할 몇 가지 기본적인 기능들이 있습니다.
일반 Class로 위 기능들을 구현하려면 개발자가 직접 일일이 코드를 작성해야 합니다. 이게 생각보다 번거롭고 실수할 확률도 높아요.
실생활 비유:
"학생 명부"를 상상해보자. 이 명부에는 학생의 이름, 학년, 반 정보만 있으면 된다. 이 명부의 주된 목적은 학생 정보를 "저장하고 관리"하는 것이지, 학생 정보로 어떤 복잡한 계산을 하거나 학생을 움직이는 기능이 필요한 건 아니다.
Data Class는 마치 이 학생 명부를 자동으로 만들어주는 기계와 같아요. 이름, 학년, 반만 입력하면, 자동으로
"이 학생과 저 학생이 같은 정보를 가졌는지 비교"해주고,
"학생 정보를 한눈에 볼 수 있는 형태로 출력"해주고,
"기존 학생 정보에서 이름만 바꿔 새로운 학생 정보를 복사"해주는 등의 부가적인 기능들을 '알아서' 만들어 줍니다.
Kotlin에서의 Data Class:
Kotlin에서는 data라는 키워드를 class 앞에 붙여주면, 위에서 언급한 equals(), hashCode(), toString(), copy() 등의 유용한 함수들을 자동으로 생성해줍니다. 개발자는 이 함수들을 직접 구현할 필요 없이 데이터를 정의하는 데 집중할 수 있게 됩니다.
// Data Class 정의 예시: 'Student'라는 데이터 전용 설계도를 만듭니다.
data class Student(
val name: String, // 이름
val grade: Int, // 학년
val className: String // 반 이름
)
설명:
data class Student(...): data 키워드를 사용해서 Student를 데이터 클래스로 선언했어요.
val name: String, val grade: Int, val className: String: 데이터 클래스는 반드시 주 생성자(primary constructor)에 속성을 정의해야 합니다. 이 속성들이 바로 이 데이터 클래스가 '가질 데이터'가 됩니다.
Data Class 사용 예시:
fun main() {
// Student 데이터 클래스로 '철수' 학생 객체를 만듭니다.
val chulsu = Student("철수", 3, "A반")
println(chulsu) // toString() 자동 생성: Student(name=철수, grade=3, className=A반)
// Student 데이터 클래스로 '영희' 학생 객체를 만듭니다.
val younghee = Student("영희", 2, "B반")
// Student 데이터 클래스로 '민수' 학생 객체를 만듭니다. (철수와 같은 정보)
val minsu = Student("철수", 3, "A반")
// 1. equals() 자동 생성: 값 비교
println("철수와 영희는 같은 학생인가? ${chulsu == younghee}") // 출력: false
println("철수와 민수는 같은 학생인가? ${chulsu == minsu}") // 출력: true (값이 같으므로 true)
// 2. copy() 자동 생성: 객체 복사 및 속성 변경
val chulsuUpdated = chulsu.copy(grade = 4) // 철수 객체를 복사하되, 학년만 4로 변경
println(chulsuUpdated) // 출력: Student(name=철수, grade=4, className=A반)
// 3. componentN() 자동 생성: 속성 값을 순서대로 가져오기 (비구조화 선언)
val (name, grade, className) = chulsu // 철수 객체에서 name, grade, className을 바로 꺼내 쓸 수 있음
println("이름: $name, 학년: $grade, 반: $className") // 출력: 이름: 철수, 학년: 3, 반: A반
}
정리: Data Class는 주로 데이터를 담는 목적으로 사용되며, 개발자가 직접 구현해야 할 자주 쓰이는 유용한 함수들을 Kotlin 컴파일러가 자동으로 생성해주는 편리한 클래스입니다.
| 특징 | Class (일반 클래스) | Data Class (데이터 클래스) |
|---|---|---|
| 주요 목적 | 객체의 속성과 행동(기능)을 정의하고 관리 | 주로 데이터를 저장하고 전달하는 목적 |
| 기본 생성 함수 | equals(), hashCode(), toString(), copy() 등은 직접 구현해야 함 | equals(), hashCode(), toString(), copy(), componentN() 등을 Kotlin 컴파일러가 자동으로 생성해줌 |
| 필수 속성 | 주 생성자에 속성 정의는 선택 사항 | 주 생성자에 val 또는 var로 최소한 하나 이상의 속성을 정의해야 함 |
| 추가 기능 | 어떤 복잡한 로직이나 비즈니스 로직도 포함 가능 | 주로 데이터 관련 기능에 중점, 불필요한 복잡한 로직은 피하는 것이 좋음 |
| 사용 시기 | 객체의 동작(행동)이 중요하거나, 객체 간의 동일성을 주소 값으로 비교해야 할 때 (ex. 두 객체가 메모리상으로 같은 객체인지) | 객체의 데이터(값)가 중요하며, 객체 간의 동일성을 값으로 비교해야 할 때 (ex. 두 객체가 같은 데이터를 가지고 있는지) |
Class와 Data Class는 모두 Kotlin에서 객체를 생성하기 위한 '설계도'라는 공통점을 가지고 있습니다. 하지만 두 가지는 주요 목적과 그에 따라 제공되는 기능에서 차이가 있습니다.
Class (일반 클래스)는 객체의 속성뿐만 아니라 다양한 행동(메서드)을 정의하고 관리할 때 사용되는 일반적인 설계도입니다. 예를 들어, Person 클래스에 이름, 나이 같은 속성과 함께 introduce(), eat()과 같은 행동을 정의할 수 있습니다. Class로 만들어진 객체들은 기본적으로 메모리 주소를 기준으로 동일성을 비교합니다.
반면에 Data Class (데이터 클래스)는 Kotlin에서 데이터를 저장하고 전달하는 목적으로 특별히 설계된 클래스입니다. data 키워드를 사용하여 선언하며, 가장 큰 특징은 데이터 비교(equals()), 해시 코드 생성(hashCode()), 문자열 표현(toString()), 객체 복사(copy())와 같이 데이터를 다룰 때 자주 사용되는 유용한 함수들을 Kotlin 컴파일러가 자동으로 생성해준다는 점입니다. 이로 인해 개발자가 직접 코드를 작성해야 하는 번거로움이 줄어들어 생산성이 향상됩니다. Data Class로 만들어진 객체들은 주로 속성(값)을 기준으로 동일성을 비교합니다.
따라서 객체의 행동이나 복잡한 비즈니스 로직이 중요한 경우에는 일반 Class를 사용하고, 단순히 데이터를 묶어서 전달하거나 저장하는 목적이라면 Data Class를 사용하는 것이 Kotlin의 장점을 활용하는 좋은 방법입니다.
일반 클래스(class)는 행동 중심의 객체를 정의할 때 사용합니다. 즉, 객체가 가진 기능과 로직이 중심이 될 때 사용하고요.
반면에 data class는 데이터의 저장과 전달이 중심입니다. 특별히 데이터를 담기 위해 사용하며, 데이터가 같으면 같은 객체로 간주하는 특징을 가지고 있어요.
data class는 toString(), equals(), hashCode(), copy() 같은 여러 메서드를 자동으로 만들어주기 때문에 DTO(데이터 전달 객체)나 응답 모델, 요청 모델 같은 곳에서 매우 유용하게 사용됩니다.