Swift 문법종합반 심화(1)

이유진·2024년 3월 11일
0

Swift 문법종합반

목록 보기
4/5

03. 접근제한자

  • 접근 제한자
    • 다른 소스 파일이나 모듈의 코드에서 코드 일부에 대한 접근 제한
    • 제약
      open < public < internal < fileprivat < private
    • 접근 제한자 작성하지 않는 경우 internal로 판단
    • 상위 요소보다 하위 요소가 제약이 더 적은 접근 수준 가질 수 없다
  • 모듈 / 소스 파일
    • 모듈: 배포할 코드 묶음 단위
    • 소스파일: 하나의 swift 소스 코드 파일
  • 종류
    • open : 모듈 외부 접근 가능, 모든 소스 파일에서 접근 가능, 다른 모듈에서도 서브 클래싱 가능
    • public : 모듈 외부 접근 가능, 모든 소스 파일에서 접근 가능, 같은 모듈 내에서만 서브클래싱 가능
    • internal : 디폴트 접근 제어자, 외부 모듈 접근 불가능
    • fileprivate : 소스 파일 내부에서만 접근 가능, 같은 소스 파일의 서로 다른 클래스 접근 가능
    • private : 같은 파일 내부에서도 다른 클래스이면 접근 불가능
  • Mutating
    • 구조체 Structs 와 열거형 Enum 에서 사용

    • 메서드 Method가 속성 수정할 수 있도록 하는 키워드

      // 구조체 예시
      struct Point {
          var x = 0.0, y = 0.0
      
          mutating func moveBy(x deltaX: Double, y deltaY: Double) {
              x += deltaX
              y += deltaY
          }
      }
      
      var point = Point(x: 1.0, y: 1.0)
      print("Before moving: x = \(point.x), y = \(point.y)")
      
      point.moveBy(x: 2.0, y: 3.0)
      print("After moving: x = \(point.x), y = \(point.y)")
      
      // Before moving: x = 1.0, y = 1.0
      // After moving: x = 3.0, y = 4.0
      
      // 열거형 예시
      enum TrafficLight {
          case red, yellow, green
      
          mutating func next() {
              switch self {
              case .red:
                  self = .green
              case .yellow:
                  self = .red
              case .green:
                  self = .yellow
              }
          }
      }
      
      var currentLight = TrafficLight.red
      print("Current light is \(currentLight)")
      
      currentLight.next()
      print("Next light is \(currentLight)")
      
      // Current light is red
      // Next light is green

04. 클로저

  • 클로저
    • 이름 없는 함수, 익명 함수
    • 상수,변수 참조 “캡쳐 Capture”해서 저장
      • 값 vlalue 캡쳐: 변수나 상수의 값 캡쳐 , 캡쳐 값 변경되어도 원본 값 변경 X

      • 참조 reference 캡쳐: 변수나 상수의 참조 캡쳐, 캡쳐 값 변경 되면 원본 값도 변경

        // 값 캡처
        func makeIncrementer(forIncrement amount: Int) -> () -> Int {
            var total = 0
            
            // 클로저를 반환합니다.
            let incrementer: () -> Int = {
                // total 변수를 캡처하여 저장합니다.
                total += amount
                return total
            }
            
            return incrementer
        }
        
        let incrementByTen = makeIncrementer(forIncrement: 10)
        
        print(incrementByTen()) // total = 10, 결과: 10
        print(incrementByTen()) // total = 20, 결과: 20
        
        
        		```
        		()Int는 함수 makeIncrementer의 타입으로,‘매개변수가 없고 정수를 반환하는 함수’를 의미한다.  
        			
                프로퍼티인 let incrementer: ()Int 타입과 동일하기 때문에retrun incrementer가 가능하다!
        			
                let incrementByTen 에는 return 타입인 ()Int, 즉 함수가 들어가 있다.
        			
                print(incrementByTen()) 파라미터 없으므로 빈 () 사용해서 실행
        		```
        // 참조 캡처
        class SimpleClass {
            var value: Int = 10
        }
        
        func createClosure() -> () -> Int {
            let instance = SimpleClass()
            
            // 참조 캡처를 사용하여 SimpleClass의 인스턴스를 캡처합니다.
            let closure: () -> Int = {
                // 클로저가 참조하는 인스턴스의 속성을 업데이트합니다.
                instance.value *= 2
                //let instance의 instance 캡쳐해 value에 접근한다.
                return instance.value
            }
            
            return closure
        }
        
        // 클로저 생성
        let myClosure = createClosure()
        
        print(myClosure()) // 20
        print(myClosure()) // 40
        
        // 클로저 내부에서 참조된 인스턴스의 속성을 변경하였으므로 원본에도 영향을 줍니다.
    • 클로저 사용 이유? 기능 저장, 비동기 처리
    • 클래스처럼 참조 타입이다!

0개의 댓글