[Swift] 기본 내용 복습

GomHyeok·2024년 8월 2일

회고록

목록 보기
16/18

📚Swift 언어 기본 내용 복습

📙 변수와 상수

  • 변수와 상수의 차이
    • 변수는 선언 이후 값의 변경이 가능하지만 상수는 불가능
    • 변수 = var, 상수 = let
    • 변수 = 참조하는 주소값의 변경 가능, 상수 = 참조하는 주소값 변경 불가능
  • 참조하는 주소값의 변경은?
class example {
	var num : Int
    
    init(_ num : Int) {
    	self.num = num
    }
}

해당 클래스의 인스턴스가 있는 경우 상수는 값을 변경할 수 없다.
class는 참조타입이기 때문에 각 변수와 상수에는 주소값이 들어있기 때문이다.

단 인스턴스 내부의 값은 주소값이 변경이 없기 때문에 변경이 가능하다.

  • 타입 추론
    • 변수와 상수는 타입을 명시할 수 있고 생략도 할 수 있다.
    • 생략하는 경우 컴파일러가 타입 추론을 통한 타입 지정
    • 추론 과정 때문에 컴파일에 더 오랜 시간이 소비될 수 있다.

📙Class/Struct

  • 차이점
    • struct = Value Type, class = Reference Type
      • 전달시에 차이 발생
        (ValueType = 새로운 인스턴스 생성, ReferenceType = 주소 전달)
    • 따라서 class는 ARC(Automatic Reference Counting)를 통해 메모리 관리
    • 상속의 유무(class는 가능하지만 struct는 불가능)
  • 공통점
    • 프로퍼티와 메서드 정의가 가능하다
    • 이니셜라이저 통해 초기 상태 지정 가능
    • extension 통한 확장
    • 프로토콜 준수 가능
  • 사용 시점(Apple 권장사항)(struct에 대하여)
    • 연관된 값의 캡슐화 목적
    • 프로퍼티에 대하여 참조보다는 복사하는 것이 더 적합할 때
    • 상속의 필요가 없을 때
  • swift의 복사방식
    • COW 방식 사용
      • 원본과 복사본 중 하나가 수정되기 전까지 리소스 공유하다 수종되면 복사 작업 진행
    • 첫 번째 수정시(복사 작업 진행) -> 약간의 오버헤드 발생
    • collection type 복사시에만 사용(Array, Set, Dictionary)
    • COW는 시간, 공간 효율중 공간의 효율 선택 -> 메모리 낭비 방지
  • class 성능 향상 방법 = final
    • Static Dispatch 사용으로 오버헤드 감소
    • class는 메소드 오버라이딩이 가능하여 Dynamic Dispatch 사용
    • final 사용시 상속이 불가능 하여 static 사용
      • Dynamic 사용시 런타임에 실행 메소드 결정, Static은 컴파일 타임에 결정
        • 위의 시점 차이로 인해 오버헤드 감소 효과 생성
  • Dispatch란?
    • 어떤 메서드 호출할지 결정하여 실행하는 메커니즘
    • ValueType은 staticDispatch 사용하며 참조타입은 오버라이딩 유무에 따라 결정

WMO(Whole Modeule Optimization)
모듈 전체를 하나의 덩어리로 컴파일 -> internal level에 대해 오버라이딩 되지 않는 경우 내부적으로 final 부착 -> 상속되지 않는 클래스에 대해 Dynamic Dispatch의 사용을 줄임
!swift는 파일을 하나씩 컴파일하여 서로 다른 파일에서 상속되었는지 알수 없기 때문에 기본적으로 final을 부착하지 않음!

  • 타입 캐스팅
    • 실제 타입을 바꾸는 것이 아닌 사용 범위의 전환
      • 업캐스팅의 경우를 생각하면 하위 클래스의 프로퍼티와 메서드를 사용하는 것이 불가능 해질 뿐 실제 type이 변하지 않음
    • 업캐스팅은 무조건 전환 가능 -> as 사용
    • 다운캐스팅은 실패 가능성 존재 -> as? , as! 사용 -> as!의 경우 런타임 에러 가능

📙접근 제어자

  • 종류 : open, public, internal, fileprivate, private 존재

  • open과 public의 차이는?

    • 공통점
      • 외부 모듈까지 접근을 허용한다.
    • 차이점
      • open은 모듈 외부에서 상속, 오버라이딩 가능 -> class 또는 class 멤버만 사용 가능
      • public은 모듈 외부에서 상속 불가능
  • fileprivate과 private의 차이

    fileprivate은 구현 소스파일 내부에서만 사용 가능, private는 기능을 정의, 구현한 범윈 내에서만 사용 가능

이부분이 아직 잘 이해가 가지 않는다

profile
github : https://github.com/GomHyeok/

0개의 댓글