새벽의 기록

[SOPT] 문법 스터디 #4 메서드와 옵셔널 체이닝 본문

SOPT/문법 스터디

[SOPT] 문법 스터디 #4 메서드와 옵셔널 체이닝

OneTen 2024. 11. 14. 00:28
- 메서드
    - 인스턴스 메서드와 타입 메서드  의 차이점과 각각의 사용 예시
    - mutating 키워드
    - 메서드 오버로딩과 메서드 오버라이딩 의 차이
- 옵셔널 체이닝
    - 강제 언래핑의 문제점
    - 옵셔널 바인딩 에 대해서도 알아보고, 옵셔널 체이닝 과 같이 사용해봅시당

 

메서드

 

인스턴스 메서드와 타입 메서드 의 차이점과 각각의 사용 예시

 
인스턴스 메서드는 클래스, 구조체, 또는 열거형의 인스턴스에서 호출할 수 있는 메서드.
타입 메서드는 타입 자체에서 호출할 수 있는 메서드로, 클래스, 구조체, 또는 열거형의 타입 수준에서 동작한다.

struct Counter {
    var count = 0
    
    // 인스턴스 메서드
    func displayCount() {
        print("Current count is \\(count)")
    }
    
    // 타입 메서드
    static func staticMethodExample() {
        print("This is a type method.")
    }
}

// 인스턴스 생성 후 메서드 호출
var myCounter = Counter()
myCounter.displayCount()  // "Current count is 0"

// 타입 메서드 호출
Counter.staticMethodExample()  // "This is a type method."

displayCount 같은 인스턴스 메서드는 객체를 생성해서 호출할 수 있고,
staticMethodExample 같은 타입 메서드는 struct 자체에서 호출할 수 있다.
 
 

mutating 키워드

 
mutating 키워드는 구조체나 열거형의 인스턴스 메서드에서 인스턴스의 속성을 변경할 수 있도록 해주는 키워드.

struct Counter {
    var count = 0
    
    // 인스턴스 메서드
    func displayCount() {
        print("Current count is \\(count)")
    }
    
    // mutating 키워드를 사용한 인스턴스 메서드
    mutating func increment() {
        count += 2
    }

}

// 인스턴스 생성 후 메서드 호출
var myCounter = Counter()
myCounter.displayCount()  // "Current count is 0"
myCounter.increment()
myCounter.displayCount()  // "Current count is 2"

기본적으로 값 타입의 프로퍼티는 인스턴스 메서드 내에서 수정될 수 없다.
하지만 굳이굳이 특정 메서드 내에서 구조체나 열거형의 프로퍼티 수정이 필요하다면, 메서드에 mutating 키워드를 작성해서 프로퍼티를 변경할 수 있고, 메서드가 끝나면 기존 구조체에 변경사항이 적용된다.
 
 

메서드 오버로딩과 메서드 오버라이딩 의 차이

 
메서드 오버로딩은 동일한 이름의 메서드가 여러 개 정의되지만, 각각의 파라미터 타입이나 개수가 달라서 구분될 수 있게 만드는 것.

class Cat {
    func sound() {
        print("야옹")
    }
    
    func sound(times: Int) {
        for _ in 1...times {
            print("야옹")
        }
    }
}

let cat = Cat()
cat.sound() // 야옹
cat.sound(times: 3) // 야옹야옹야옹

메서드 오버라이딩은 상속받은 클래스가 부모 클래스의 메서드를 재정의하는 것.

class Animal {
    func sound() {
        print("대충 동물 울음소리")
    }
}

class Cat: Animal {
    override func sound() {
        print("야옹")
    }
}

let animal = Animal()
let cat = Cat()

animal.sound() // 대충 동물 울음소리
cat.sound() // 야옹

 

옵셔널 체이닝

 

강제 언래핑의 문제점

 
강제 언래핑은 옵셔널 타입의 값 뒤에 !를 붙여서 옵셔널을 강제로 풀어내는 방법.
이 방법은 옵셔널이 nil이 아닌 것이 확실할 때 사용해야 한다.
→ 만약 nil을 강제 언래핑하려 하면 런타임 오류가 발생하여 앱이 크래시될 수 있음.
강제 언래핑의 문제점은 예기치 못한 nil이 있을 경우 앱의 비정상 종료로 이어질 수 있기 때문에 안전하지 않다는 것.
 
 

옵셔널 바인딩 에 대해서도 알아보고, 옵셔널 체이닝 과 같이 사용해봅시당

 
옵셔널 바인딩은 if let 또는 guard let 구문을 사용하여 옵셔널 값이 nil이 아닌 경우에만 안전하게 값을 추출할 수 있도록 하는 방법이다. → 코드의 안정성을 높일 수 있다.
 
옵셔널 체이닝은 옵셔널 값에 연속적으로 접근할 때 nil인지 확인하면서 안전하게 값을 추출할 수 있는 방법이다.
→ 뒤에 ? 붙여주는 거

class Person {
    var residence: Residence?
}

class Residence {
    var address: Address?
}

class Address {
    var street: String?
}

let john = Person()

// 옵셔널 체이닝과 옵셔널 바인딩을 함께 사용
if let streetName = john.residence?.address?.street {
    print("John lives on \\(streetName)")
} else {
    print("No street information available")
}

// residence가 nil이므로 체이닝의 결과는 nil이고, else 블록이 실행됨.
Comments