[Swift] 09. 값 타입과 참조 타입(클래스, 구조체, 열거형 비교)

·2023년 1월 31일
1

Swift 문법

목록 보기
8/8
post-thumbnail

클래스, 구조체, 열거형에 대해 다시 한 번 살펴보며 비교해보자.

Class

  • 전통적인 OOP 관점에서의 클래스
  • 단일상속
  • (인스턴스/타입) 메서드
  • (인스턴스/타입) 프로퍼티
  • 참조 타입
  • Apple 프레임워크의 대부분의 큰 뼈대는 모두 클래스로 구성

Struct

  • C 언어 등의 구조체보다 다양한 기능
  • 상속 불가
  • (인스턴스/타입) 메서드
  • (인스턴스/타입) 프로퍼티
  • 값 타입
  • Swift의 대부분의 큰 뼈대는 모두 구조체로 구성

Enum

  • 다른 언어의 열거형과는 많이 다른 존재
  • 상속 불가
  • (인스턴스/타입) 메서드
  • (인스턴스/타입) 연산 프로퍼티
  • 값 타입
  • Enumeration
  • 유사한 종류의 여러 값을 유의미한 이름으로 한 곳에 모아 정의       ex)요일, 상태값
  • 열거형의 자체가 하나의 데이터 타입
    열거형의 case 하나하나 전부 하나의 유의미한 값으로 취급
  • 선언 키워드 - enum



구조체는 언제 사용?

언뜻보면 구조체랑 클래스랑 비슷해 보인다. 연관된 몇몇의 값들을 모아서 하나의 데이터 타입으로 표현하고 싶을 때 쓴다는 점에서.

하지만, 다음과 같은 경우에는 구조체를 사용해야 한다.

  • 다른 객체 또는 함수 등으로 전달될 때, 참조가 아닌 복사를 원할 때
  • 자신을 상속할 필요가 없거나, 자신이 다른 타입을 상속받을 필요가 없을 때

Apple 프레임워크에서 프로그래밍을 할 때에는 주로 클래스를 많이 사용한다.

값 타입? 참조 타입?

값 타입은, 데이터를 전달할 때 값을 복사하여 전달하고
참조 타입은, 데이터를 전달할 때 값의 메모리 위치를 전달한다.
아래 예시를 보면 차이점이 뭔지 직관적으로 이해가 더 잘 될 것이다.

여기서 알 수 있는 점은, 클래스의 경우, 두 참조가 모두 같은 인스턴스를 가리키고 있으므로, 값이 전달될 때 복사되는 것이 아니라 참조값이 복사돼서 간다는 것을 알 수 있다.



그렇다면 아래 코드의 결과값은 무엇이 될까?

결과값은   Property   이다.
someStructInstance가 someFunction으로 전달될 때에는, 복사가 되어서 전달되기 때문이다.



클래스의 경우엔 다르다.

결과값은   ABC   이다.
원래있던 인스턴스(someClassInstance)의 참조가 someFunction으로 전달되었기 때문에, localVar도 계속 똑같은 인스턴스를 참조하기 때문이다.

0개의 댓글