NOTE 클래스의 인스턴스는 전통적으로 객체 (object) 라고 알고 있습니다. 그러나 Swift 구조체와 클래스는 다른 언어보다 기능적으로 훨씬 가깝고 이 챕터의 대부분은 클래스 또는 구조체 타입의 인스턴스에 적용되는 기능을 설명합니다. 이 때문에 좀 더 일반적인 용어인 인스턴스 (instance) 가 사용됩니다.
struct
키워드로 클래스는 class
키워드로 시작합니다. 둘다 중괄호 안에 전체 정의가 위치합니다:NOTE 새로운 구조체 또는 클래스를 정의할 때마다 새로운 Swift 타입을 정의합니다. 표준 Swift 타입 (String
,Int
,Bool
와 같은)의 대소문자와 일치하도록 타입UpperCamelCase
이름 (SomeStructure
와SomeClass
와 같이)을 지정하십시오. 프로퍼티와 메서드는 타입 이름과 구분을 위해lowerCamelCase
이름 (frameRate
와incrementCount
와 같이)으로 지정하십시오.
Resolution
이라는 새로운 구조체를 정의합니다. 이 구조체는 width
와 height
라 불리는 저장된 프로퍼티를 가지고 있습니다. 저장된 프로퍼티는 구조체 또는 클래스의 일부로 묶여 저장되는 상수 또는 변수입니다. 이 두 프로퍼티는 정수값 0
으로 초기값이 설정되므로 Int
타입으로 유추됩니다.VideoMode
라는 새로운 클래스를 정의합니다. 이 클래스는 4개의 저장된 프로퍼티를 가지고 있습니다. 첫번재 resolution
은 Resolution
의 프로퍼티 타입으로 유추되는 새로운 Resolution
구조체 인스턴스로 초기화 됩니다. 다른 3가지 프로퍼티 경우 새로운 VideoMode
인스턴스는 interlaced
설정은 false
("비인터레이스 비디오")로 재생 프레임 속도는 0.0
으로 그리고 name
이라는 옵셔널 String
값으로 초기화 됩니다. name
프로퍼티는 옵셔널 타입이므로 자동적으로 nil
기본값으로 주어지거나 "name
값 없음" 으로 주어집니다.Resolution
구조체 정의와 VideoMode
클래스 정의는 오직 Resolution
또는 VideoMode
의 모양만 설명합니다. 자체적인 해상도 또는 비디오 모드에 대해 설명하지 않습니다. 그렇게 하려면 구조체 또는 클래스의 인스턴스 생성이 필요합니다.Resolution()
또는 VideoMode()
와 같이 클래스 또는 구조체 타입 이름 뒤에 빈 소괄호를 붙여 사용하는 것입니다. 이렇게 하면 모든 프로퍼티가 기본값으로 초기화되는 클래스 또는 구조체의 새로운 인스턴스를 생성합니다. 클래스와 구조체 초기화에 대한 자세한 내용은 초기화 (Initialization) 를 참고 바랍니다..
)로 분리하고 공백 없이 프로퍼티 이름을 작성합니다:someResolution.width
는 someResolution
에 프로퍼티 width
를 참조하고 기본값 0
을 반환합니다.VideoMode
의 resolution
프로퍼티에 width
프로퍼티와 같이 서브 프로퍼티에 접근할 수 있습니다:NOTE 배열, 딕셔너리, 문자열과 같은 표준 라이브러리에 정의된 콜렉션은 최적화를 사용하여 복사 성능 비용을 줄입니다. 즉시 복사본을 만드는 대신에 이러한 콜렉션은 원본 인스턴스와 복사본 간에 요소가 저장된 메모리를 공유합니다. 콜렉션의 복사본 중 하나가 수정되면 요소는 수정되기 직전에 복사됩니다. 코드에서 보이는 동작은 항상 바로 복사가 일어나는 것처럼 보입니다.
Resolution
구조체를 사용하는 다음 예제를 살펴봅시다:hd
라는 상수를 선언하고 풀 HD 비디오 (1920 픽셀 너비와 1080 픽셀 높이)의 너비와 높이를 초기화하는 Resolution
인스턴스를 설정합니다.cinema
라는 변수를 선언하고 hd
의 현재 값을 설정합니다. Resolution
은 구조체 이므로 기존 인스턴스의 복사본 이 만들어지고 이 새 복사본에 cinema
가 할당됩니다. hd
와 cinema
가 현재 같은 너비와 높이를 가지지만 2개는 완벽하게 다른 인스턴스 입니다.cinema
의 width
프로퍼티를 디지털 시네마 프로젝션에 사용되는 약간 더 넓은 2K 표준 (2048 픽셀 너비와 1080 픽셀 높이)으로 수정됩니다:cinema
의 width
프로퍼티를 체크하면 2048
로 바뀐 것을 확인할 수 있습니다:hd
인스턴스의 width
프로퍼티는 1920
의 기존값을 그대로 가지고 있습니다:cinema
에 hd
에 현재값이 주어졌을 때 hd
에 저장된 값 은 새로운 cinema
인스턴스에 복사됩니다. 마지막 결과는 숫자값을 포함한 2개의 완벽히 분리된 인스턴스 입니다. 그러나 분리된 인스턴스이기 때문에 아래의 그림과 같이 cinema
에 너비를 2048
로 설정해도 hd
에 저장된 너비에는 영향을 주지 않습니다:rememberedDirection
은 currentDirection
에 값이 할당될 때 실질적으로 복사본이 설정됩니다. 이후에 currentDirection
에 값을 변경해도 rememberedDirection
에 저장된 원래 값의 복사본에는 영향을 주지 않습니다.VideoMode
를 사용하는 예입니다:tenEighty
라는 새로운 상수를 선언하고 VideoMode
클래스의 새로운 인스턴스를 참조하도록 설정합니다. 비디오 모드는 이전에 1920
x 1080
의 HD 해상도의 복사본이 할당됩니다. 인터레이스로 설정되고 이름을 "1080i"
로 설정하고 프레임 속도를 초당 25.0
프레임으로 설정합니다.tenEighty
는 alsoTenEighty
라는 새로운 상수에 할당되고 alsoTenEighty
의 프레임 속도를 수정합니다:tenEighty
와 alsoTenEighty
는 실질적으로 같은 VideoMode
인스턴스를 참조합니다. 실제로는 아래 그림과 같이 같은 하나의 인스턴스에 다른 2개의 이름을 가지고 있는 것입니다:tenEighty
의 frameRate
프로퍼티를 체크하면 VideoMode
인스턴스에서 30.0
의 새로운 프레임 속도가 올바르게 설정된 것을 보여줍니다:tenEighty
와 alsoTenEighty
가 프로그램 코드가 멀리 떨어져 있다면 비디오 모드가 변경되는 모든 방법을 찾기 어려울 수 있습니다. tenEighty
를 사용할 때마다 alsoTenEighty
를 사용하는 코드를 생각해야 하며 그 반대도 마찬가지 입니다. 반대로 값 타입은 동일한 값과 상호작용하는 모든 코드가 소스 파일에 가까이 있기 때문에 추론하기가 더 쉽습니다.tenEighty
와 alsoTenEighty
는 변수가 아닌 상수 로 선언됩니다. 그러나 tenEighty
와 alsoTenEighty
상수 자체는 실제로 변경되지 않으므로 tenEighty.frameRate
와 alsoTenEighty.frameRate
는 여전히 변경 가능합니다. tenEighty
와 alsoTenEighty
자체는 VideoMode
인스턴스를 "저장"하지 않습니다. 대신에 VideoMode
인스턴스를 둘다 참조 합니다. 변경되는 것은 VideoMode
에 대한 상수 참조의 값이 아니라 VideoMode
의 frameRate
프로퍼티 입니다.===
)!==
)===
)는 같음 (equal to) (2개의 등호로 표시 또는 ==
)과 같다는 의미는 아닙니다. 동일 인스턴스 는 클래스 타입의 2개의 상수 또는 변수가 동일한 클래스 인스턴스를 잠조한다는 의미입니다. 같음 은 두 인스턴스의 값이 동일하거나 동등하다는 것을 의미합니다.==
와 !=
연산자의 자체 구현 선언의 프로세스는 등가 연산자 (Equivalence Operators) 에 자세히 설명되어 있습니다.*
)를 작성할 필요가 없습니다. 대신에 이러한 참조는 Swift의 다른 상수 또는 변수처럼 정의됩니다. 표준 라이브러리는 포인터와 직접 상호작용이 필요한 경우 사용할 수 있는 포인터와 버퍼 타입을 제공합니다. 자세한 내용은 수동 메모리 관리 (Manual Memory Management) 를 참고 바랍니다.