Swift에서 class와 struct는 프로그램의 코드를 추상화 하기 위해 사용됩니다.
모두 객체를 생성할 수 있는 데이터 타입이지만 클래스는 참조 타입(reference type), 구조체는 값 타입(value type)으로, 데이터를 캡슐화하는 데 사용되는 사용자 정의 데이터 타입입니다.
구조체와 클래스는 프로퍼티와 메소드를 사용하여 구조화된 데이터와 기능을 가질 수 있으며,
새로운 사용자 정의 데이터 타입을 만듭니다.
클래스와 구조체는 비슷하지만 몇 가지 차이점이 있습니다.
구조체는 객체처럼 메모리에서 복사되며, 참조 타입인 클래스와는 다르게 변경 시 값이 복사됩니다.
복사 및 전달방식, 상속 지원 여부, 메모리 관리 방식 등에서 차이가 발생 합니다.
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/classesandstructures/
Documentation
docs.swift.org
생성자란(Initializer)?
생성자란(Initializer)?
클래스 또는 구조체를 생성할 때, 객체를 초기화 하는데 사용하는 특별한 함수로 init 키워드로 선언한다. 클래스나 구조체의 인스턴스를 만들 때 호출되며, 초기화 시 필요한 값들을 설정할 수 있다. 생성자는 객체의 상태를 올바르게 설정하고 초기화하는 중요한 역활을 한다.
swift 에서 생성자에는 주로 두 가지 종류가 있다.
- 디폴트 생성자(default initializer) : 기본적으로 제공하는 생성자로, 특별한 초기화 코드가 필요하지 않은 경우 자동으로 제공된다. 하지만 클래스에 속성이 있는 경우, 모든 속성에 기본값을 설정하지 않으면 자동 생성자가 제공되지 않는다.
- 편의 생성자(convenience initializer) : 편의 생성자는 클래스의 다른 생성자를 호출하거나 인스턴스를 빠르게 초기화하는 방법을 제공한다. 주로 복잡한 초기화를 간단하게 만들어 주기 위해 사용된다.
- 반환형이 있는 생성자(failable initializer) : 초기화가 실패할 수 있는 경우 init? 나 init! 을 사용하여 실패 가능한 생성자를 정의할 수 있다. 이때 초기화가 실패하면 nil 이 반환된다.
클래스(Class) : class는 데이터와 관련된 함수를 하나의 단위로 묶어서 표현하는 데이터 구조이다. 클래스는 구조체와 달리 참조 타입(Reference Type)이며, 상속(Inheritance)을 지원한다. 이는 하나의 클래스가 다른 클래스로부터 속성과 메서드를 물려받을 수 있음을 의미한다. 클래스의 인스턴스는 메모리의 특정 주소에 저장되며, 변수나 상수는 그 주소를 참조한다. 따라서 한 변수에서 클래스 인스턴스를 다른 변수에 할당하면 두 변수는 동일한 인스턴스를 참조하게 된다. 클래스도 사용자가 원하는 데이터 타입을 만들 때 사용하며, class 키워드를 사용해서 선언하고 중괄호 {} 안에 속성과 메서드를 작성한다.
class는 struct와 다르게 memberwise initializer 제공되지 않는다. 주요 특징으로는
- 참조 타입(reference type) : 클래스는 참조 타입이다. 참조 타입이란, 변수나 상수에 값을 할당하거나 함수에 인자로 전달될 때 그 값이 복사되지 않고 참조된다는 의미. 클래스를 객체로 만들면 해당 객체의 참조가 변수나 상수에 할당된다. 여러 변수가 같은 객체를 참조할 수 있다. 할당 또는 파라미터 전달 시에 객체를 가리키고 있는 메모리의 주소 값이 복사된다.
- 상속 지원 : 클래스는 다른 클래스를 상속할 수 있다. 이를 통해 기존 클래스를 확장하고, 오버라이딩을 통해 기능을 재정의할 수 있다.
- 메모리 관리 : 참조 카운팅(reference counting)을 통해 메모리를 관리한다. 객체가 더 이상 참조되지 않으면 자동으로 메모리가 해제된다.
- 런타임에 타입캐스팅을 통해 클래스 인스턴스에 따라 여러 동작이 가능하다.
- Heap Memory 영역에 할당된다. 따라서 속도가 느리다.
- deinitializer 가 존재한다. 클래스는 인스턴스가 메모리에서 해제되기 직전에 호출되는 디이니셜라이저(deinitializer)를 가질 수 있다. deinit 키워드를 사용하여 정의한다.
class 클래스이름 {
// 속성 및 메서드 정의
}
class 키워드를 사용해서 선언하고 중괄호 {} 안에 속성과 메서드를 작성한다.

위 예제에서 클래스의 경우 objectA와 objectB는 동일한 인스턴스를 참조하므로, objectB에서 값을 변경하면 objectA의 값도 변경된다. 반면 구조체의 경우 instanceA와 instanceB는 독립적인 값을 갖기 때문에 instanceB에서 값을 변경해도 instanceA의 값에는 영향을 주지 않는다. 이처럼 swift의 class와 struct는 사용 방식과 동작 방식에 따라 적절하게 선택해 사용해야 한다.


class inheritance (클래스 상속) : class 와 struct 차이중 하나는 class 는 상속을 제공한다. 상속을 이용하면 기존 클래스를 이용해서 신규 클래스를 생성할 수 있다. 상속은 클래스가 다른 클래스의 속성과 메서드를 물려받아 재사용할 수 있게 해주는 객체 지향 프로그래밍(OOP)의 중요한 개념이다. 상속을 통해 새로운 클래스(서브 클래스)는 기존 클래스(슈퍼 클래스 또는 부모 클래스)의 속성과 메서드를 물려받을 수 있고 서브 클래스는 필요한 경우 속성과 메서드를 추가하거나, 부모 클래스의 메서드를 재정의 할 수 있다.
- 기존 클래스를 부모(parent) 또는 슈퍼(super) 클래스라고 부른다.
- 새로 생성한 클래스를 자식(child) 클래스라고 부른다.
class 슈퍼클래스 {
// 슈퍼클래스의 속성과 메서드
}
class 서브클래스: 슈퍼클래스 {
// 서브클래스의 추가 속성과 메서드
}

overriding method : 자식 클래스는 부모 클래스의 메소드를 그대로 쓸 수 있다. 자식 클래스는 부모 클래스의 메소드를 덮어써서 자식 클래스에 맞게 변형해서 쓸 수 있으며 이것을 overriding 이라고 한다. 서브 클래스는 슈퍼 클래스의 속성과 메서드를 재정의하여 자신만의 구현을 제공 할 수 있으며, 속성을 재정의할 때는 override 키워드를 사용한다.

final class : 클래스의 상속은 강력하지만, 가끔은 클래스 상속을 허용하지 않아야 할 때가 있다. 이럴때는 final 키워드를 이용해 클래스를 선언하면, 더 이상 상속 가능하지 않은 클래스로 만들 수 있다.

copying object : struct 와 class 의 차이중 하나가 instance 복사할때인데, struct 와 같은 value type 은 복사하면 새로운 객체를 만든다. 따라서 새로 복사된 객체의 프로퍼티 변형했다고 원래 객체가 영향 받지 않는다. 하지만 class 와 같은 reference type 은 복사하면, 새로운 객체를 만들지 않는다. (같은 객체를 포인팅하고 있음) 따라서 새로 복사된 객체의 프로퍼티를 변형하면, 원래 객체의 프로퍼티는 영향을 받아서 변형 되어 있다.

deinitializer : class 는 deinitializer 가 있다. 해당 인스턴스가 메모리에서 해제될때(없어질때) 호출된다.

mutability : class 는 struct 와 다르게 reference type 이기 때문에 상수로 선언하더라도, 프로퍼티를 var 로 선언해 놓으면 변경 가능하다. 그래서 class 는 method 앞에 mutating 키워드를 쓸 필요가 없다. 프로퍼티를 변경 가능하게 하지 않게 하려면 let 으로 선언한다.

super 키워드 : super 키워드는 서브 클래스에서 슈퍼 클래스의 속성과 메서드를 참조할 때 사용한다. super 를 사용하여 슈퍼 클래스의 메서드를 호출하거나 속성에 접근할 수 있다.
같은 맥락으로 initializer 를 재정의할 때 부모의 initializer 내용은 유지하면서 추가적인 작업을 할 때도 super 키워드를 활용하면 효율적이다.
- 클래스와 구조체의 공통점
- 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가진다.
- 프로퍼티(속성)를 정의해서 값을 저장할 수 있다.
- 메서드(행동)를 정의해서 기능을 제공할 수 있다.
- 새로운 사용자 정의 타입을 만든다.
- 초기화(init)를 정의하여 초기 상태를 설정할 수 있다. 생성자를 정의해서 초기 상태를 세팅할 수 있다.
- 확장(extension)할 수 있다. 기본 구현 외 추가 기능을 더 할 수 있다.
- 프로토콜(protocol) 사용이 가능하다. 프로토콜을 구현해서 특정 기능을 제공할 수 있다.
- 특정 값에 접근할 수 있는 서브스크립트(subscript) 문법 사용이 가능하다.
- 프로퍼티 값에 접근하고 싶다면, 점(dot) 문법을 사용한다.
- 클래스는 상속을 시킬 수 있다. 구조체의 경우 불가능.
- 클래스는 레퍼런스 카운팅을 통해 클래스 인스턴스에 대한 하나 이상의 참조를 허용한다.
- 클래스는 deinitializer 호출 시, 이미 할당된 리소스에서 해제할 수 있다.
- 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가진다.
| 특성 | 클래스(class) | 구조체(struct) |
| 타입 | 참조 타입(Reference Type) | 값 타입(Value Type) |
| 상속 | 상속 가능(Inheritance) | 상속 불가 |
| 메모리 관리 | 참조 카운팅(Reference counting) | 값 복사(Copying values) |
| 변경 가능성 | 클래스 인스턴스는 변경 가능(mutating 필요 없음) | 구조체는 mutating 키워드 필요 |
참고 : Choosing Between Structures and Classes
https://developer.apple.com/documentation/swift/choosing-between-structures-and-classes
Choosing Between Structures and Classes | Apple Developer Documentation
Decide how to store data and model behavior.
developer.apple.com
'IOS > Swift' 카테고리의 다른 글
| [Swift] 프로토콜(Protocol), 확장(Extension) (0) | 2025.06.22 |
|---|---|
| [Swift] 클래스(Class)와 구조체(Struct) - 구조체(Struct) (0) | 2025.06.20 |
| [Swift] 클로저(Closure) (0) | 2025.06.19 |
| [Swift] 함수(Function) (5) | 2025.06.19 |
| [Swift] 옵셔널(Optional), 타입캐스팅(Typecasting) (0) | 2025.06.17 |