[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에서 구조체 클래스는 각각의 강점이 있음.
구조체는 가볍고 데이터 중심일 때, 클래스는 객체 지향 설계가 필요할 때 적합함.

BELATED ARTICLES

more