iOS 복습(6)

유재우·2022년 1월 17일
0

구조체

  • 구조체는 상속이 불가능하다.
  • 구조체와 enum의 인스턴스는 값 타입이고 클래스의 인스턴스는 참조 타입이다.
struct Square {
    var horizon = 1280
    var vertical = 720
}
let myMoniter = Square()  // 인스턴스 생성
print(myMoniter.horizon) // 프로퍼티 접근

struct Square {
    var horizon : Int
    var vertical : Int
}
let myMoniter = Square(horizon:1280,vertical:720)  // 인스턴스 생성
print(myMoniter.horizon) // 프로퍼티 접근
  • init()메서드가 없어도 initializer가 가능하다.

클래스 vs 구조체 vs 열거형

  • 클래스 vs 구조체
    • 공통점
  1. 프로퍼티와 메서드를 정의할 수 있다.
  2. []를 사용해 첨자 문법으로 내부의 값을 액세스 할 수 있는 첨자를 정의할 수 있다.
  3. 초기상태 설정을 위한 init()를 정의할 수 있다.
  4. extension을 통해 새로운 기능을 추가할 수 있다.
  5. 프로토콜을 사용 할 수 있다.

  • 클래스만 가지는 특징
  1. 상속이 가능하다.
  2. 타입 캐스팅(is, as)을 통해 실행 시점에 클래스 인스턴스의 타입을 해석하고 검사할 수 있다.
  3. deinit함수를 사용해 사용한 자원을 반환 할 수 있다.
  4. 참조 카운팅을 통해 한 클래스 인스턴스를 여러 곳에서 참조할 수 있다.
구조체는 값 타입이고 클래스는 참조 타입이다.

call by value VS call by reference

  • Swift에서 제공하는 Int, String, Array, Dictionary 등 기본 자료형들은 구조체로 만들어져 있어서 call by value 방식이다.
  • enum도 call by value방식이다.
  • 클래스는 call by reference방식이다.

클래스와 구조체를 쓰는 경우

구조체

  • 간단한 데이터 값들을 한 곳에 묶어 사용하는 경우
  • 전체 크기가 작아 복사를 통해 전달해도 좋은 경우
  • 멀티 쓰레드 환경일 때에 구조체가 더 안전하다.
  • 기존 타입의 특성을 상속할 필요가 없다.

Optional Chaining

  • 옵셔널 형의 프로퍼티나 메서드 호출 뒤에(?) 사용한다.
  • 선언할 때엔 자료형 뒤에 붙인다.(Int?)

옵셔널 체이닝을 사용하는 이유

  • 옵셔널 타입으로 정의된 값이 프로퍼티나 메서드를 가지고 있을 때, 다중 if를 쓰지 않고 간결하게 코드를 작성하기 위해 사용한다.
  • 옵셔널 타입의 데이터는 연산이 불가능하다.
  • 연산을 하려면 옵셔널을 해제해야 하는데, 많은 양의 옵셔널 타입의 데이터의 경우 다시 한번 옵셔널 타입으로 변경을 하면서 해제를 시켜준다.
if let s = p.sns {
    if let f = s.fb {
        print("\(f.account)")
    }
}
  • 다중 if
print("\(p.sns!.fb!.account)"))   // 강제 언래핑을 사용 안하는 이유 : !로 푼 값중에 하나라도 nil값이 나오면 오류가 난다.
print("\(p.sns?!.fb?.account)"))  // 옵셔널 체인, 옵셔널 타입이 된다. n il값이 있어도 상관 없이 Optional값으로 값이 나온다.
  • 다중 if를 쓰지 않고 간결하게 코드를 작성하기 위해 옵셔널 체이닝을 사용

예)
class Man {
    var age : Int = 25
    var name : Name?
}
class Name {
    var last = "YOO"
}
let yoo = Man()           //yoo의 name을 nil로 초기화
print(yoo.name!.last)    // 오류, 강제언래핑
print(yoo.name?.last)   // nil, 옵셔널 체이닝을 사용하면 최종결과가 옵셔널로 나온다. 결과가 없으면 nil값이 나온다.

오류 처리

  • 런타임 시 오류룰 발견하여 응답하고 복구하는 과정이다.

throwing function

  • 그냥 사용할 수 없고 반드시 error handling을 해야한다.
구조)
func 함수이름() throws -> 리턴형 타입
_________________________________
error handling 예)
do {
    audioPlayer = try AVAudioPlayer(contentsOf:: auudioFile)
} catch let error as NSError {
    print("에러")
}
  • 앞에 try를 적고 그 코드를 do 블록으로 묶고 밑에 catch블록을 만든다.

35:40~41:00까지의 내용입니다.

profile
끝없이 탐구하는 iOS 개발자 유재우입니다!

0개의 댓글