본 글은 Swift Language Guide 한국어 번역본을 참고하여 작성하였습니다.
기본적인 struct와 class
구조체와 클래스는 모두 데이터를 캡슐화하는 사용자 정의 타입을 모델링한다.
정의 구문
구조체와 클래스는 유사한 정의 구문을 가진다. 학생 정보를 담는 Student라는 이름의 구조체와 사람에 대한 정보를 담는 Person이라는 class를 예시로 들어 보겠다.
struct Student {
var grade: Int = 0
}
class Person {
var name: String = ""
var age: Int = 0
}
Student 구조체와 Person 클래스는 단지 Student 또는 Person의 형태만 나타내고 어떤 Student인지, 어떤 Person인지에 대해 설명하지 않는다. 이를 위해 인스턴스 생성을 해야 한다.
인스턴스 생성
구조체와 클래스의 인스턴스를 생성하는 초기화 구문도 굉장히 유사하다.
var studentA = Student()
var person = Person()
이렇게 인스턴스를 생성하면 모든 프로퍼티가 기본 값으로 초기화된 채로 생성이 된다.
프로퍼티 접근
내부 프로퍼티의 값을 바꾸고 싶을 때는 아래 코드와 같이 .
구문으로 접근 후 값을 바꿀 수 있다.
studentA.grade = 1
person.age = 20
struct와 class의 비교 (값 vs 참조)
구조체와 클래스는 많은 공통점을 가지고 있지만 다음과 같은 차이점이 있다.
구조체는 값 타입(value type)
이고 클래스는 참조 타입(reference type)
이다.
값 타입 (value type)
값 타입이란 변수 또는 상수에 할당할 때나 함수에 전달될 때 복사되는 값인 타입이다.
아래 예시를 보자. grade값이 1인 studentA를 생성하고 studentB를 studentA로 초기화한 후 studentB의 grade 값을 변경해 주었다. 두 인스턴스를 출력해 보면 grade 값이 다른 것을 확인할 수 있다.
var studentA = Student(grade: 1)
var studentB = studentA
studentB.grade = 2
print(studentA)
print(studentB)
// 출력
// Student(grade: 1)
// Student(grade: 2)
복사를 한다는 것은 원본은 유지한 채로 새로운 인스턴스(또는 변수 등)를 만든다는 것이고 studenA와 studentB는 각각 독립된 인스턴스이기 때문에 위 출력처럼 뜨는 것이다.
참조 타입 (reference type)
참조 타입은 이와 다르게 변수 또는 상수에 할당될 때나 함수로 전달될 때 복사되지 않고 존재하는 같은 인스턴스에 대한 참조가 사용된다.
위와 같은 방식으로 두 personA와 personB를 생성하고 personB의 age 값을 변경해주었다. 이때 두 인스턴스의 age를 출력해보면 후에 변경된 값이 21로 같다는 것을 확인할 수 있다.
var personA = Person(name: "사람1", age: 20)
var personB = personA
personB.age = 21
print("personA age: \(personA.age)")
print("personB age: \(personB.age)")
// 출력
// personA age: 21
// personB age: 21
참조를 한다는 것은 personA에서 생성한 Person 인스턴스를 personB가 그대로 받아서 이 두 인스턴스는 같은 인스턴스를 가리키게 되는 것이다.
이외 차이점
이번 포스트에서 다루고 싶었던 것은 값 타입과 참조 타입에 대한 구분이다. 이외에 아래는 클래스만 가능한 기능이니 참고하면 좋을 것 같다.
* 클래스 간 상속이 가능하다.
* 타입 캐스팅을 사용하면 런타임에 클래스 인스턴스의 타입을 확인하고 해석할 수 있다.
* 초기화 해제 구문 (Deinitializers) 을 사용하면 클래스의 인스턴스가 할당된 리소스를 해제할 수 있다.
* 참조 카운팅은 하나 이상의 클래스 인스턴스 참조를 허락한다.
식별 연산자
위의 예시와 같이 하나의 인스턴스를 두 개의 이름을 가지고 접근하게 되는 경우 단일 인스턴스에 참조하는 여러 개의 변수 또는 상수를 가질 수 있다.
두 개의 상수 또는 변수가 같은 인스턴스를 참조하는지 확인하기 위해 Swift는 다음과 같은 연산자를 제공한다.
- 동일 인스턴스 ===
- 동일하지 않은 인스턴스 !==
print(personA === personB)
print(personA !== personB)
// 출력
// true
// false
'Swift' 카테고리의 다른 글
[Swift] 싱글톤(Singleton) 패턴 (3) | 2024.10.20 |
---|---|
[Swift] Swift 문법의 기본 - 상수와 변수 (0) | 2024.01.10 |