티스토리 뷰

클래스와 구조체는 코드의 조직화와 객체화를 위하여 반드시 필요한 요소이다. 그만큼 익숙하기도 한데, 기초적인 부분부터 복습한다는 느낌으로 정리해보려고 한다.

 

구조체와 클래스는 값과 메서드를 내부에서 정의하고 그 기능을 확장한다는 맥락에서는 동일하지만, 다음 4가지 특징은 클래스만의 고유 특징이다. 

 

- 상속

- 타입 캐스팅: 런타임에 클래스 인스턴스의 타입을 확인

- 소멸자

- 참조 카운트: 클래스 인스턴스에 하나 이상의 참조가 가능


1. 선언 문법

class SomeClass {
    // 클래스 내용은 여기에
}

struct SomeStructure {
    // 구조체 내용은 여기에
}

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

class VideoMode {
    var resolution = Resolution()  // 위 Resolution 구조체를 값으로 사용
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

 

인스턴스는 아래와 같이 생성자를 호출하여 생성한다.

let someResolution = Resolution()    // 구조체 인스턴스 생성
let someVideoMode = VideoMode()    // 클래스 인스턴스 생성

 

Java나 python 과 동일하게 dot(.)을 사용하여 해당 프로퍼티의 값에 접근할 수 있다.

print("The width of someResolution is \(someResolution.width)")
// "The width of someResolution is 0" 이 출력

 

또한 모든 구조체는 초기화 시 프로퍼티를 선언할 수 있는 초기 생성자를 자동으로 생성하여 제공한다. 즉, 아래와 같은 맴버의 초기화는 구조체 안에 width와 height 프로퍼티만 정의했다면 자동으로 사용이 가능하다는 의미이다.

let vga = Resolution(width: 640, height: 480)

2. 구조체와 열거형은 값 타입!

값 타입이라는 의미는 참조 타입과 대조되는 관계로 해당 구조체나 열거형의 인스턴스가 상수나 변수에 전달될 때, 그 값을 메모리로 바로 참조하는 것이 아니라 복사하여 전달된다는 의미이다.

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

cinema.width = 2048

print("cinema is now \(cinema.width) pixels wide")
// "cinema is now 2048 pixels wide" 출력

print("hd is still \(hd.width) pixels wide")
// "hd is still 1920 pixels wide" 출력

3. 클래스는 참조 타입!

값 타입과 달리 참조 타입은 변수나 상수에 값을 할당을 하거나 함수에 인자로 전달할 때 그 값이 메모리에 복사되는 곳이 아닌, 참조된다. 

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0

print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// "The frameRate property of tenEighty is now 30.0" 출력

 

참조 타입은 식별 연산자(===) 를 통하여 두 상수나 변수가 같은 인스턴스를 참조하고 있는 지 확인할 수 있다.

if tenEighty === alsoTenEighty {
print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// "tenEighty and alsoTenEighty refer to the same VideoMode instance." 출력

 

Comments