본문 바로가기
Swift/Language Guide

Structures and Classes - #1/1

by diosmio 2021. 9. 12.

서문

  • Swift에서는 구현한 struct와 class에 대해 별도의 인터페이스와 구현 파일을 만들 필요가 없다
    단일 파일로 struct 또는 class를 정의하면 외부 인터페이스가 자동으로 다른 코드에서 사용할 수 있습니다
    (당최 무슨 말인지 모르겠으니 더 읽어보자)
  • Swift에서는 객체(object)보다는 인스턴스로 표현한다
  • 다른 언어대비 struct와 class가 기능적으로 훨씬 가깝다

 

 

Struct와 Class 비교

  • Swift에서는 struct와 class간 기능적으로 유사하고 공통점이 많다
  • 클래스의 추가 기능은 복잡성을 증가시키기 때문에
  • 일반적으론 추론이 쉬운 Struct 사용을 선호하고 / 필요할 때 Class를 사용합니다
  1. Struct와 Class의 공통 기능
    • 저장 프로퍼티를 가짐
    • 메서드 정의 가능
    • 서브스크립트 정의 가능 (이건 아직 모르겠다)
    • init( ) 정의 가능
    • extension 사용 가능
    • 프로토콜 사용 가능
  2. Class만의 추가 기능
    • 상속 가능
    • 타입 캐스팅을 사용하여 런타임에 클래스 인스턴스의 타입을 확인하고 해석할 수 있다???
    • deinit( )을 정의할 수 있다
    • 참조 카운팅은 하나 이상의 클래스 인스턴스 참조를 허락합니다???
  3. Struct만의 기능
    • 멤버 프로퍼티 초기화를 다음과 같이 간편한 구문으로 구현할 수 있다
      let vga = Resolution(width: 640, height: 480)​
  4. 정의
      • 모든 프로퍼티에 default 정의
      • class의 저장 프로퍼티로 struct 인스턴스 사용
      • name은 optional로 정의
      struct Resolution {
          var width = 0
          var height = 0
      }
      class VideoMode {
          var resolution = Resolution()
          var interlaced = false
          var frameRate = 0.0
          var name: String?
      }​예제
  5. 인스턴스 생성
    • 예제
      • init 함수를 정의했다면 실행된다
      let someResolution = Resolution() let someVideoMode = VideoMode()
      let someResolution = Resolution()
      let someVideoMode = VideoMode()​
  6. 프로퍼티 사용
    • 예제
      • dot으로 접근
        print("The width of someVideoMode is now \(someVideoMode.resolution.width)")​

 

 

Struct와 enum은 값 타입이다

  1. 기본
    • 상.변수로 할당될 때나 함수로 전달될 때 copy되어 전달된다
    • 그러므로 새로이 할당한 변수나, 함수에서 전달받은 것을 변경한다고 해서 원본에는 영향이 없다
    • 지금까지 다루었던 모든 기본 타입(정수, 부동소수점, 부울, 문자열, 딕셔너리 등)은 값 타입이며 struct로 구현되어 있다
    • 실제로는 최적화가 적용되어 요소가 수정될 때만 새로 복사된다
    • 예제
      let hd = Resolution(width: 1920, height: 1080)
      var cinema = hd
      cinema.width = 2048
      //Struct는 값 타입이므로
      //cinema를 변경하더라도 hd에는 영향이 없다​
  2. 값 타입은 인스턴스를 상수로 선언하면 프로퍼티도 변경이 불가하다
    struct def {
        var num = 1
    }
    
    let b = def()
    //컴파일 에러
    b.num = 2​

    • b를 상수로 생성하면 프로퍼티 num이 변수더라도 변경이 불가하다
    • b에는 def( )로 인해 생성된 "인스턴스 자체"가 저장된다.
    • 그러므로 b.num을 변경한다는 것은 b를 변경하는 것과 같은 일이 되는 원리로 동작하여 변경이 불가하다

 

 

 

Class는 참조 타입이다

  1. 기본
    • 참조 타입은 상.변수로의 할당 및 함수 parameter 전달에 있어 copy본이 아닌 인스턴스의 참조를 전달한다
    • 실제로는 하나의 인스턴스에 다른 2개의 이름을 갖는 것과 같다
    • 예제
      let tenEighty = VideoMode()
      tenEighty.resolution = hd
      tenEighty.interlaced = true
      tenEighty.name = "1080i"
      tenEighty.frameRate = 25.0
      
      let alsoTenEighty = tenEighty
      alsoTenEighty.frameRate = 30.0
      //tenEighty.frmaeRate 역시 30.0으로 변경됨​
  2. 참조 타입은 인스턴스를 상수로 선언하더라도 프로퍼티는 변경이 가능할 수 있다
    class abc {
        var num = 1
    }
    
    let a = abc()
    a.num = 2​

    • a가 상수더라도 프로퍼티 num이 변수면 변경이 가능하다
    • a는 값 타입에서와 달리, 생성된 "인스턴스 자체"가 저장되는게 아닌 생성된 "인스턴스에 대한 참조"가 저장된다
    • a.num = 2로 인해 변경되는 것은 a가 아니라 a가 참조하는 인스턴스가 바뀌게 되는 원리로 동작하여 변경이 가능하다
  3. 식별 연산자
    • Class는 참조 타입이므로 여러 상.변수가 실제론 하나의 Class 인스턴스를 가리킬 수 있다
    • 코드간 거리가 멀면 헷갈리므로 확인하는 방법이 제시되었다
    • ===와 !==
      if tenEighty === alsoTenEighty {
      		//They refer to same Class Instance
          ...
      }
      
      if tenEighty !== alsoTenEighty {
      		//They refer to different Class Instance
          ...
      }​
  4. 포인터
    • 일부 참조 타입의 인스턴스를 참조하기 위해 음... 이건 나중에 보자

 

 

 

'Swift > Language Guide' 카테고리의 다른 글

Methods - #1/1  (0) 2021.09.12
Properties - #1/1  (0) 2021.09.12
Control Flow - #2/2  (0) 2021.09.12
Control Flow - #1/2  (0) 2021.09.12
Functions - #1/1  (0) 2021.09.12

댓글