[iOS / Swift] 구조체와 클래스의 개념 정리

2024. 12. 23. 18:50·Swift/Swift 문법 정리

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

'Swift > Swift 문법 정리' 카테고리의 다른 글

[iOS / Swift] 함수 (Function) 정리  (0) 2025.01.07
[iOS / Swift] 열거형(Enum) 정리  (0) 2024.12.30
[iOS / Swift] Optional 개념과 Unwrapping 정리  (0) 2024.12.19
[iOS / Swift] 연산자  (1) 2024.12.04
[iOS / Swift] 문자와 문자열  (1) 2024.12.03
'Swift/Swift 문법 정리' 카테고리의 다른 글
  • [iOS / Swift] 함수 (Function) 정리
  • [iOS / Swift] 열거형(Enum) 정리
  • [iOS / Swift] Optional 개념과 Unwrapping 정리
  • [iOS / Swift] 연산자
이도서
이도서
  • 이도서
    도서의 코딩노트
    이도서
  • 전체
    오늘
    어제
    • 분류 전체보기 (249)
      • Today I Learned (79)
        • 2024 (78)
      • Swift (25)
        • Swift 문법 정리 (19)
        • RxSwift (5)
      • Swift Study (12)
        • Playground (2)
        • Storyboard (9)
        • UIKit (1)
      • Flutter (27)
        • Dart 언어 (16)
        • Flutter Study (11)
      • React (37)
        • HTML & CSS (8)
        • JavaScript 기본 (12)
        • JavaScript 심화 (14)
        • Node.js (2)
        • React (1)
      • Git (3)
      • 코딩테스트 (60)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 개발 공부 공유 링크
  • 인기 글

  • 태그

    DART
    React
    Flutter
    javascript
    function
    ios앱개발자
    함수
    내일배움캠프
    Swift
    html
    CLASS
    객체지향
    ios
    코딩테스트Level.1
    iOS앱개발
    Til
    코딩테스트 level.1
    javascript 기본
    storyboard
    코딩테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
이도서
[iOS / Swift] 구조체와 클래스의 개념 정리
상단으로

티스토리툴바