[Swift] 구조체, 클래스, 열거형

김형근·2024년 7월 20일

[Swift] 문법

목록 보기
9/20

🍎 Swift의 구조체, 클래스, 열거형

  • Swift에서는 데이터 모델을 정의하는 데 구조체(Struct), 클래스(Class), 열거형(Enum)이라는 세 가지 주요 타입을 제공합니다. 이들은 각각 고유한 특성과 사용 용도를 가지고 있습니다.

💡 클래스 (Class)

  • 전통적인 객체지향 프로그래밍(OOP) 관점에서의 클래스
  • 단일 상속: 클래스는 다른 클래스에서 상속받을 수 있습니다.
  • (인스턴스/타입) 메서드
  • (인스턴스/타입) 프로퍼티
  • 참조 타입: 클래스의 인스턴스는 참조 타입으로, 인스턴스가 다른 변수에 할당될 때 참조가 복사됩니다.
  • Apple 프레임워크의 대부분의 큰 뼈대는 모두 클래스로 구성

🍏 구조체 (Struct)

  • C 언어 등의 구조체보다 다양한 기능을 제공
  • 상속 불가: 구조체는 다른 구조체로부터 상속받을 수 없습니다.
  • (인스턴스/타입) 메서드
  • (인스턴스/타입) 프로퍼티
  • 값 타입: 구조체의 인스턴스는 값을 복사하여 전달합니다.
  • Swift의 많은 부분은 구조체를 기반으로 구성되어 있습니다.

🍏 열거형 (Enum)

  • 다른 언어의 열거형과는 많이 다른 존재
  • 상속 불가: 열거형은 다른 열거형으로부터 상속받을 수 없습니다.
  • (인스턴스/타입) 메서드
  • (인스턴스/타입) 연산 프로퍼티
  • 값 타입
  • Enumeration
  • 유의미한 값: 유사한 종류의 여러 값을 유의미한 이름으로 한 곳에 모아 정의
    예: 요일, 상태값, 월(Month) 등
  • 열거형 자체가 하나의 데이터 타입
    열거형의 case 하나하나 전부 하나의 유의미한 값으로 취급
  • 선언 키워드 enum

📍 구조체는 언제 사용하나?

  • 연관된 몇몇의 값들을 모아서 하나의 데이터타입으로 표현하고 싶을 때
  • 다른 객체 또는 함수 등으로 전달될 때
    참조가 아닌 복사를 원할 때
  • 자신을 상속할 필요가 없거나,
    자신이 다른 타입을 상속받을 필요가 없을 때
  • Apple 프레임워크에서 프로그래밍을 할 때에는 주로 클래스를 많이 사용

Value(값) vs Reference(참조)

  • Value
    • 데이터를 전달할 때 값을 복사하여 전달
  • Reference
    • 데이터를 전달할 때 값의 메모리 위치를 전달

클래스와 구조체/열거형 비교 예제

import Swift

// MARK: - Class vs Struct/Enum

// 값 타입을 정의하는 구조체
struct ValueType {
    var property = 1 // 기본값을 가진 프로퍼티
}

// 참조 타입을 정의하는 클래스
class ReferenceType {
    var property = 1 // 기본값을 가진 프로퍼티
}

// 구조체 인스턴스 생성
let firstStructInstance = ValueType()
// 첫 번째 인스턴스를 두 번째 인스턴스에 복사
var secondStructInstance = firstStructInstance
// 두 번째 인스턴스의 프로퍼티 값을 변경
secondStructInstance.property = 2

// 첫 번째 구조체 인스턴스의 프로퍼티는 변경되지 않음
print("first struct instance property: \(firstStructInstance.property)") // 1 출력
// 두 번째 구조체 인스턴스의 프로퍼티 값
print("second struct instance property: \(secondStructInstance.property)") // 2 출력

// 클래스 인스턴스 생성
let firstClassReference = ReferenceType()
// 첫 번째 인스턴스를 두 번째 인스턴스에 참조로 복사
var secondClassReference = firstClassReference
// 두 번째 인스턴스의 프로퍼티 값을 변경
secondClassReference.property = 2

// 첫 번째 클래스 인스턴스의 프로퍼티 값이 변경됨
print("first class reference property: \(firstClassReference.property)") // 2 출력
// 두 번째 클래스 인스턴스의 프로퍼티 값
print("second class reference property: \(secondClassReference.property)") // 2 출력

구조체 예시 문제

struct SomeStruct {
    var someProperty: String = "Property" // 기본값을 가진 프로퍼티
}

// 구조체 인스턴스를 생성합니다.
var someStructInstance: SomeStruct = SomeStruct()

// 구조체 인스턴스를 매개변수로 받는 함수 정의
func someFunction(structInstance: SomeStruct) {
    var localVar: SomeStruct = structInstance // 매개변수를 지역 변수로 복사
    localVar.someProperty = "ABC" // 지역 변수의 프로퍼티 값을 변경
}

// 함수 호출
someFunction(someStructInstance)

// 원래 인스턴스의 프로퍼티는 변경되지 않음
print(someStructInstance.someProperty)  // "Property" 출력

클래스 예시 문제

class SomeClass {
    var someProperty: String = "Property" // 기본값을 가진 프로퍼티
}

// 클래스 인스턴스를 생성합니다.
var someClassInstance: SomeClass = SomeClass()

// 클래스 인스턴스를 매개변수로 받는 함수 정의
func someFunction(classInstance: SomeClass) {
    var localVar: SomeClass = classInstance // 매개변수를 지역 변수로 참조 복사
    localVar.someProperty = "ABC" // 지역 변수의 프로퍼티 값을 변경
}

// 함수 호출
someFunction(someClassInstance)

// 클래스 인스턴스의 프로퍼티는 변경됨
print(someClassInstance.someProperty) // "ABC" 출력
profile
꾸준히 기록하기

0개의 댓글