728x90
Nested Type 중첩타입
기본개념
하나의 타입 안에 다른 타입을 정의하는 것
구조체, 클래스, 열거형 안에 열거형, 구조체 , 클래스를 중첩해서 사용한다.
관련된 타입들을 묶어 코드의 구조를 명확하게 만들 수 있다.
class Camp {
let campId: Int
let startDate: Date
enum Status: String {
case preparingForOpening = "개강준비중"
case recruiting = "모집중"
case recruitingEnded = "모집마감"
case ongoing = "개강중"
case ended = "종강"
}
let status: Camp.Status
접근 방법
외부로 나가게 되면 속성문법이나 메소드문법이 달라지지 않지만 이름이 달라진다.
만약 Camp라는 class 안에 Status라는 열거형을 중첩하면
열거형타입의 이름은 Camp.Status로 바뀌게 된다.
중첩타입에 접근하기 위해서는 그 이름을 사용해야한다.
ClassName.EnumName // 외부타입.중첩타입
예제
class School {
var name: String
var students: [Student] = []
var teachers: [Teacher] = []
init(name: String) {
self.name = name
}
// 중첩된 Student 클래스
class Student {
var name: String
var grade: Int
init(name: String, grade: Int) {
self.name = name
self.grade = grade
}
}
// 중첩된 Teacher 클래스
class Teacher {
var name: String
var subject: String
init(name: String, subject: String) {
self.name = name
self.subject = subject
}
}
// 학생 추가 메서드
func addStudent(name: String, grade: Int) {
let newStudent = Student(name: name, grade: grade)
students.append(newStudent)
}
// 교사 추가 메서드
func addTeacher(name: String, subject: String) {
let newTeacher = Teacher(name: name, subject: subject)
teachers.append(newTeacher)
}
}
사용예시
let mySchool = School(name: "Swift High")
mySchool.addStudent(name: "John", grade: 10)
mySchool.addTeacher(name: "Ms. Smith", subject: "Programming")
// 직접 중첩 타입 인스턴스 생성
let newStudent = School.Student(name: "Lisa", grade: 11)
mySchool.students.append(newStudent)
예제2
struct House {
var address: String
var rooms: [Room] = []
// 중첩된 Room 구조체
struct Room {
enum RoomType {
case bedroom
case kitchen
case livingRoom
case bathroom
}
var type: RoomType
var sizeInSquareFeet: Double
}
// 방을 추가하는 메서드
mutating func addRoom(type: Room.RoomType, size: Double) {
let newRoom = Room(type: type, sizeInSquareFeet: size)
rooms.append(newRoom)
}
}
사용 예시
var myHouse = House(address: "123 Swift Street")
myHouse.addRoom(type: .bedroom, size: 200)
myHouse.addRoom(type: .kitchen, size: 150)
// 중첩 타입 접근 방법
let bedroomType = House.Room.RoomType.bedroom
클래스 안에 생성된 중첩타입은 initializer를 작성해야할까?
- 구조체(Struct)인 경우:
- 모든 속성에 기본값이 있거나, 모든 속성이 옵셔널이면 기본 initializer를 자동으로 제공한다.
- 그렇지 않으면 필요한 모든 속성을 초기화하는 memberwise initializer를 자동으로 제공한다.
- 클래스(Class)인 경우:
- 모든 속성에 기본값이 있으면 기본 initializer를 자동으로 제공한다.
- 그렇지 않으면 직접 initializer를 작성해야 한다.
- 열거형(enum)인 경우:
- 열거형은 값 자체가 케이스로 미리 정의되어 있기 때문에, 별도의 생성자 없이 바로 접근할 수 있다.
class OuterClass {
var outerProperty: String
// 클래스에 중첩된 구조체
struct NestedStruct {
var prop1: Int
var prop2: String
// 모든 속성에 기본값이 없으므로, memberwise initializer가 자동 생성됨
// NestedStruct(prop1: Int, prop2: String)을 사용할 수 있음
}
// 클래스에 중첩된 다른 구조체
struct NestedStructWithDefaults {
var prop1: Int = 0
var prop2: String = ""
// 모든 속성에 기본값이 있으므로, 기본 initializer와 memberwise initializer 모두 자동 생성됨
}
// 클래스에 중첩된 클래스
class NestedClass {
var prop1: Int
var prop2: String
// 클래스이고 모든 속성에 기본값이 없으므로, initializer를 직접 작성해야 함
init(prop1: Int, prop2: String) {
self.prop1 = prop1
self.prop2 = prop2
}
}
// 클래스에 중첩된 다른 클래스
class NestedClassWithDefaults {
var prop1: Int = 0
var prop2: String = ""
// 모든 속성에 기본값이 있으므로, 기본 initializer가 자동 생성됨
}
init(outerProperty: String) {
self.outerProperty = outerProperty
}
}
NestedStruct는 기본값이 없으므로 memberwise initializer가 자동 생성된다.
NestedStructWithDefaults는 모든 속성에 기본값이 있어서 기본 initializer와 memberwise initializer 모두 자동 생성된다.
NestedClass는 클래스이고 기본값이 없으므로 직접 initializer를 작성해야한다.
NestedClassWithDefaults는 클래스이지만 모든 속성에 기본값이 있으므로 기본 initializer가 자동 생성
728x90
'IT > Swift 노트' 카테고리의 다른 글
awakeFromNib(), layoutSubviews(), preferredLayoutAttributesFitting() (0) | 2025.04.17 |
---|---|
037 Dictionary (1) | 2025.04.01 |
018 formatting, locale (0) | 2025.03.31 |
036 Notification (0) | 2025.03.31 |
017 Modeling, 모델링 , 인스턴스프로퍼티 (0) | 2025.03.30 |