TIL(Today I Learned)

3주차
  • 클래스 - property와 method로 구성되어있으며 initializer를 통해 초기값을 설정, 클래스는 상속이 가능
    • 클래스 구조
        class Rectangle() {
        var with: Int = 5;  /* property */
        var height: Int = 10 
              
        init (width: Int, height: Int) {    /* initializer */
            self.width = width
            self.height = height
        }
      
        func getArea() -> Int {     /* method */
            var area = self.width * self.height
            return area
        }
        }
      
  • final - 서브클래스에서 특정 메서드, 프로퍼티, 클래스 전체 등이 오버라이드 되어 재정의 되는 것을 막을 수 있음
  • 구조체 - 생성자를 정의하지 않으면 구조체가 자동으로 생성자를 제공, 구조체는 상속이 불가능
  • 메모리
    • Heap - 동적할당 영역으로 사용자의 동적 할당에 기반하고 런타임에 크기가 결정
    • Stack - 메서드 호출 시 메서드의 지역 변수, 매개 변수, 리턴 값 등이 저장되고 메서드가 종료되면 지정된 메모리도 해제, 컴파일 타임에 크기가 결정
  • ARC(Automatic Reference Counting) - swift에서 자동으로 메모리를 관리해주는 방식, reference counts가 0이 되면 더 이상 참조되지 않는다고 판단하고 메모리에서 할당 해제
  • 프로퍼티 옵저버 - 프로퍼티 값의 변경 사항을 모니터링하고, 미리 구현한 코드로 이에 대응이 가능
    1. didSet - 새 값이 저장된 직후 호출 / oldValue
    2. willSet - 값이 저장되기 직전에 호출 / newValue
  • 접근 제한자 - open < public < internal < fileprivate < private
    1. open - 상속이 가능하게 설계
    2. public - 외부와 연결될 인터페이스 구현에 사용
    3. internal - default
    4. fileprivate - 소스 파일 내부에서만 접근
    5. private - 같은 파일 내부의 같은 클래스 내부에서만 접근
  • 타입 캐스팅 - 인스턴스를 슈퍼 클래스나 서브 클래스로 취급하는 방법
    1. as - 컴파일 단계에서 캐스팅 / 캐스팅에 실패하면 에러 -> 타입 캐스팅이 성공할 경우에만 사용
    2. as? - 런타임에 캐스팅 / 성공하면 옵셔널 실패하면 nil 반환 -> 실패할 가능성이 있을때 사용
    3. as! - 런타임에 강제 캐스팅 / 성공하면 옵셔널이 아닌 인스턴스 반환
강한 참조 순환의 문제와 해결 방법
  • 참조는 default로 강한 참조를 사용하는데 -> Memory Leak을 주의
  • 강한 참조 순환 - 두 개 이상의 인스턴스가 서로를 강한 참조하고 있을때 발생 -> 메모리가 해제되지 않고 유지되어 메모리 누수가 발생하는 현상
  • 해결 방법 - 약한 참조, 미소유 참조
    • 약한 참조 - 두 개의 객체 변수의 메모리가 해제되었을 때 약한 참조를 한 객체는 ARC에서 자동으로 객체의 메모리를 해제(nil 할당), let이 아닌 var로 선언
    • 미소유 참조 - 약한 참조와 달리 참조 값은 유지, 객체가 언제 메모리에 할당되고 해제되는지 개발자가 제어할 수 있을때 사용
Class vs Struct
  • class - 레퍼런스타입 / Heap에 레퍼런스를 저장하여 활용
  • struct - 값 타입 / Stack에 값을 복사하여 사용하기 때ㅜㄴ에 데이터가 중간에 수정될 위험이 x -> 비동기 처리에 적합
    • mutating func - 바뀐 프로퍼티 값을 가진 새로운 struct값이 복사되어 생성


4주차
  • Closure - 이름없는 함수, 코드 블럭, 상수나 변수의 참조를 캡쳐해 저장, 비동기 처리에 유용, 참조 타입
  • escaping closure - 클로저가 메서드의 인자로 전달됐을 때, 메서드의 실행이 종료된 후 실행되는 클로저, 파라미터 타입 앞에 @escaping 이라는 키워드 명시
  • 에러처리 - Error 프로토콜을 채택하여 사용자 정의 에러를 정의하여 사용
    1. throws - 리턴 값을 반환하기 전에 오류가 발생하면 에러 객체를 반환한다는 의미
    2. throw - 오류가 발생할 구간에서 사용, do~try~catch문에서 처리
      1. try? - do~catch 구문 없이도 사용 가능 / 에러가 발생하지 않으면 옵셔널 반환, 에러 발생시 nil 반환
      2. try! - 에러가 발생하지 않으면 옵셔널이 언래핑된 값이 반환, 에러 발생시 앱이 강제 종료 -> 오류가 발생하지 않는 다는 확신이 있을때 사용
5주차
  • 프로토콜
    • 특정 역할을 하기 위한 메소드, 프로퍼티, 기타 요구사항 등을 정의 해놓은 청사진
    • 프로토콜은 설계된 조건만 정의, 구현 x
    • 이름, 타입, gettable, settable 명시
    • 프로퍼티는 할상 var로 선언
  • Delegation - 특정 기능을 위임
    1. Protocol - 대리자가 수신자에게 전달한 내용의 약속
    2. Receiver - 대리자가 특정 기능을 수행 후 전달받을 대상
    3. Delegate - 수신자를 대신하여 처리할 대리자
  • Extension - structure / class / enum / protocol 타입에 새로운 기능 추가, 기종에 존재하는 기능을 재정의할 수는 x

댓글남기기