본문 바로가기

 𝗔𝗣𝗣𝗟𝗘/SWIFT : GRAMMAR

Swift 기초 문법 - 클래스, 구조체, 열거형

 

 

 

 

클래스, 구조체, 열거형

 

 

💡 클래스, 구조체, 열거형

 

 

 

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
        }
    }
}

 

 

 

 

 

 

 

프로퍼티(Property)

 

Swift 기초 문법 - 프로퍼티(Property)

새로 수강한 강의에 대해 정리 이미 정리한 내용도 있겠지만 다시 한 번 복습을 위해 작성했다 / 일부 참고 💡 프로퍼티 (Property) - 프로퍼티는 클래스, 구조체 또는 열거형 등에 관련된 값 프로

wood-fxrest.tistory.com

 

Recent Posts
Visits
Today
Yesterday
Archives
Calendar
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31