iOS & Swift

[Swift] Swift 공식문서 정리 - 3(클래스 & 구조체)

석지한 2022. 4. 4. 22:00
반응형

클래스와 구조체의 공통점

- 값을 정의하기 위한 프로퍼티 정의

- 기능을 정의하기 위한 메소드 정의

- subscript 정의

- 이니셜라이저 정의

- 기본 구현에서 기능 확장

- 프로토콜 제공

 

클래스만 가능한 기능

- 상속 : 클래스의 여러 속성을 다른 클래스에 물려 줌

- 타입 캐스팅 : 런타임에 클래스 인스턴스의 타입을 확인

- 소멸자 : 할당된 자원을 해제 시킴

- 참조 카운트 : 클래스 인스턴스에 하나 이상의 참조가 가능

 

선언 문법

class SomeClass {
    // 클래스 내용은 여기에
}
struct SomeStructure {
    // 구조체 내용은 여기에
}

예시

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

 

인스턴스 생성

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

 

프로퍼티 접근

print("The width of someResolution is \(someResolution.width)")
// "The width of someResolution is 0" 이 출력

 

구조체 멤버 초기화

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

 

구조체는 값 타입이다 !

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd

cinema.width = 2048

print("cinema is now \(cinema.width) pixels wide")
// "cinema is now 2048 pixels wide" 출력

print("hd is still \(hd.width) pixels wide")
// "hd is still 1920 pixels wide" 출력

위의 예시를 보면, hd는 초기에 주어진 1920가 출력되고, cinema.width는 새로 준 값인 2048이 출력된다.

--> 이 말은 서로 다른 공간에 저장되어 있다는 소리 !

 

클래스는 참조 타입이다 !

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0

print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// "The frameRate property of tenEighty is now 30.0" 출력

초기에 tenEighty.framRate를 25.0으로 선언해주었다. 이후에 만든 상수의 frameRate를 30.0으로 선언해주었다.

이후에 tenEighty의 frameRate를 출력해보면 30.0으로 출력이 된다.

--> 이 말은 서로 같은 공간에 저장이 되있다. 즉, class는 주소를 참조한 것이다.

 

클래스와 구조체를 사용할 때의 판별

- 구조체의 주 목적이 관계된 간단한 값을 캡슐화(encapsulate) 하기 위한 것인 경우 // 간단하게 사용할 경우

- 구조체의 인스턴스가 참조되기 보다, 복사되길 원하는 경우

- 구조체에 의해 저장된 어떠한 프로퍼티가 복사되길 원하는 경우

- 구조체가 프로퍼티 or 메소드를 상속할 필요가 없는 경우

반응형