ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL w3d1] Swift 복습 (Optional, 중첩타입, 접근제어자, Protocol)
    iOS💖 2025. 3. 17. 20:29

    학습 목표

    Optional, Optional unwrapping, 중첩타입, 접근제어자, 프로토콜을 iOS 개발에 실제 활용할 수 있도록 학습!

    문법의 특징을 잘 파악해보자!

     

    Optional Type

    선언 가능 타입

    • 기본 타입 (Int, String, Float … )
    • Collection Type (Array, Dictionary, Set … )
    • Custom Type (Class, Struct, Enum)
    • 클로저

     

     

    Optional Chaining: 체이닝으로 optional 벗기기!

    person?.animal?.name

     

    ⭐️ nil 확인 : 왼쪽 -> 오른쪽으로 체크 ⭐️

     

     

     

    Optional Binding:  if-let /  guard-let

    [1] if-let 

    var intValue: Int? = 10
    
    if let intValue = intValue { 
        print(intValue) // 10
    }
    
    print(intValue) // Optional(10)

     

     

    [2] guard-let
    : [2.1] 조건문 [2.2] 옵셔널 unwrapping

     

    [2.1] 조건문

    • guard 는 조건이 true일 경우 코드를 계속 진행하고, false일 경우 else 코드 블록에서 탈출
    • else 블록은 필수
    guard 조건 else { 
    	// 조건이 false 일 때 실행되는 코드블록  
    	// return, break, continue, throw등 코드블록을 종료하는 구문이 필요
    	return 
    }

     

     

     

    [2.2] 옵셔널 binding으로 unwrapping

    • 옵셔널 바인딩 결과가 nil일 경우, else 문을 실행
    • 클로저 / 메소드 내부에서 주로 사용

     

     

     

     

    옵셔널 묵시적 언래핑 (Implicitly Unwrapped Optional)

    • 옵셔널 타입을 선언할 때 !를 사용
    • 값을 사용할 때 자동으로 언래핑되어, 별도의 언래핑 작업 없이 직접 사용 가능
    • 🔴 값이 있다고 확신이 들 때 사용!!
      • 값이 nil 일 때 접근하면 런타임 오류가 발생

    • 옵셔널 바인딩 가능
    var name: String! = "Dive" 
    
    print(name) // Optional("Dive")
    print(name.count) // 5 
    
    if let name = name {
        print(name) // Dive
    }

     

     

     

     

     

    중첩된 타입 
    : 구조적 복잡한 Class / Struct 를 더 조직적 관리!

    • 사용 : class, struct, enum 등
    • 코드 가독성을 높이고, 타입 간의 연관성을 명확해짐!
    struct Car {
        struct Company {
            var name: String
            var phoneNumber: String
            
            func contact() {
                print("\(name) 회사의 A/S 센터 번호는 \(phoneNumber)입니다.")
            }
        }
    
        enum Model {
            case sedan
            case hatchback
            case suv
        }
    
        var model: Model
        var company: Company
        var name: String
        var color: String
    }
    
    let myCar = Car(model: .sedan, company: Car.Company(name: "sparta", phoneNumber: "010-0000-0000"), name: "붕붕이", color: "Black")
    
    myCar.company.contact() // sparta 회사의 A/S 센터 번호는 010-0000-0000입니다.
    print(myCar.model) // sedan

     

     

     

     

    접근제어자
    : open, public, internal, fileprivate, private

    open

    • 모든 외부 모듈에서 접근할 수 있는 접근제어자
    • 가장 개방적인 접근 수준
    • 유일하게 class 에서만 사용 가능
      • 상속이 가능하고 재정의 가능하기 때문에!

    public

    • 모든 외부 모듈에서 접근할 수 있는 접근제어자
    • 가장 개방적인 접근 수준

    internal

    • 기본값 접근제어자로 설정하지 않았다면 internal
    • 동일한 모듈에서 접근 가능

    fileprivate

    • 동일한 파일 내부에서만 접근할 수 있는 접근 제어자

    private

    • 가장 제한적인 접근 제어자
    • 해당 요소를 선언한 스코프(예를 들어 class, struct, enum의 코드블록)에서만 사용 가능
    • struct 에서 private 프로퍼티가 있다면 memberwise init을 사용할 수 없어서 직접 init을 작성해야 합니다.
    struct Person {
        var name: String
        public var age: Int
        private var havingMoney: Int // 🔴 private property
        
        
        init(name: String, age: Int, havingMoney: Int) { // 🔴 init 직접 작성
            self.name = name
            self.age = age
            self.havingMoney = havingMoney
        }
        
        private func printMoney() {
            print("나는 \(havingMoney) 원 있다!")
        }
    
        func test() {
            printMoney()
        }
    }

     

     

     

     

    프로토콜
    : { get } / { set get } 에 따른 구현

    • 🔴 protocol에 선언된 property를 구현할 경우, [저장 프로퍼티] / [연산 프로퍼티] 로 구현하든 상관 X 
    • 🔴 연산 프로퍼티는, 원래 var 선언

     

    [1] { get } 프로퍼티

    • [저장 프로퍼티] : let/var 상관 X ('get'으로 수정안되니)
    • [연산 프로퍼티] : protocol 이 get 임에도,
      • get {} 구현 (O)
      • get {} set {} 구현 (O)

    protocol P1 {
        var property: String { get }
    }

     

     

     

    [2] { get set } 프로퍼티

    • [저장 프로퍼티] : 반드시 var 선언 (set 으로 수정 가능하니)
    • [연산 프로퍼티] : protocol 이 get 임에도,
      • get {} 만 구현 (X)
      • get {} set {} 모두 필수!!! 구현 (O)
    protocol P2 {
        var property: String { get set }
    }

     

     

     

     

    클래스 전용 프로토콜
    : 정의 시, AnyObject를 채택!

    • struct, enum에서 사용될 수 X
    • 프로토콜 정의 시, AnyObject를 채택하면 클래스 전용 프로토콜로 만들어짐
    protocol OnlyClassProtocol: AnyObject {
    
    }

     

     

     

    댓글

Designed by black7375.