Swift) 값 타입과 참조 타입 그리고 클래스와 구조체 (Value type & Reference type, Class & Struct)

2021. 1. 5. 19:13·iOS/Swift

값 타입과 참조 타입

값 타입

변수를 할당하면 스택 영역에 값이 저장된다.

변수를 복사한 후 복사본을 변경하더라도 원본에 영향을 주지 않는다.

힙 영역을 사용하지 않고 레퍼런스 카운팅이 필요하지 않다.

 

참조 타입

스택 영역에는 포인터(레퍼런스)만 할당되고 실제 데이터는 힙 영역에서 할당된다.

변수를 복사하더라도 하나의 값을 가리키고 있기 때문에 복사본과 원본이 모두 같은 값을 갖는다.

변수를 복사하더라도 레퍼런스 카운트만 +1되고 실제 값이 복사되지는 않는다.

 

 

Swift의 Class와 Struct는 생김새와 사용법이 유사하다.

구조체는

1. 값 타입이다.

2. 상속이 불가능하다.

3. 생성자를 구현하지 않아도 default initializer를 사용할 수 있다.

 

struct Car {
    var name : String
    var color : String
}

let car1 = Car(name: "i7", color: "Black")
print(car1)
//Car(name: "i7", color: "Black")

var car2 = car1
print(car2)
//Car(name: "i7", color: "Black")

car2.name = "i9"
print(car2)
print(car1)
//Car(name: "i9", color: "Black")
//Car(name: "i7", color: "Black")
//car2의 프로퍼티를 변경해도 원본인 car1의 프로퍼티 값은 변경되지 않았다.

 

클래스는

1. 참조 타입이다.

2. 생성자를 구현해야만 사용할 수 있다.

class Student {
    var name : String
    var age : Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    func print() {
        print("name: \(name), age: \(age)")
    }
    //기본 print() 함수를 사용하면 주소값이 출력되기 때문에 직접 함수로 구현함.
}

let std1 = Student(name: "Peter", age: 17)
std1.print()
//name: Peter, age: 17

let std2 = std1
std2.print()
//name: Peter, age: 17

std2.name = "Ken"
std2.print()
std1.print()
//name: Ken, age: 17
//name: Ken, age: 17
//std2의 프로퍼티 값을 변경하면 원본인 std1의 프로퍼티 값도 함께 변경된다.

 

* Swift의 Enum, Array, String, Dictionary, Set, Tuple도 Struct와 동일한 값 타입이다

* Swift의 Function과 Closure는 Class와 동일한 참조 타입이다.

 

차이를 구분하지 않고 써도 무리가 없는 경우가 많지만 개념을 확실히 알고 있다면 도움이 될 것 같다.

 

참고) 프로그램 실행 순서와 메모리 영역

저작자표시 비영리 변경금지 (새창열림)

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

Design Patterns: MVVM, MVVM-C, MVP, Clean Architecture  (1) 2025.01.07
iOS 앱 개발자를 위한 RESTful API 실전 적용과 WebSocket  (0) 2025.01.06
Swift 앱의 생명주기와 헷갈리는 UI 관련 개념 정리  (2) 2020.12.14
Swift 중요한 용어와 개념  (2) 2020.12.14
Swift 클로저와 일급 함수  (2) 2019.09.09
'iOS/Swift' 카테고리의 다른 글
  • Design Patterns: MVVM, MVVM-C, MVP, Clean Architecture
  • iOS 앱 개발자를 위한 RESTful API 실전 적용과 WebSocket
  • Swift 앱의 생명주기와 헷갈리는 UI 관련 개념 정리
  • Swift 중요한 용어와 개념
hyunjicraft
hyunjicraft
모든 것을 기록하고 싶었지만 복잡하지 않은 것만 기록하게 된 블로그
    반응형
  • hyunjicraft
    개발망고발
    hyunjicraft
  • 전체
    오늘
    어제
    • 분류 전체보기
      • iOS
        • Swift
        • RxSwift
      • 공부하기
        • React
        • Python
        • 다른 PL
        • Figma
      • 스타트업
      • 글쓰기
        • 회고
  • 블로그 메뉴

    • 태그
  • 인기 글

  • 태그

    Communication Patterns
    react
    daummap
    swift codable
    기술적도전
    마스터 컴포넌트 연결 해제
    블렌더 g키
    RxSwift image download
    swift
    mvvm-c
    블렌더
    URLSessionDataTask
    RxSwift 비교
    RxSwift 이미지 다운로드
    게임런칭
    스타트업개발
    setState()
    맥에서 블렌더
    피그마 인스턴스
    ios system architecture
    함수방식 컴포넌트
    스타트업경험
    비동기 프로그래밍
    Python
    blender g
    computer systems
    중니어
    생활코딩
    문자열 포맷
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
hyunjicraft
Swift) 값 타입과 참조 타입 그리고 클래스와 구조체 (Value type & Reference type, Class & Struct)
상단으로

티스토리툴바