구조체와 클래스

2023. 8. 22. 11:17swift

 

구조체와 클래스 (Structures and Classes)

- 구조체 (Structures) 와 클래스 (classes) 는 프로그램 코드의 구성 요소가 되는 범용의 유연한 구조입니다. 상수, 변수, 그리고 함수를 정의하는 것과 같은 구문을 사용하여 구조체와 클래스에 프로퍼티와 메서드를 기능적으로 추가할 수 있습니다.

구조체와 클래스의 비교 (Comparing Structures and Classes) Swift에서 구조체와 클래스는 공통점이 많습니다. 둘다 아래의 내용이 가능합니다:
- 값을 저장하는 프로퍼티 정의
- 기능 제공을 위한 메서드 정의
- 서브 스크립트 구문을 사용하여 값에 접근을 제공하는 서브 스크립트 정의
- 초기화 상태를 설정하기 위한 초기화 정의
- 기본 구현을 넘어 기능적 확장을 위한 확장
- 특정 종류의 표준 기능을 제공하는 프로토콜 준수

클래스는 구조체에 없는 추가적인 기능이 있습니다:
- 상속을 사용하면 한 클래스가 다른 클래스의 특성을 상속할 수 있습니다.
- 타입 캐스팅을 사용하면 런타임에 클래스 인스턴스의 타입을 확인하고 해석할 수 있습니다.
- 초기화 해제 구문 (Deinitalizers) 을 사용하면 클래스의 인스턴스가 할당된 리소스를 해제할 수 있도록 합니다.
- 참조 카운팅은 하나 이상의 클래스 인스턴스 참조를 허락합니다.


struct Resolution {
    var width = 5
    var height = 5
}


class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 5.5
    var name: String?
}


let someResolution = Resolution()
let someVideoMode = VideoMode()

print("The width of someResolution is \(someResolution.width)")
 Prints "The width of someResolution is 5"

print("The width of someVideoMode is \(someVideoMode.resolution.width)")
 Prints "The width of someVideoMode is 5"

var vga = Resolution(width: 640, height: 480)
let a = vga.height
vga.height = 2000


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



enum CompassPoint {
    case north, south, east, west
    mutating func turnNorth() {
        self = .north
    }
}
var currentDirection = CompassPoint.west
let rememberedDirection = currentDirection
currentDirection.turnNorth()

//rememberedDirection 은 currentDirection 에 값이 할당될 때 실질적으로 복사본이 설정됩니다. 이후에 currentDirection 에 값을 변경해도 rememberedDirection 에 저장된 원래 값의 복사본에는 영향을 주지 않습니다.

print("The current direction is \(currentDirection)")
print("The remembered direction is \(rememberedDirection)")
 Prints "The current direction is north"
 Prints "The remembered direction is west"



클래스는 참조 타입 (Classes Are Reference Types)
- 값 타입과 반대로 참조 타입 (reference types) 은 변수 또는 상수에 할당될 때나 함수로 전달될 때 복사되지 않습니다. 복사본 대신에 존재하는 같은 인스턴스에 대한 참조가 사용됩니다.

let tenEighty = VideoMode()  // {width 5, height 5}
tenEighty.resolution = hd //{width 1920, height 1080}
tenEighty.interlaced = true // false -> true
tenEighty.name = "1080i"  //  String? -> "1080i"
tenEighty.frameRate = 25.0 // 5.5 -> 25.0

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0 // 25.0 ->30.0


print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
 Prints "The frameRate property of tenEighty is now 30.0"



식별 연산자 (Identity Operators)
클래스는 참조 타입이기 때문에 클래스의 같은 단일 인스턴스에 참조하는 여러개의 상수와 변수가 가능합니다 (구조체와 열거형은 상수 또는 변수 또는 함수에 전달할 때 항상 복사되기 때문에 클래스와 같지 않습니다).
2개의 상수 또는 변수가 클래스의 같은 인스턴스를 참조하는지 확인하는 것이 유용할 수 있습니다. 이를 위해 Swift는 2가지 식별 연산자를 제공합니다:

동일 인스턴스 (Identical to) (===)

동일하지 않은 인스턴스 (Not identical to) (!==)
if tenEighty === alsoTenEighty {
 print("같음.")
} else {
 print("다름")
}


- 동일 인스턴스 (3개의 등호로 표시 또는 ===)는 같음 (equal to) (2개의 등호로 표시 또는 ==)과 같다는 의미는 아닙니다. 동일 인스턴스 는 클래스 타입의 2개의 상수 또는 변수가 동일한 클래스 인스턴스를 참조한다는 의미입니다. 같음 은 두 인스턴스의 값이 동일하거나 동등하다는 것을 의미합니다.

- class는 참조 타입이라서 비교 개념이 가능하다
== 스택(strunt) 영역의 값을 비교  === 힙(class) 영역의 값을 비교 한다.

인스턴스가 어디서 왔는지 확인 가능하다?
동일한 타입의 인스턴스 이지만 같은 메모리 주소를 참조 하는것이 아니므로 다르다.