값 타입 VS 참조 타입

Tabber·2021년 10월 8일
0

Swift

목록 보기
3/5
post-thumbnail

기본적으로 Struct는 값 타입이고, Class는 참조 타입이라는 것을 주입식으로 알고 있다.

근데 이게 정확하게 어떤건지는 설명이 불가능하다는 것을 알고 좀 더 자세히 공부하기로 했다.

기본적인 Class와 Struct의 구조

import Foundation

class Person {
    let name: String = "IBY"
    let age: Int = 23
}

struct Student {
    let name: String = "ITlearning"
    let age: Int = 23
}

// Class 인스턴스 생성
let person = Person()

// Struct 인스턴스 생성
let student = Student()

-> 둘 다 동일하게 인스턴스를 생성하지만, 생성할 때의 각각의 인자를 전달하는 방식이 달라지게 된다.

위에서도 말했듯 Struct는 값 타입, Class는 참조타입이다.

값 타입이란, 값 자체를 복사하여 새로운 인스턴스를 만들기 때문에, 변수를 복사한 후 복사본을 변경하더라도 선언한 두 값은 다른 값이다.

반면 참조타입 이란, 인스턴스를 생성하더라도 실제 값이 할당되지 않고, 포인터(그 값의 주소)가 할당이된다.
변수를 복사하더라도 하나의 값을 가리키고 있기 때문에 복사본과 원분이 모두 같은 값을 가지게 된다.

값 타입과 참조타입의 차이점

import Foundation

class Person {
    let name: String = "IBY"
    var age: Int = 23
}

struct Student {
    let name: String = "ITlearning"
    var age: Int = 23
}

// Class 인스턴스 생성
let personOne = Person()
var personTwo = personOne

// Struct 인스턴스 생성
let studentOne = Student()
var studentTwo = studentOne

personTwo.age += 1
print(personOne.age)  // 24

studentTwo.age += 1
print(studentOne.age) // 23

위 코드에서 볼 수 있듯이 Class와 Struct의 차이가 분명히 보인다.

Class와 Struct 모두 인스턴스를 생성하여 복사본을 만든 상황이다.

그리고 만든 복사본의 age 를 하나 증가시키고 원본의 값을 확인해보았는데, Class의 인스턴스를 생성했던 personOne 은 값이 1 증가했고, Struct의 인스턴스를 생성했던 studentOne 은 값이 1 증가하지 않았다.

이렇게 person 이름을 가지고 있는 Class 인스턴스들은 값의 주소만을 가지고 있기 때문에, 복사를 할 때도 따로 값을 만드는 것이 아닌 주소만을 복사해주는 것이다.

따라서 복사한 곳에서 값을 증가 시켜도 같은 주소를 가리키고 있기에 원본의 값이 증가하는 것이다.

반면 student 이름을 가지고 있는 Struct 인스턴스들은 Struct를 새로 하나 만드는 것과 동일하기 때문에 복사한 인스턴스의 값을 증가시켜도 원본의 값은 증가하지 않는 것이다.

이렇게 값 타입과 참조 타입의 기본적인 차이에 대해 알아보았다.

profile
iOS 정복중인 Tabber 입니다.

0개의 댓글