8.1.3 인스턴스

구조체와 클래스를 사용하는 방법을 알아봅시다. 우리가 정의한 구조체나 클래스를 그대로 사용해서 값을 저장하거나 메서드를 실행할 수는 없습니다. 프로그래밍에서는 실질적인 값을 저장하고 사용하려면 메모리 공간을 할당받은 객체가 필요합니다.

구조체나 클래스는 실행할 수 있는 객체가 아니라, 값을 담을 수 있는 실질적인 그릇을 만들어내기 위한 일종의 틀로 생각해야 합니다. 즉 원형(Origin)이라는 것입니다. 틀 역할을 하는 구조체나 클래스를 정의하고 이를 바탕으로 실질적으로 값을 담을 여러 개의 그릇을 만들어내는 것, 이것이 객체지향 프로그래밍의 원리입니다.

이렇게 원형 틀을 이용해 찍어낸 그릇을 인스턴스(Instance)라고 합니다. 컴퓨터공학적으로 이야기해 보면 타입의 설계도를 사용하여 메모리 공간을 할당받은 것이 인스턴스입니다. 우리는 이 인스턴스를 이용해 값을 저장하거나 처리해야 합니다.

// Resolution 구조체에 대한 인스턴스를 생성하고 상수 insRes에 할당
let insRes = Resolution()

// VideoMode 클래스에 대한 인스턴스를 생성하고 상수 insVMode에 할당
let insVMode = VideoMode()

위 예제에서 구조체와 클래스 각각의 인스턴스를 생성하고 있습니다. 객체가 초기화되면서 인스턴스가 생성되고, 이 값을 변수나 상수에 할당하면 이제 원하는 곳에서 사용할 수 있게 됩니다. 이 구문을 인스턴스 생성 구문이라고 합니다. 인스턴스를 생성하는 가장 단순한 형태는 Resolution()이나 VideoMode()처럼 구조체나 클래스의 이름 뒤에 빈 괄호를 붙이는 것입니다. 함수를 배울 때 사용했던 호출 연산자와 모양은 같지만 의미는 다릅니다. 함수의 이름 다음에 다음에 오면 함수 호출 연산자 역할을 하고, 클래스나 구조체 이름 다음에 오면 인스턴스 생성 연산자가 됩니다.

프로퍼티는 오직 인스턴스를 통해서만 접근할 수 있습니다. 인스턴스가 생성되지 않은 상태에서는 프로퍼티도 존재하지 않는 것이나 마찬가지입니다. 프로퍼티에 접근하려면 인스턴스를 먼저 생성해야 합니다. 프로퍼티에 접근할 때는 점 문법(Dot Syntax)을 이용하여 인스턴스의 하위 객체에 접근할 수 있습니다. 점 앞이나 뒤에는 공백이 없어야 합니다.

<인스턴스 이름>.<프로퍼티 이름>

점 구문을 이용해 인스턴스의 속성에 접근해 보겠습니다

let width = insRes.width
print("insRes 인스턴스의 width 값은 \(width)입니다")

// 실행 결과
insRes 인스턴스의 width 값은 0입니다

Resolution 구조체에 선언된 width 속성을 참조하려면 인스턴스가 필요합니다. 생성된 인스턴스 insRes와 속성 width를 점 구문으로 연결하면 insRes이 되는데, 이를 이용하면 속성의 값을 읽어올 수 있습니다. insRes.width 프로퍼티는 구조체 내에서 대입된 값으로 초기화되며, 이후 값을 수정하지 않았으므로 출력 0입니다.

만약 객체에 정의된 프로퍼티가 서브 프로퍼티를 가지고 있는 객체라면 다음과 같이 계속 점 구문을 이용하여 단계적으로 접근할 수 있습니다.

<인스턴스 이름>.<프로퍼티 이름>.<프로퍼티의 서브 프로퍼티 이름>

이에 대한 예를 살펴보기 위해 앞서 작성했던 VideoMode 클래스를 조금 수정해보겠습니다.

class VideoMode {
    var interlaced = false
    var frameRate = 0.0
    var name: String?
    
    var res = Resolution()
    
    ... 중략 ...
}

// VideoMode 클래스에 대한 인스턴스를 생성하고 상수에 할당
let vMode = VideoMode()

print("vMode 인스턴스의 width 값은 \(vMode.res.width)입니다")

// 실행 결과
vMode 인스턴스의 width 값은 0입니다

추가된 프로퍼티 res는 VideoMode 클래스의 프로퍼티이자 동시에 Resolution 구조체의 인스턴스입니다. 따라서 res 프로퍼티 하위에는 width 프로퍼티가 존재합니다. Resolution 구조체에서 정의된 속성입니다. 개념적으로는 vMode -> resolution -> width로, width 프로퍼티에 접근하려면 다음과 같이 단계적으로 접근해야 합니다.

vMode.res.width

점 구문은 프로퍼티에 값을 대입할 때에도 사용됩니다.

// 점 구문을 이용하여 인스턴스의 프로퍼티에 값을 할당
vMode.name = "Sample"
vMode.res.width = 1280

print("\(vMode.name!) 인스턴스의 width 값은 \(vMode.res.width)입니다")

// 실행 결과
Sample 인스턴스의 width 값은 1280입니다

프로퍼티의 하위 프로퍼티에 값을 할당할 때도 위와 같이 점 구문을 연속으로 연결하여 값을 할당할 수 있습니다. 이러한 방식을 사슬이 계속 연결되는 방식과 비슷하다 하여 체인(Chain)이라고 합니다. 이러한 체인 방식은 생산성 향상에 많은 도움을 줍니다.

Last updated