Swift

Swift - Class, Struct, Enum

iosos 2023. 8. 23. 20:14

Swift 

- 객체 지향 프로그래밍 언어로 클래스(class), 구조체(struct), 열거형(enum)과 같은 다양한 데이터 타입을 제공하여 코드를 구조화하고 모듈화하는 데 도움을 줌 

 

 

1. 클래스 (Class)

- 클래스 내에 변수나 상수(Properties)와 메서드(Methods)를 정의하여 클래스를 구현

- Swift에서는 객체라는 용어 대신 인스턴스라는 용어를 사용 

- 클래스의 인스턴스를 생성할 때, 초기화 메서드(Initializer, 생성자)를 사용하여 속성의 초기값 설정

- 단일 상속만 가능 

- iOS 프레임워크에서 프로그래밍할 때 주로 클래스를 많이 사용

- 참조 타입(= reference type)으로 분류 됨 

클래스 인스턴스를 변수나 상수에 할당할 때, 데이터의 복사가 아닌 인스턴스에 대한 참조가 이루어짐. 
여러 변수나 상수가 하나의 클래스 인스턴스를 공유할 수 있음 
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    }
}

- 'ViewController' 클래스는 'UIViewController'를 상속 

 

 

2. 구조체 (Struct)

- 구조체는 클래스와 유사하지만, 값 타입(value type)으로 동작

- 값 타입은 할당 시에 복사되므로 하나의 인스턴스 변경이 다른 인스턴스에 영향을 주지 않음 

- 구조체는 간단한 데이터를 캡슐화하거나 메서드와 함꼐 사용하여 기능을 구현하는 데 유용 

- 상속 불가능 

- SwiftUI에서는 대부분이 Struct로 구성됨 

 

 

Struct를 사용하는 경우

- 연관된 몇몇의 값들을 모아서 하나의 데이터 타입으로 표현하고 싶을 때

- 다른 객체 또는 함수 등으로 전달될 때 참조가 아닌 복사를 원할 때

- 자신을 상속할 필요가 없거나 자신이 다른 타입을 상속받을 필요가 없을 때

struct User {
    let name: String
    let age: Int
}

 

 

 

3. 열거형 (Enum)

- 명명된 상수 그룹을 정의할 수 있는 타입

- 유한한 선택지를 나타내는 데 사용됨.  ex) 컬러나 요일 등 

- 각 케이스는 해당 열거형의 고유한 값

- 연관 값을 가질 수 있어서 각 케이스에 연관된 데이터를 저장할 수 있음 

- 상속이 불가능 함

 

열거형을 정의하고 변수에 할당 

import UIKit

// 열거형 타입
enum Animal {
    case cat
    case dog
    case cow
}

let cat1 : Animal = Animal.cat  // cat
let dog1 : Animal = Animal.dog  // dog
let cow1 : Animal = Animal.cow  // cow

 

 

 

열거형에서 원시값 (rawValue) 설정

 

Int

import UIKit

// 열거형 타입
enum Animal : Int {
    case cat = 0
    case dog
    case cow
}

let cat1 : Animal = Animal.cat  // cat
let dog1 : Animal = Animal.dog  // dog
let cow1 : Animal = Animal.cow  // cow

print(cat1.rawValue) // 0
print(dog1.rawValue) // 1
print(cow1.rawValue) // 2

 

Double

import UIKit

// 열거형 타입
enum Animal : Double {
    case cat = 0
    case dog
    case cow
}

let cat1 : Animal = Animal.cat  // cat
let dog1 : Animal = Animal.dog  // dog
let cow1 : Animal = Animal.cow  // cow

print(cat1.rawValue) // 0.0
print(dog1.rawValue) // 1.0
print(cow1.rawValue) // 2.0

 

 

 

 


Class와 Struct의 차이점

- 클래스는 참조 타입, 열거형과 구조체는 값 타입! → 참고) 2023.08.22 - [분류 전체보기] - Swift - mutating

- 클래스는 상속 가능하지만, 열거형과 구조체는 상속 불가능 

- 클래스 인스턴스는 타입 캐스팅을 통해 다른 클래스 타입으로 형 변환 가능. 구조체, 열거형은 불가능 

-

 

 

Class와 Struct의 공통점 

- 서로 다른 타입(자료형)들을 하나로 묶을 수 있음

- 메서드, 프로퍼티 사용

- 묶은 자료형들을 새로운 타입처럼 사용 가능 

- 클래스 / 구조체 안에서 함수 / 프로퍼티 정의 가능 

- 프로토콜 채택 : 클래스, 구조체, 열거형 모두 프로토콜을 채택하여 특정한 규약을 준수할 수 있음 

- 확장(extension) : 클래스, 구조체, 열거형 모두 확장하여 새로운 프로퍼티와 메서드를 추가할 수 있음 

 

 

 

 

 

 

 

 

참고) 

https://seons-dev.tistory.com/entry/Swift-%EA%B8%B0%EC%B4%88%EB%AC%B8%EB%B2%951-CLASS-STRUCT-ENUM 

 

https://zeddios.tistory.com/12

 

'Swift' 카테고리의 다른 글

Swift - HIG (Human Interface Guide)  (0) 2023.08.28
Swift - Extension (확장)  (0) 2023.08.24
Swift - mutating  (0) 2023.08.22
Swift - DispatchQueue  (0) 2023.08.22
Swift - UserDefaults  (0) 2023.08.16