이 영역을 누르면 첫 페이지로 이동
Daily Growth 블로그의 첫 페이지로 이동

Daily Growth

페이지 맨 위로 올라가기

Daily Growth

Loving you is the reason I live. That’s why every day is precious, a step toward my dreams and you.

클래스 vs 구조체/열거형, 무엇이 다를까? Swift 값 타입과 참조 타입 정리

  • 2025.05.02 11:37
  • IT

값 타입 vs 참조 타입

이전 시간에는 각각의 데이터 타입에 대해서 배웠다. 오늘은 ‘왜 이런 차이가 중요할까?’, ‘언제 어떤 것을 써야 할까?’에 대해 기록해 보고자 한다(:

Swift를 처음 배우기 시작하면 꼭 마주하게 되는 개념이 있다. 바로 클래스(class)와 구조체(struct), 그리고 열거형(enum)의 차이다. 이 세 가지는 데이터 타입을 설계하는 방식이지만, 사용법이나 작동 방식이 크게 다르다. 특히 클래스는 참조 타입, 구조체와 열거형은 값 타입이라는 점에서 근본적인 차이가 있다.

 

1. 값 타입과 참조 타입 개념

먼저 가장 기본적인 차이인 값 타입(Value Type)과 참조 타입(Reference Type)의 개념부터 살펴보자.

  • 값 타입은 데이터를 전달할 때 값을 '복사'해서 전달한다. 예를 들어 구조체 인스턴스를 다른 변수에 할당하면, 전혀 별개의 인스턴스가 생성되어 원본과는 완전히 독립적으로 작동하게 된다.
  • 참조 타입은 값을 전달하는 것이 아니라 그 값이 저장되어 있는 '메모리 주소'를 전달한다. 그래서 클래스 인스턴스를 다른 변수에 할당하더라도 실제로는 같은 객체를 가리키게 된다. 즉, 둘 중 하나에서 값을 바꾸면 나머지에도 영향을 미친다.

코드를 보면 훨씬 이해가 쉬워진다.

struct ValueType {
    var property = 1
}

class ReferenceType {
    var property = 1
}

let firstStruct = ValueType()
var secondStruct = firstStruct
secondStruct.property = 2

print(firstStruct.property) // 1
print(secondStruct.property) // 2

let firstClass = ReferenceType()
let secondClass = firstClass
secondClass.property = 2

print(firstClass.property) // 2
print(secondClass.property) // 2

위 코드에서 구조체는 독립적으로 동작하지만, 클래스는 같은 데이터를 공유하고 있다는 점이 핵심이다.

 

2. 그럼 언제 값 타입을 쓰고, 언제 참조 타입을 써야 할까?

Swift는 기본적으로 값 타입을 우선시한다. Swift의 Int, Double, Bool, String 같은 기본 타입은 모두 구조체로 구현되어 있다. Swift가 구조체와 열거형을 선호하는 이유는 코드의 안정성과 예측 가능성을 높이기 위해서다.

값 타입을 사용하기 적합한 상황은 다음과 같다.

  • 연관된 몇 개의 값을 묶어 하나의 타입으로 표현하고 싶은 경우
  • 데이터를 다른 함수나 변수에 넘길 때 원본에 영향을 주지 않고, 복사만 하길 원할 경우
  • 상속을 쓸 필요가 없는 경우

예를 들어 좌표를 나타내는 Point, 날짜를 저장하는 Date, 사용자 입력을 기록하는 InputData 등은 대부분 구조체로 만드는 것이 적절하다.

반면, 참조 타입, 즉 클래스를 사용해야 할 때도 분명 존재한다.

  • 두 개 이상의 변수나 상수가 같은 인스턴스를 공유해야 할 경우
  • 인스턴스가 계속해서 상태를 변경하거나 다른 객체에 영향을 주어야 할 경우
  • 상속을 활용해야 하는 경우 (예: ViewController 상속)

iOS 개발에서 UIKit의 대부분은 클래스로 이루어져 있다. 뷰나 뷰컨트롤러를 다룰 때는 참조 타입이 더 적합한 것이다.

3. 열거형도 구조체처럼 값 타입이다?

Swift의 열거형(enum)은 다른 언어와 달리 꽤 강력하다. 단순히 값만 나열하는 것이 아니라, 연관 값을 갖거나 메서드를 정의할 수도 있다. 그리고 구조체처럼 값 타입으로 작동한다. 즉, 복사된 후에는 원본과 완전히 독립적으로 동작한다는 말이다.

예를 들어서 아래와 같이 열거형을 정의할 수 있다.

enum NetworkState {
    case loading
    case success(message: String)
    case failure(errorCode: Int)
}

이런 열거형은 다양한 상태를 표현하면서도 값 타입의 이점을 함께 누릴 수 있다. 그래서 상태 관리나 화면 전환 로직 등에서 유용하게 쓰인다.🥰

 

4. 스위프트의 설계 철학: 구조체 우선, 클래스는 필요할 때만

Swift는 객체지향 언어이면서도 함수형 프로그래밍 개념도 강하게 반영한 언어다. Apple은 공식 문서에서 다음과 같이 말한다.

“구조체와 열거형이 클래스보다 더 단순하고 안전하며, 대부분의 경우 충분하다.”

물론 UIKit이나 AppKit과 같은 Apple 프레임워크는 대부분 클래스를 기반으로 한다. 따라서 iOS 개발을 하다 보면 클래스와 친해질 수밖에 없다. 하지만 로직을 구현하거나 데이터를 저장할 때는 가능하면 구조체를 사용하자. 구조체는 디버깅이 쉽고, 예측 가능한 코드 작성을 도와준다.

또한 Swift의 성능 측면에서도 구조체가 더 유리한 경우가 많다. 값 타입은 메모리 접근이 간단하기 때문에 최적화가 용이하다. 특히 멀티스레드 환경에서는 참조 타입보다 구조체가 동기화 문제에서 자유롭기 때문에 더 안정적인 코드 작성을 할 수 있다.

5. 클래스와 구조체의 선택, 결국은 ‘목적’이다

결국 클래스와 구조체, 열거형 중 무엇을 선택할지는 ‘어떤 동작이 필요한가’, ‘데이터가 어떻게 사용될 것인가’를 기준으로 판단해야 한다.

  • 데이터의 복사와 독립성이 중요하다면 구조체를,
  • 여러 객체에서 같은 인스턴스를 공유해야 한다면 클래스를,
  • 제한된 상태 집합을 정의하고 싶다면 열거형을 선택하자.

ps. 프로그래밍은 언제나 “왜 이걸 쓰는가?”를 스스로에게 묻는 과정이다. 그 이유를 이해하고 쓰는 타입은 실수를 줄이고, 더 읽기 쉽고 유지보수가 쉬운 코드를 만들 수 있게 해준다🖤.

반응형

'IT' 카테고리의 다른 글

Swift 클로저 : 함수보다 강력한 이름 없는 함수  (0) 2025.05.04
Model Context Protocol(MCP)? LLM 생태계를 재정의하는 새로운 표준  (0) 2025.05.02
Swift enum 제대로 이해하기: rawValue부터 메서드까지  (0) 2025.04.30
참조 타입과 값 타입의 차이점, Swift에서 클래스 사용법  (1) 2025.04.29
스위프트 구조체와 객체지향 프로그래밍 기초  (0) 2025.04.28

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • Swift 클로저 : 함수보다 강력한 이름 없는 함수

    Swift 클로저 : 함수보다 강력한 이름 없는 함수

    2025.05.04
  • Model Context Protocol(MCP)? LLM 생태계를 재정의하는 새로운 표준

    Model Context Protocol(MCP)? LLM 생태계를 재정의하는 새로운 표준

    2025.05.02
  • Swift enum 제대로 이해하기: rawValue부터 메서드까지

    Swift enum 제대로 이해하기: rawValue부터 메서드까지

    2025.04.30
  • 참조 타입과 값 타입의 차이점, Swift에서 클래스 사용법

    참조 타입과 값 타입의 차이점, Swift에서 클래스 사용법

    2025.04.29
다른 글 더 둘러보기

정보

Daily Growth 블로그의 첫 페이지로 이동

Daily Growth

  • Daily Growth의 첫 페이지로 이동

검색

메뉴

    카테고리

    • 분류 전체보기 (427) N
      • Design History (69)
      • IT (130) N
      • Typography (13)
      • UX • UI Design (10)
      • Money (62)
      • Health (53)
      • Words (6)
      • Reading (19)
      • English (64)

    나의 외부 링크

    • lody.design
    • lody.canada
    • lody.study
    • lody.diary

    정보

    self-improvement의 Daily Growth

    Daily Growth

    self-improvement

    블로그 구독하기

    • 구독하기
    • 네이버 이웃 맺기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. Copyright © self-improvement.

    티스토리툴바