Swift 5 : 클래스와 구조체(Class and Structure)

버들비·2020년 7월 15일
0

Swift

목록 보기
6/10

변수와 함수의 묶음.

클래스와 구조체의 공통점

  • 값을 저장하는 프로퍼티를 정의할 수 있다.
  • 기능을 제공하는 메소드를 정의할 수 있다.
  • subscript 문법을 이용해 특정값에 접근할 수 있는 subscript 를 정의할 수 있다.
  • 초기 상태를 설정하는 initializer 를 정의할 수 있다.
  • 익스텐션(Extension)을 통한 기능 확장
  • 프로토콜(Protocol)의 conform.

클래스와 구조체의 차이점

클래스는 참조 타입이고, 구조체는 값 타입이다. 원본이 변경되었을때 원본을 참조하고 있던 클래스는 전부 변경되지만, 값 타입인 구조체는 상관없다.
그외 기능적인 측면에서, 클래스는 가능하지만 구조체에선 안되는 것들이 있다. 애플은 기본적으로 구조체를 사용하되, 클래스에서만 가능한 일이 필요할때만 클래스를 이용하는걸 권장한다.

클래스에서만 가능한 기능은 다음과 같다.

  • 상속
  • 타입 캐스팅
  • 소멸자 메서드 이용(deinit)
  • 런타임에서 클래스는 인스턴스의 유형을 식별할 수 있지만 구조체는 그렇지 않다

클래스와 구조체의 선언

기능적인 부분은 다르지만 클래스와 구조체의 선언문법은 같다. 클래스는 class 키워드를, 구조체는 struct 키워드를 사용한다.

struct Resolution {
    var width: Int = 0
    var height: Int = 0
}
class VideoMode {
    var resolution = Resolution()  // 위 Resolution 구조체를 값으로 사용
    var interlaced: Bool = false
    var frameRate: Float = 0.0
    var name: String?
}

let someResolution = Resolution()    // 구조체 인스턴스 생성
let someVideoMode = VideoMode()    // 클래스 인스턴스 생성

이때 클래스나 구조체를 선언하는 것은 swift 내에서 완전 새로운 타입을 선언하는 것이다. 그래서 UpperCamelCase를 이용해 선언한다. 프로퍼티나 메소드는 lowerCamelCase를 이용한다.

점(.) 문법을 이용해 클래스/구조체 인스턴스의 프로퍼티에 접근할 수 있다. 하위레벨 프로퍼티도 접근할 수 있다.

print("The width of someResolution is \(someResolution.width)")
// "The width of someResolution is 0" 이 출력
print("The width of someVideoMode is \(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is 0" 이 출력
someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
// "The width of someVideoMode is now 1280" 이 출력

위 코드처럼 resolution 전체의 값을 설정하지 않고 width 프로퍼티만 설정할 수 있다.

구조체의 초기화

모든 구조체는 초기화시 프로퍼티를 선언할 수 있는 이니셜라이저(initializer)를 자동으로 생성해 제공한다. 구조체 안에 width와 height 프로퍼티만 정의했다면 다음 코드와 같이 초기화해서 사용할 수 있다.

let vga = Resolution(width: 640, height: 640)

참조 판별을 위한 식별 연산자

클래스는 참조타입이기 때문에 여러 상수와 변수에서 같은 인스턴스를 참조할 수 있다. 상수와 변수가 같은 인스턴스를 참조하고 있는지 비교하기 위해 식별 연산자를 사용한다.

=== : 두 상수나 변수가 같은 인스턴스를 참조하고 있는 경우 true
!== : 두 상수나 변수가 다른 인스턴스를 참조하고 있는 경우 true

식별 연산자(===)는 참조를 비교하는 것이고, 비교 연산자(==)는 값을 비교한다는 차이가 있다.

reference

The Swift Language Guide

0개의 댓글