🔥 구조체와 열거형은 값 타입

398자
5분

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에 할당됩니다. 비록 hdcinema가 같은 너비와 높이 값을 가지고 있지만, 실제로는 완전히 다른 두 개의 인스턴스랍니다.

자, 이제 cinemawidth 속성을 디지털 시네마 프로젝션에 사용되는 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

cinemahd의 현재 값을 할당할 때, hd에 저장된 이 새로운 cinema 인스턴스로 복사된 거죠. 결과적으로 동일한 숫자 값을 포함하는 완전히 분리된 두 개의 인스턴스가 생성됩니다. 따라서 cinema의 너비를 2048로 설정해도 hd에 저장된 너비에는 영향을 주지 않습니다. 아래 그림을 보시면 이해가 더 쉬울 거예요.

lecture image

열거형도 동일한 동작 방식을 따른답니다. 다음 예제 코드를 볼까요?

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

rememberedDirectioncurrentDirection의 값을 할당하면, 사실 해당 값의 복사본이 설정되는 거예요. 그 이후에 currentDirection의 값을 변경해도 rememberedDirection에 저장된 원래 값의 복사본에는 영향을 주지 않습니다.

이렇게 값 타입은 할당이나 전달 시 항상 복사가 이루어지므로, 각각의 인스턴스는 독립적인 상태를 유지할 수 있게 됩니다. 참조 타입처럼 여러 곳에서 동일한 인스턴스를 공유하며 상태 변경의 영향을 받는 일이 없죠. 이 특성 덕분에 코드의 의도를 명확히 하고 예상치 못한 부작용을 피할 수 있답니다.

구조체와 열거형을 능숙하게 다루면서 값 타입의 장점을 잘 활용한다면, 프로그램의 안정성과 예측 가능성이 크게 향상시킬 수 있습니다.