클래스, 구조체, 열거형
💡 클래스, 구조체, 열거형
Class, Struct, Enumeration
Class(클래스)
- 데이터와 해당 데이터를 처리하는 메서드(함수)에 속하는 사용자 정의 데이터 타입
- 프로퍼티(Property)와 메서드(Method)로 구성
Class의 특징
Reference Type(참조 타입)
인스턴스가 생성될 때 메모리의 힙(heap) 영역에 할당되고, 인스턴스의 참조(reference)가 전달됨
→ 따라서 클래스 인스턴스를 복사할 때에는 참조만 복사되므로 동일한 인스턴스를 여러 곳에서 참조할 수 있음
Properties(속성) : 클래스 안의 변수
클래스는 데이터를 저장하기 위한 속성을 정의할 수 있음
→ 이러한 속성은 클래스 내에서 변수(var) 또는 상수(let)로 선언됨
Methods(메서드) : 클래스 안의 함수
클래스는 데이터를 처리하기 위한 메서드를 정의할 수 있음
→ 메서드는 클래스의 내부에 구현된 함수
Initializer(이니셜라이저)
클래스는 객체를 초기화하기 위한 이니셜라이저를 제공할 수 있음
→ 클래스의 인스턴스를 생성하고 초기화하는 역할
Inheritance(상속)
클래스는 다른 클래스로부터 상속을 받아서 기존 클래스의 특성을 재사용할 수 있음
→ 상속을 통해 부모 클래스의 속성과 메서드를 자식 클래스에서 사용할 수 있음
Polymorphism(다형성)
클래스는 다형성을 지원
→ 같은 이름의 메서드가 서로 다른 클래스에서 다른 동작을 수행할 수 있는 기능을 의미
Encapsulation(캡슐화)
클래스는 캡슐화를 통해 데이터와 해당 데이터를 처리하는 메서드를 하나의 단위로 묶어줌
→ 이를 통해 데이터의 은닉과 보호를 제공할 수 있음
Memory Management(메모리 관리)
참조 계수(reference count)를 사용하여 메모리를 관리
→ 즉, 인스턴스를 생성하고 더 이상 사용하지 않을 때 참조 카운트가 0이 되면 자동으로 메모리에서 해제됨
Synchronization(동기화)
클래스의 인스턴스는 여러 개의 참조를 가질 수 있기 때문에 동기화에 유의해야 함
→ 여러 곳에서 동시에 클래스의 인스턴스를 수정하는 경우 동기화 문제가 발생할 수 있음
Use Cases(사용 사례)
상속이 필요하거나 참조 타입의 특성이 필요한 경우에 사용
→ 예를 들어, 객체 지향적인 설계에 맞는 상속 구조를 구현하거나 공유 데이터 모델을 생성하는 등의 경우에 주로 사용됨
Struct(구조체)
- 클래스(class)와 유사한 사용자 정의 데이터 타입
- 다양한 타입의 속성(properties)과 메서드(methods)를 포함할 수 있으며, 구조체의 인스턴스를 생성하여 사용할 수 있음
Struct의 특징
Value Type(값 타입)
변수나 상수에 할당될 때 값의 복사본이 생성되는 타입
→ 구조체의 인스턴스가 변수에 할당될 때나 함수에 전달될 때에도 마찬가지
Properties(속성)
데이터를 저장하기 위한 속성을 정의할 수 있음
→ 이러한 속성은 구조체 내에서 변수(var) 또는 상수(let)로 선언됨
Methods(메서드)
데이터를 처리하기 위한 메서드를 정의할 수 있음
→ 구조체의 내부에 구현된 함수
Initializer(이니셜라이저)
객체를 초기화하기 위한 이니셜라이저를 제공할 수 있음
→ 구조체의 인스턴스를 생성하고 초기화하는 역할
Value Semantics(값의 전달 방식)
값의 전달 방식을 사용하여 인스턴스를 전달
→ 복사본을 전달함으로써 데이터의 안정성을 보장하고 부작용(side effect)을 방지
Inheritance(상속)
클래스와 달리 상속을 지원하지 않음
→ 즉, 다른 구조체나 클래스로부터 상속을 받을 수 없음
Reference Count(참조 카운트)
참조 카운트(reference count)를 사용하지 않음
→ 값 타입이기 때문에 별도의 메모리 관리를 하지 않음
Memory Management(메모리 관리)
별도의 메모리 관리를 하지 않음
→ 값 타입이기 때문에 스택에서 할당되며, 스코프를 벗어나면 자동으로 해제됨
Synchronization(동기화)
값이 복사되어 전달되기 때문에 동기화 문제가 발생하지 않음
Use Cases(사용 사례)
구조체는 값 타입의 특성이 필요한 경우에 사용됨
→ 예를 들어, 간단한 데이터 모델링이나 작은 데이터를 전달하는 경우,
또는 함수나 메서드에서 복사본을 생성하여 부작용을 방지하는 경우에 주로 사용
값 타입인 구조체 예시
struct Point {
var x: Int
var y: Int
}
var point1 = Point(x: 5, y: 10)
var point2 = point1 // 값 복사
point2.x = 15
print(point1) // 출력: Point(x: 5, y: 10)
print(point2) // 출력: Point(x: 15, y: 10)
Class(클래스)와 Struct(구조체)
공통점
속성(Properties)
클래스와 구조체는 속성을 정의하여 데이터를 저장할 수 있음
→ 이 속성들은 변수(var) 또는 상수(let)로 선언될 수 있음
메서드(Methods)
클래스와 구조체는 메서드를 정의하여 기능을 구현할 수 있음
→ 메서드는 클래스나 구조체 내에 구현된 함수임
초기화(Initialization)
클래스와 구조체는 이니셜라이저(initializer)를 사용하여 인스턴스를 초기화할 수 있음
(이니셜라이저는 인스턴스가 생성될 때 호출되는 특별한 메서드)
확장(Extensions)
클래스와 구조체는 기존의 클래스나 구조체를 확장하여 새로운 기능을 추가할 수 있음
→ 이는 기존의 클래스나 구조체를 변경하지 않고도 새로운 기능을 추가할 수 있는 장점이 있음
프로토콜(Protocols)
클래스와 구조체는 프로토콜을 준수하여 특정한 동작을 구현할 수 있음
→ 프로토콜은 특정한 메서드, 속성 또는 기타 요구사항을 정의하여 클래스나 구조체가 해당 요구사항을 충족시킬 수 있도록 함
제네릭(Generic):
클래스와 구조체는 제네릭을 사용하여 타입에 대한 일반화된 기능을 제공할 수 있음
→ 제네릭을 사용하면 코드의 재사용성을 높일 수 있음
차이점
Class(클래스) | Struct(구조체) | |
상속(Inheritance) | 상속 지원 O |
상속 지원 X |
참조 타입(Reference Type) vs 값 타입(Value Type) |
참조 타입 | 값 타입 |
메모리 관리 (Memory Management) |
참조 계수(reference count)를 사용하여 메모리를 관리 | 별도의 메모리 관리를 하지 않음 |
동기화(Synchronization) | 인스턴스는 여러 개의 참조를 가질 수 있기 때문에 동기화에 유의해야 함 | 값이 복사되어 전달되기 때문에 동기화 문제가 발생하지 않음 |
사용 사례(Use Cases) | 상속이 필요하거나 참조 타입의 특성이 필요한 경우에 사용 | 값 타입의 특성이 필요한 경우에 사용 |
Enumeration(열거형)
- 연관된 값을 묶어서 하나의 데이터 타입으로 구성하여 나타내는 자료형
- 다양한 상황에서 유형 안정성(type safety)을 제공하고 코드를 더 명확하고 읽기 쉽게 만들어줌
Enumeration의 특징
Case (케이스)
열거형의 각 케이스는 하나의 고유한 값
→ 각 케이스는 열거형 내에서 유일해야 함
Associated Values (연관 값)
열거형 케이스는 연관된 값을 가질 수 있음
→ 이 연관 값은 해당 케이스와 함께 저장되며 다양한 유형의 데이터를 포함할 수 있음
Raw Values (원시 값)
열거형 케이스는 원시 값(raw value)을 가질 수 있음
→ 원시 값은 문자열이나 정수와 같은 고정된 데이터 타입이며, 각 케이스에 고정된 값을 할당할 수 있음
Pattern Matching (패턴 매칭)
열거형은 switch 문을 사용하여 각 케이스를 처리하고 패턴 매칭을 수행할 수 있음
→ 이를 통해 코드를 간결하게 작성하고 다양한 상황에 대응할 수 있음
Associated Values와 메서드
열거형은 각 케이스와 연관된 값뿐만 아니라 메서드도 가질 수 있음
→ 이를 통해 열거형이 특정 작업을 수행하거나 특정 상태를 나타내는 동작을 정의할 수 있음
Enumeration 정의(원시값이 없는 경우)
enum CompassDirection {
case north
case south
case east
case west
}
Enumeration 정의 - 값 할당(원시값이 있는 경우)
enum CompassDirection: String {
case north = "N"
case south = "S"
case east = "E"
case west = "W"
}
Enumeration 인스턴스 생성
let direction: CompassDirection = .north
Enumeration Switch문으로 케이스 처리
switch direction {
case .north:
print("Go north!")
case .south:
print("Go south!")
case .east:
print("Go east!")
case .west:
print("Go west!")
}
Enumeration 연관 값 사용
enum Measurement {
case length(Double)
case weight(Double)
}
let length = Measurement.length(10.0)
let weight = Measurement.weight(5.0)
Enumeration 메서드와 연산 프로퍼티 추가
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
var orderFromSun: Int {
switch self {
case .mercury: return 1
case .venus: return 2
case .earth: return 3
case .mars: return 4
case .jupiter: return 5
case .saturn: return 6
case .uranus: return 7
case .neptune: return 8
}
}
}
' 𝗔𝗣𝗣𝗟𝗘 > SWIFT : GRAMMAR' 카테고리의 다른 글
Swift 기초 문법 - 초기화(Initialization) (0) | 2024.03.11 |
---|---|
Swift 기초 문법 - 상속(Inheritance) (0) | 2024.03.11 |
Swift 기초 문법 - 객체 지향(OOP) (0) | 2024.03.08 |
Swift 기초 문법 - Collection Type(Array, Set, Dictionary) (0) | 2024.03.08 |
Swift 기초 문법 - Stack(스택) & Queue(큐) (0) | 2024.03.08 |