Class - Class and Struct

Eli·2021년 2월 7일
1

Swift

목록 보기
10/17
post-thumbnail

클래스와 구조체의 일반적인 목적은 유연성있게 코드를 조직화 하기 위해 필요.
OOP를 위한 필수 요소.

Comparing Classes and Structures

Common

  1. 값을 저장하는 Properties 정의
  2. 기능을 제공하기 위한 methods 정의
  3. Collection Type에 접근하기 위한 subscript 정의
  4. 초기 상태를 정의하기 위한 initalizer 정의
  5. extension을 정의
  6. 특정한 기능구현을 위해 protocol을 따르도록 정의

Only Classes have additional capabilities

  1. 상속
  2. 타입 캐스팅
  3. 해제
  4. 참조

Syntax

기본적으로 구조체와 클래스 모두 동일한 방식으로 정의한다.

struct SomeStructure {
		var someInt: Int = 0
		func someFunc() { }
}

class SomeClass {
    // class definition goes here
}

Structures are Value Types

구조체의 특징은 클래스와는 다르게 값 타입이다.

값 타입은선언하여 할당할 때 해당 값의 실제 값이 복사가 되어 전달이 된다.
Swift의 기본적인 int, float, bool, strings, arrays 등의 타입들은 값 타입으로 되어 있다.

//예시를 위한 구조체
struct Resolution {
    var width = 0
    var height = 0
}

let hd = Resolution(width: 1920, height: 1080)
//cinema에는 hd와 동일한 구조체의 값이 복사가 되어 저장된다.
var cinema = hd
cinema.width = 2048

print(hd.width) //print 1920
print(cinema.width) //print 2048

Classes are Reference Types

클래스의 특징은 구조체와는 반대로 참조 타입이다.
참조 타입은 선언하여 할당 할 때에 해당 인스턴스의 주소가 할당이 된다.
위의 struct를 class로 구현을 해보는 예시이다.

class Resolution {
    var width = 0
    var height = 0
}

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048

print(hd.width) //print 2048
print(cinema.width) //print 2048

//hd와 cinema 모두 같은 인스턴스를 바라보고 있기 때문에 cinema의 값을 변경하더라도
//hd의 width에서도 2048로 표기가 되는 것을 볼 수 있다.

Identity Operators

식별 연산자는 클래스의 상수/변수가 같은 인스턴스를 참조하고 있는지를 위한 연산자.

//hd와 cinema는 같은 인스턴스를 참조하고 있어 true결과값이 나옵니다.
print(hd === cinema) //print true

//반대케이스
print(hd !== cinema) //print false

Choosing Between Classes and Structures

아마 가장 중요한 부분일 것 같다.
이런 차이가 있는 건 알겠고 언제 Class를 쓸지? Struct를 쓸지?
처음 코딩을 접했을 떈 단순히 API에서 들어오는 Model Data들만 Struct를 사용하는 줄 알았었다.
그런데 공식 문서에서는 아래와 같은 경우엔 Struct를 고민하라는 가이드라인이 있다.
기존엔 일단 Class부터 쓰고 시작했다면 저것을 읽은 이후로 아래의 1개에 해당한다면 Struct를 고민을 해보자.

  1. 단순한 값 타입들을 캡슐화가 목적일 때

    가장 일반적으로 사용하는 케이스랄까?

  2. 저장된 인스턴스에서 참조보단 복사를 하고 싶을 때
  3. 상속이 필요 없을 때

코드도 일단 쓰던대로 쓰는게 아니라 쓰면서 고민해야지...

#학습에 대한 내용으로 틀린 내용이 있을 수 있습니다.
#댓글로 남겨주시면 더 좋은 게시글로 수정하도록 하겠습니다.

profile
애플을 좋아한다. 그래서 iOS 개발을 한다. @Kurly

0개의 댓글