커스텀 데이터 타입은 기본 데이터 타입 (예: Int, String, Double) 외에 사용자가 직접 정의하는 데이터 타입입니다.
클래스, 구조체, 열거형은 각각 고유한 특징을 가지고 있으며, 상황에 따라 적절하게 선택하여 사용해야 합니다.
클래스 Class
- 참조 타입: 클래스 인스턴스는 메모리 주소를 통해 참조됩니다.
- 상속 가능: 다른 클래스의 속성과 메서드를 상속받을 수 있습니다.
- 다형성: 상속을 통해 다양한 형태의 객체를 다루는 것이 가능합니다.
- class 예시
// `Person` 클래스 정의
class Person {
var name: String // 이름 속성
var age: Int // 나이 속성
// 초기화 메서드
init(name: String, age: Int) {
self.name = name
self.age = age
}
// 메서드
func sayHello() {
print("Hello, my name is \(name) and I am \(age) years old.")
}
}
// `Person` 클래스 인스턴스 생성
let person1 = Person(name: "Jaby", age: 18)
let person2 = Person(name: "Haru", age: 1)
// 메서드 호출
person1.sayHello()
person2.sayHello()
// 출력
Hello, my name is Jaby and I am 18 years old.
Hello, my name is Haru and I am 1 years old.
구조체 Struct
- 값 타입: 구조체 인스턴스는 값 자체를 복사하여 전달됩니다.
- 상속 불가능: 다른 구조체로부터 상속받을 수 없습니다.
- 초기화: 기본 초기화가 제공되며, 커스텀 초기화를 추가할 수 있습니다.
- struct 예시
// `Point` 구조체 정의
struct Point {
var x: Int // x 좌표 속성
var y: Int // y 좌표 속성
}
// `Point` 구조체 인스턴스 생성
let point1 = Point(x: 10, y: 20)
let point2 = Point(x: 30, y: 40)
// 속성 접근
print("point1: (\(point1.x), \(point1.y))")
print("point2: (\(point2.x), \(point2.y))")
//출력
point1: (10, 20)
point2: (30, 40)
열거형 Enumeration
- 값 타입: 열거형 값은 값 자체를 복사하여 전달됩니다.
- 관련 값: 각 열거형 값에 데이터를 추가할 수 있습니다.
- 연산: 열거형 값에 대한 연산을 정의할 수 있습니다.
- enum 예시
// `Color` 열거형 정의
enum Color: String {
case red
case green
case blue
}
// `Color` 열거형 값 사용
let myColor = Color.red
print("myColor: \(myColor)")
// 열거형 값에 대한 연산
switch myColor {
case .red:
print("Red is the color of passion.")
case .green:
print("Green is the color of nature.")
case .blue:
print("Blue is the color of the sky.")
}
//출력
myColor: red
Red is the color of passion.
어떤 데이터 타입을 사용해야 할지 결정하는 방법
- 불변성이 필요할 때: 값 타입인 구조체나 열거형을 사용
- 상속이 필요할 때: 참조 타입인 클래스를 사용
- 간단한 데이터 모델링: 구조체나 열거형을 사용
- 복잡한 동작: 클래스를 사용