iOS 프로그래밍 7주차

CDH·2024년 10월 16일

출처 : SmileHan - iOS 프로그래밍 기초 강의

복습




(복습 끝) 클래스

swift는 두 가지의 메서드가 있다. 인스턴스 메서드와 클래스가 사용하는 타입 메서드

클래스 안에 있는 stored property 초기값이 있어야 된다


클래스의 프로퍼티는 ?나 !가 있는 옵셔널 변수로 선언하면 사용 가능 (nil로 자동으로 초기화)


함수 호출 예시 (주석 잘 보기)


인스턴스 만들고 메서드와 프로퍼티 접근


클래스(class or type) 메서드


인스턴스 초기화하기 : init() (중요!)

- 괄호가 있는 것은 init을 호출하는 것이다

age, weight 둘 다 (모두) 초기화 시키는 생성자를 designate initializer 라고 한다


self


method overloading : 생성자 중첩

  • 같은 이름의 함수를 중첩해서 사용할 수 있음
  • 매개변수의 개수나 자료형은 달라야 한다


UIImage클래스의 init()함수 overloading

종류가 굉장히 많다


클래스(class) 상속

superclass와 subclass

  • 클래스 상속을 하게 되면 콜론(:)을 찍고 상속받는 클래스를 적는다


부모와 자식 클래스


스위프트 상속

swift 에서 상속을 받을 땐 부모가 하나만 있고, 나머지는 모두 프로토콜이다


상속 : 부모가 가진 것을 물려받아요


super : 부모 메서드 호출 시 사용

중요! 부모와 자식 간에서 같은 메서드를 쓸 때 자식을 우선으로 한다는 override 키워드를 사용해야 함

name 부분에 값이 "김소프" 를 대입했는데 코드에는 빠져있음
에러문구 : "오버라이딩 선언에는 'override' 키워드가 필요합니다"

수정 후


failable initializers(실패 가능한 생성자: init?)




failable initializer가 있는 클래스의 인스턴스 생성

위 코드로 실행하면 에러가 남
해결 방법은 아래 참조

1번, 2번 추천
3, 4번 비추천 (정상적일 때는 문제가 없으나 값이 nil일 때 문제 발생)

age가 0이면 nil을 반환함



뤼튼 활용 주석설명

class Man {
    var age: Int = 0 // 나이를 저장하는 변수
    var weight: Double = 0.0 // 몸무게를 저장하는 변수
    
    // 초기화 메서드, age와 weight를 매개변수로 받음
    init?(age: Int, weight: Double) {
        // 나이와 몸무게가 0 이하일 경우 nil을 반환하여 초기화 실패
        if age <= 0 || weight <= 0.0 {
            return nil
        } else {
            // 유효한 값일 경우, 인스턴스 변수에 값을 할당
            self.age = age
            self.weight = weight
        }
        
        // 중복된 코드: 이미 위에서 값을 할당했으므로 이 부분은 불필요
        self.age = age
        self.weight = weight
    } // 지정 초기화자
    
    // 인스턴스의 나이와 몸무게를 출력하는 메서드
    func display() {
        print("나이: \(age), 몸무게: \(weight)")
    }
}

// Man 클래스의 인스턴스를 생성, age가 5이고 weight가 10.3인 경우
if let dong = Man(age: 5, weight: 10.3) { // age가 0이면 nil을 반환
    // 인스턴스가 성공적으로 생성되면 display 메서드를 호출
    dong.display()
}

ChatGPT 활용한 코드

질문 : swift로 class를 만들려고 해. 상속, overriding, failable initialize을 모두 활용한 코드를 하나 만들어줘

// 부모 클래스 Vehicle
class Vehicle {
    var speed: Int

    init(speed: Int) {
        self.speed = speed
    }

    func description() {
        print("This vehicle moves at \(speed) km/h")
    }
}

// 자식 클래스 Car, Vehicle을 상속받음
class Car: Vehicle {
    var model: String

    // 실패 가능한 초기화 (Failable Initializer)
    init?(speed: Int, model: String) {
        if speed < 0 || model.isEmpty {
            return nil // 속도 음수 또는 모델명이 비어있으면 초기화 실패
        }
        self.model = model
        super.init(speed: speed) // 부모 클래스의 초기화 호출
    }

    // 오버라이딩된 메서드
    override func description() {
        print("This \(model) car moves at \(speed) km/h")
    }
}

// Car 객체를 초기화해 봄
if let myCar = Car(speed: 120, model: "Tesla") {
    myCar.description() // 출력: "This Tesla car moves at 120 km/h"
} else {
    print("Failed to initialize Car")
}

// 실패하는 경우
if let myCar = Car(speed: -10, model: "BMW") {
    myCar.description()
} else {
    print("Failed to initialize Car") // 출력: "Failed to initialize Car"
}

0개의 댓글