Swift/기초 문법

클래스 vs 구조체/열거형(상속타입 vs 값 타입)

수줌이 2021. 2. 10. 12:53

⭐ 비교 및 정리 

- Class(상속 o, extension o)

  • 대부분의 OOP(객체지향언어) 관점에서의 클래스와 동일

  • 단일 상속

  • (인스턴스/타입) 메서드, (인스턴스/타입) 프로퍼티를 가짐

  • 참조타입(상속)

  • 'Apple 프레임워크의 대부분의 큰 뼈대'는 모두 클래스로 구성

- Struct(상속 x, extension o)

  • C 언어 등의 구조체보다 다양한 기능

  • 상속 불가

  • (인스턴스/타입) 메서드, (인스턴스/타입) 프로퍼티를 가짐

  • 값 타입

  • 'Swift의 대부분의 큰 뼈대'는 모두 구조체로 구성

- enum(상속 x, extension o)

  • 다른 언어의 열거형과는 많이 다른 존재(기능이 많음)

  • 상속 불가

  • (인스턴스/타입) 메서드

  • (인스턴스/타입) 프로퍼티

  • 값 타입

  • enumeration

  • 유사한 종류의 여러 값을 유의미한 이름으로 한 곳에 모아 정의  ex) 요일, 상태값, 월 등

  • 열거형 자체가 하나의 데이터 타입 열거형의 case 하나하나 전부 하나의 유의미한 값으로 취급

 

⭐ 클래스 vs 구조체/열거형 

  • 클래스는 참조 타입, 열거형과 구조체는 값 타입이라는 것이 가장 큰 차이입니다.

  • 클래스는 상속이 가능하지만, 열거형과 구조체는 상속이 불가능 합니다.

 

1. 구조체는 언제 사용할까요?

  • 연관된 몇몇의 값들을 모아서 하나의 데이터타입으로 표현하고 싶을 때

  • 다른 객체 또는 함수 등으로 전달될 때, 참조가 아닌 복사를 원할 때

  • 자신을 상속할 필요가 없거나, 자신이 다른 타입을 상속 받을 필요가 없을 때

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

 

2. Value(값 타입) vs Reference(상속)

  • Value : 데이터를 전달할 때 값을 복사하여 전달

  • Reference : 데이터를 전달할 때 값의 메모리 위치를 전달

//Class vs Struct/enum

import Swift

//1. Struct/enum
struct ValueType {
		var property = 1
}

let firstStructInstance = ValueType()
var secondStructInstance = firstStructInstance
secondStructInstance.property = 2

// '값 타입'이기 때문에 first에 들어있던 값이 second에 '복사'되고 second값을 변경 했을 때
// first값에 영향을 주지 않음
print("first struct instance property : \(firstStructInstance.property)") // 1
print("second struct instance property : \(secondStructInstance.property)") // 2

//2. Class
class ReferenceType {
		var property = 1
}

let firstClassReference = ValueType()
var secondClassReference = firstClassReference
secondClassReference.property = 2

// '참조 타입'이기 때문에 first에 들어있던 값을 second가 참조하고
// 따라서 second값을 변경 했을 때 참조 했던 first값도 바뀌게 됨(first,second가 같은 인스턴스를 참조하고있기때문)
print("first class reference property : \(firstClassReference.property)") // 2
print("second class reference property : \(secondClassReference.property)") // 2

 

3. 데이터 타입

  • swift의 기본 데이터 타입은 모두 구조체로 구현되어있습니다.

  • swift는 구조체와 열거형 사용을 선호합니다.

  • Apple 프레임워크는 대부분 클래스를 사용합니다.

public struct Int
public struct Double
public struct String
public struct Dictionary<Key : Hashable, Value>
public struct Array<Element>
public struct Set<Element : Hashable>

⭐ 구조체/클레스 선택과 사용은 개발자의 몫입니다 !! 

 

이 글은 Boostcourse에서 배운 내용을 정리하여 작성하였습니다.