iOS/Swift Grammar

[Swift] class와 struct 차이

kyxxn 2024. 1. 9. 23:19
728x90

클래스, 구조체 공통점

  • 멤버변수, 멤버함수를 갖고 있음
  • . 을 통해 내부 요소 접근가능
  • 생성자를 사용해 초기화
  • 프로토콜을 채택할 수 있음

클래스의 특징

  • 참조 타입
  • 모든 클래스의 인스턴스는 힙 영역의 내용을 공유함
  • 상속 가능
  • ARC로 메모리 관리

구조체의 특징

  • 값 타입
  • 모든 구조체의 인스턴스는 독립적임 복사될 때마다 새 인스턴스가 생성됨
  • 구조체의 인스턴스는 불변
    기본적으로 멤버함수를 통해 멤버변수 값 변경이 불가능 하나, mutating이라는 키워드를 멤버함수에 붙여줌으로써 변경 권한을 준다.

mutating을 사용하는 예시

struct Test1{
    var name : String = ""
    
    func ChangeName(){
        name = "박효준"
    }
}

struct Test2{
    var name : String = ""
    
    mutating func ChangeName(){
        name = "박효준"
    }
}

Test1은 에러가 발생한다.

구조체는 값 타입이기에 구조체 인스턴스가 생성되는 순간 복사가 일어나고, 해당 인스턴스의 내부 요소는 바꿀 수 없는게 원칙이다.

그러나 Test2와 같이 mutating 문법을 사용함으로써

Test2 구조체의 인스턴스는 값 복사가 발생하더라도 이후 인스턴스 스스로 메소드를 통해 내부 멤버변수를 바꿀 수 있다.

 

클래스의 힙 영역 저장과 구조체의 스택 영역 저장과 같이 메모리 구조에 빗대어 각각의 특성과 비교하며 공부하니 이해가 잘 됐다.

 

ps.

mutating 이란 단어를 어디서 봤는데, 리눅스 수업 들을 때 스레드 부분에서 mutex를 보았다.

아직 운영체제를 깊게 배우진 못 하였지만, 스레드는 메모리의 데이터 영역 (공유변수)등을 공유하고 있기에

하나의 스레드가 사용 중일 때, 다른 스레드가 접근하는 충돌을 방지하려고 mutex 키워드를 쓴 게 기억났다.

 

그렇다. mutating과 mutex는 전혀 상관없음

 

 

 

-----

2024 05 20 추가

 

Dispatch를 공부하면서 깨달은 사실인데, 클래스는 오버라이딩 가능성이 있기 때문에

Virtual Method Table을 지닌다.

 

구조체는 지니지 않음