[다양한 표현 및 확장] 4. 클래스 vs 구조체

Seoyoung Lee·2022년 2월 24일
0


2021년 11월 17일에 공부한 내용입니다.

Class

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

Struct

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

Enum

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

클래스만 유일하게 참조 타입이며 상속이 가능하다.


구조체는 언제 사용하는가?

  • 연관된 몇몇 값들을 모아서 하나의 데이터 타입으로 표현하고 싶을 때
  • 다른 객체 또는 함수 등으로 전달될 때 참조가 아닌 복사를 원할 때
  • 자신을 상속할 필요가 없거나, 자신이 다른 타입을 상속받을 필요가 없을 때
  • Apple 프레임워크에서 프로그래밍을 할 때에는 주로 클래스를 사용한다.

값 타입과 참조 타입 비교

  • 값 타입(Value Type): 데이터를 전달할 때 값을 복사하여 전달한다.
  • 참조 타입(Reference Type): 데이터를 전달할 때 값의 메모리 위치를 전달한다.
struct ValueType {
    var property = 1
}

class ReferenceType {
    var property = 1
}

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

print("first struct instance property : \(firstStructInstance.property)") // 1
print("second struct instance property : \(secondStructInstance.property)") // 2

let firstClassReference = ReferenceType()
var secondClassReferenc = firstClassReference
secondClassReference.property = 2

// 두 번째 클래스 참조는 첫 번째 클래스 인스턴스를 참조하기 때문에
// 두 번째 참조를 통해 인스턴스의 프로퍼티 값을 변경하면
// 첫 번째 클래스 인스턴스의 프로퍼티 값을 변경하게 된다.
print("first class reference property : \(firstClassReference.property)") // 2
print("second class reference property : \(secondClassReference.property)") // 2

Data types in Swift

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

모두 구조체로 선언이 되어있다!


스위프트에서의 사용

  • 스위프트의 기본 데이터 타입은 모두 구조체로 구현이 되어있다.
  • 스위프트는 구조체, 열거형 사용을 선호한다.
  • Apple 프레임워크는 대부분 클래스를 사용한다.
  • Apple 프레임워크 사용시 구조체/클래스 선택은 개발자의 몫이다.
profile
나의 내일은 파래 🐳

0개의 댓글