[iOS / Swift] 구조체와 클래스의 개념 정리
2024. 12. 23. 18:50
Swift에서 구조체(struct)와 클래스(class)는 데이터와 기능을 캡슐화하기 위해 사용되는 기본적인 설계도임. 이번 포스팅에서는 구조체와 클래스의 기본 문법과 차이점을 정리해봄.
1. 구조체의 기본 구조
: 구조체는 값 타입(Value Type)으로, 데이터를 캡슐화하기 위해서 사용됨. Swift에서는 구조체가 기본적으로 설계도 역할을 함
struct StructName {
// property (속성)
// method (메서드)
// initializer (생성자)
// subscript (서브스크립트)
}
struct Person {
var name: String // 속성
var age: Int
func speak() { // 메서드
print("Hello")
}
}
제어문(if문, switch문 등)은 구조체 정의 안에서는 선언할 수 없음. 단, 구조체 속 메서드 안에서는 모든 Swift문법을 사용할 수 있음.
구조체 사용하기
// 인스턴스 생성
let p = Person(name: "Doseo", age: 27)
// 속성 접근
print(p.name) // "Doseo"
print(p.age) // 27
// 메서드 호출
p.speak() // "Hello"
2. 클래스의 기본 구조
: 클래스는 참조 타입(Reference Type)으로, 더 복잡한 객체 지향 설계를 위해 사용됨.
class ClassName {
// 속성(property)
// 메서드(method)
// 생성자(initializer)
// 소멸자(deinitializer)
// 서브스크립트(subscript)
}
클래스는 기본 생성자를 제공하지 않음.
저장 속성이 초기화 되지 않으면 컴파일 에러가 발생함.
따라서 모든 저장 속성에 대해 초기값을 제공하거나, 초기화 메서드(init)를 사용해야 함.
클래스 사용하기
class Person {
var name: String
var age: Int
func speak() {
print("Hello")
}
// 생성자
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
// 인스턴스 생성
let p = Person(name: "Steve", age: 50)
// 속성 접근
print(p.name) // "Steve"
print(p.age) // 50
// 메서드 호출
p.speak() // "Hello"
3. 구조체와 클래스의 주요 차이점
특징 | 구조체 | 클래스 |
타입 | 값 타입(Value Type) | 참조 타입(Reference Type) |
상속 | 불가능 | 가능 |
초기화 메서드 | 기본 생성자 제공 | 직접 작성 |
데이터 복사 | 값 복사(Copy) | 참조 공유(Reference) |
소멸자(deinit) | 없음 | 있음 |
4. 틀릴 수 있는 부분 정리
1. 구조체와 클래스에서 초기화 관련
- 구조체는 모든 속성에대해 초기값이 없다면 기본 생성자를 제공함
- 클래스는 기본 생성자가 자동으로 제공되지 않음. 따라서 모든 속성을 초기화 해주는 init 메서드 작성이 필수임
2. 구조체는 메모리 공유 안됨
- 구조체는 값 복사를 하기 때문에, 두 변수가 독립적으로 동작함
- 클래스는 참조 타입이기 때문에 메모리를 공유함
예제
struct StructExample {
var value: Int
}
class ClassExample {
var value: Int
init(value: Int) {
self.value = value
}
}
// 구조체: 값 복사
var structA = StructExample(value: 10)
var structB = structA
structB.value = 20
print(structA.value) // 10 (원본 변경 안 됨)
print(structB.value) // 20
// 클래스: 참조 공유
var classA = ClassExample(value: 10)
var classB = classA
classB.value = 20
print(classA.value) // 20 (원본도 변경됨)
print(classB.value) // 20
5. 추가 내용: 구조체와 클래스 선택 기준
언제 구조체를 사용함?
- 데이터 중심 설계가 필요한 경우
- 값 복사가 필요한 경우 (예 : 좌표, 크기, 색상)
- 상속이 필요하지 않을 때
언제 클래스를 사용함?
- 객체 중심 설계가 필요한 경우
- 메모리 공유가 필요할 때
- 상속과 다형성이 필요한 경우
소멸자(deinit) 예제
class Device {
var name: String
init(name: String) {
self.name = name
}
deinit {
print("\(name) is being deinitialized")
}
}
var phone: Device? = Device(name: "iPhone")
phone = nil // 출력: "iPhone is being deinitialized"
결론
Swift에서 구조체와 클래스는 각각의 강점이 있음.
구조체는 가볍고 데이터 중심일 때, 클래스는 객체 지향 설계가 필요할 때 적합함.
'Swift 언어 > Swift 문법 정리' 카테고리의 다른 글
[iOS / Swift] 열거형(Enum) 정리 (0) | 2024.12.30 |
---|---|
[iOS / Swift] Optional 개념과 Unwrapping 정리 (0) | 2024.12.19 |
[iOS / Swift] 연산자 (0) | 2024.12.04 |
[iOS / Swift] 문자와 문자열 (0) | 2024.12.03 |
[iOS / Swift] 숫자와 참거짓 (0) | 2024.12.03 |