🔥 구조체와 열거형은 값 타입
Swift에서는 구조체와 열거형이 모두 값 타입(Value Type)
으로 분류됩니다. 값 타입은 변수나 상수에 할당되거나 함수에 전달될 때 해당 값이 복사
되는 특징을 가지고 있죠. 사실 여러분은 이전 장에서 이미 값 타입을 광범위하게 사용해 왔습니다. Swift의 기본 타입인 정수, 부동 소수점 수, 불리언, 문자열, 배열, 딕셔너리는 모두 값 타입이며, 내부적으로는 구조체로 구현되어 있답니다.
이제 값 타입의 특성을 좀 더 자세히 살펴볼까요? 다음 예제 코드를 함께 보시죠.
let hd = Resolution(width: 1920, height: 1080) // 1920x1080 해상도로 hd 상수 선언 var cinema = hd // hd를 cinema에 할당
swift
위 코드에서는 hd
라는 상수를 선언하고, 풀 HD 비디오 해상도인 1920x1080으로 초기화된 Resolution
인스턴스를 할당합니다. 그리고 cinema
라는 변수를 선언한 후 hd
의 현재 값을 할당하고 있죠. Resolution
은 구조체이므로, 기존 인스턴스가 복사
되어 cinema
에 할당됩니다. 비록 hd
와 cinema
가 같은 너비와 높이 값을 가지고 있지만, 실제로는 완전히 다른 두 개의 인스턴스랍니다.
자, 이제 cinema
의 width
속성을 디지털 시네마 프로젝션에 사용되는 2K 표준 너비인 2048 픽셀로 변경해 볼게요.
cinema.width = 2048 // cinema의 width를 2048로 변경 print("cinema is now \(cinema.width) pixels wide") // "cinema is now 2048 pixels wide" 출력
swift
cinema.width
를 확인해 보면 2048로 변경되었음을 알 수 있습니다. 하지만 원래의 hd
인스턴스의 width
속성은 여전히 이전 값인 1920을 유지하고 있어요.
print("hd is still \(hd.width) pixels wide") // "hd is still 1920 pixels wide" 출력
swift
cinema
에 hd
의 현재 값을 할당할 때, hd
에 저장된 값
이 새로운 cinema
인스턴스로 복사된 거죠. 결과적으로 동일한 숫자 값을 포함하는 완전히 분리된 두 개의 인스턴스가 생성됩니다. 따라서 cinema
의 너비를 2048
로 설정해도 hd
에 저장된 너비에는 영향을 주지 않습니다. 아래 그림을 보시면 이해가 더 쉬울 거예요.
열거형도 동일한 동작 방식을 따른답니다. 다음 예제 코드를 볼까요?
enum CompassPoint { case north, south, east, west mutating func turnNorth() { self = .north } } var currentDirection = CompassPoint.west let rememberedDirection = currentDirection currentDirection.turnNorth() print("The current direction is \(currentDirection)") print("The remembered direction is \(rememberedDirection)") // "The current direction is north" 출력 // "The remembered direction is west" 출력
swift
rememberedDirection
에 currentDirection
의 값을 할당하면, 사실 해당 값의 복사본이 설정되는 거예요. 그 이후에 currentDirection
의 값을 변경해도 rememberedDirection
에 저장된 원래 값의 복사본에는 영향을 주지 않습니다.
이렇게 값 타입은 할당이나 전달 시 항상 복사가 이루어지므로, 각각의 인스턴스는 독립적인 상태를 유지할 수 있게 됩니다. 참조 타입처럼 여러 곳에서 동일한 인스턴스를 공유하며 상태 변경의 영향을 받는 일이 없죠. 이 특성 덕분에 코드의 의도를 명확히 하고 예상치 못한 부작용을 피할 수 있답니다.
구조체와 열거형을 능숙하게 다루면서 값 타입의 장점을 잘 활용한다면, 프로그램의 안정성과 예측 가능성이 크게 향상시킬 수 있습니다.