본문 바로가기
IT/Swift 노트

019 Nested Type 중첩타입

by 33.0 2025. 3. 31.
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