DevCho
Developer Blog
DevCho
반응형
전체 방문자
오늘
어제
  • 분류 전체보기 (48)
    • IOS (31)
      • Xcode (7)
      • Assets (1)
      • Swift (20)
      • UI (1)
      • SwiftUI (1)
      • Build (1)
    • Flutter (4)
      • Install (4)
      • Dart (0)
    • Rust (0)
    • 유용한 사이트 소개 (1)
    • 개발자의 아이템 (1)
    • Terminal (1)
    • Mac (2)
    • Git (1)
    • 회고 (1)
    • Java (2)
      • Java 기본 사용법 (2)
      • Collections (0)
    • 개발자의 글쓰기 (0)
    • 디자인 패턴 (1)
    • JavaScript (2)
    • Kotlin (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • flutter
  • Dark mode
  • chocolatey
  • func
  • chocolatey 설치
  • Swift
  • Xcode Theme
  • SwiftUI
  • Java
  • flutter 설치
  • xcode13
  • struct
  • 제어문
  • dart 설치
  • MAC
  • random number
  • xcode
  • CLASS
  • Storyboard
  • nil
  • dart
  • optional
  • chocolatey install
  • flutter dart
  • 스위프트
  • swift random
  • 플러터 설치
  • flutter install
  • IOS
  • Terminal

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
DevCho

Developer Blog

[Swift] Struct와 Class의 차이는 무엇인가?
IOS/Swift

[Swift] Struct와 Class의 차이는 무엇인가?

2021. 12. 20. 21:17
반응형

Struct와 Class의 차이

Struct와 Class는 데이터 저장 방식, 가변성(Mutability), 상속 측면에서 다르다.

  • 첫 째, Struct는 그 자체로 값으로 저장이 되지만 Class는 변수에 객체에 대한 주소값을 저장한다.
  • 둘 째, Struct는 기본적으로 Immutable하지만 Class는 Mutable하다. 때문에 Struct의 내부 변수값을 바꾸기 위해서는 mutating이라는 강제로 mutability를 부여하는 접두어를 붙여야 한다.
  • 셋 째, Struct는 상속이 불가능하지만, Class는 상속이 가능하다. 이는 불변성의 연장선으로 볼 수 있다.

 

 

데이터 저장 방식

struct의 데이터는 그 자체가 값으로 저장이 된다. 따라서 기존 struct가 새로운 struct에 할당되면 기존 struct의 값이 그대로 새로운 struct로 할당되어 완전히 별개의 struct가 만들어진다.

 

예를 들어 다음의 PersonStruct가 있다고 해보자.

struct Person {
    let name: String
    var age: Int
    let temperature: Float
    
    init(_name: String, _age: Int, _temperature : Float) {
        name = _name
        age = _age
        temperature = _temperature
    }
    
    mutating func addAge() {
        age += 1
    }
}

 

위 struct를 이용해 age가 29인 person1을 만들고 person2를 person1에 할당한다. 그러면 person2에는  person1의 struct를 복사한 struct가 생성된다. 즉, person1과 person2는 독립적이 된다. 따라서 person1에 addAge를 하더라도 person2의 age는 그대로 29가 된다.

그림1. 데이터 저장 방식1

 

이번에는 위의 Person을 Class로 바꾸어보자.

class Person {
    let name: String
    var age: Int
    let temperature: Float
    
    init(_name: String, _age: Int, _temperature : Float) {
        name = _name
        age = _age
        temperature = _temperature
    }
    
    func addAge() {
        age += 1
    }
}

person2는 person1의 주소값을 참조하기 때문에 person2와 person1은 같은 객체가 된다. 따라서 person1에 age를 하나 더하면 person2는 person1의 주소값을 참조하므로 person1과 똑같이 나오게 된다.

그림2. 데이터 저장 방식2

 

 

가변성

Struct는 기본적으로 Immutable하다. 하지만 Class는 Mutable하다. 때문에 Struct의 func에서 내부 속성을 바꾸기 위해서는 mutating 을 붙여햐 한다. 

struct Person {
    let name: String
    var age: Int
    let temperature: Float
    
    init(_name: String, _age: Int, _temperature : Float) {
        name = _name
        age = _age
        temperature = _temperature
    }
    
    mutating func addAge() {
        age += 1
    }
}

 

반대로 클래스는 기본적으로 Mutable하다. 따라서 속성을 바꾸기 위해 func 앞에 mutating을 붙일 필요가 없다.

class Person {
    let name: String
    var age: Int
    let temperature: Float
    
    init(_name: String, _age: Int, _temperature : Float) {
        name = _name
        age = _age
        temperature = _temperature
    }
    
    func addAge() {
        age += 1
    }
}

 

 

상속성

Class는 상속할 수 있다. 하지만 struct는 상속이 불가능하다.

 

만약 Person을 struct로 선언후 상속하려고 하면 다음의 오류가 생긴다.

그림3. 상속

반응형

'IOS > Swift' 카테고리의 다른 글

[Swift] 함수형 프로그래밍 알아보기 : 클로저(Closures), 일급객체  (0) 2021.12.25
[Swift] protocol이란 무엇인가?  (0) 2021.12.22
[Swift] struct 내부에서 변수값 변경하기  (0) 2021.12.19
[Swift] struct 한 번에 정리하기  (1) 2021.12.19
[Swift 제어문] switch case 사용해 다중 조건 처리하기  (0) 2021.12.19
    'IOS/Swift' 카테고리의 다른 글
    • [Swift] 함수형 프로그래밍 알아보기 : 클로저(Closures), 일급객체
    • [Swift] protocol이란 무엇인가?
    • [Swift] struct 내부에서 변수값 변경하기
    • [Swift] struct 한 번에 정리하기
    DevCho
    DevCho
    개발자의 개발 공간

    티스토리툴바