Weekoding

[Swift] class와 structure의 차이점 본문

공부 노트(Swift)

[Swift] class와 structure의 차이점

Weekoding 2023. 5. 20. 12:56

구조체와 클래스의 생성은 새로운 사용자 정의 데이터 타입을 만드는 것과 동일하다.

둘 모두 프로퍼티와 메소드를 사용하여 구조화된 데이터와 기능을 가질 수 있기 때문이다.

또한 둘은 문법도 흡사하다고 한다.

어떤 차이점이 둘을 구분하고 상황에 맞게 사용하게 하는지 알아보자.

 

 

📂  Structure(구조체)

구조체의 정의는 "struct" 키워드로 정의한다.

struct SoftDrink{
 var flavor: String
 var kcal: Int
 var isSpecialEdition : Bool = false
 //내부에 메소드도 선언할 수 있다.
}

 

구조체의 인스턴스 생성도 어렵지 않다.

var grapeSoda: SoftDrink = SoftDrink(flavor: "lime", kcal: 651)
let zeroSoda: SoftDrink = SoftDrink(flavor: "lemon", kcal: 0)

//프로퍼티가 초기값이 있다면, 인스턴스 생성시 값을 꼭 넣어줄 필요는 없다.
var stardustSoda: SoftDrink = SoftDrink(flavor: "stardust", kcal: 0, isSpecialEdition: true)


grapeSoda.flavor = "Grape"

/*
  let(상수)로 구조체 인스턴스를 생성하면, 생성 이후 내부의 값을 변경할 수 없다.
  var(변수)로 구조체 인스턴스를 생성하면, 생성 이후 변경 가능하지만 내부 프로퍼티가 let이면 불가하다.
*/

 

 

📂  Class(클래스)

클래스의 정의는 "class" 키워드로 정의한다.

가장 많이 접하고, 쓰이는 개념이기도 하니 아주 간단하게만 짚어보자.

class MyViewController: UIViewController{
  //위처럼 상속을 받는 경우, ':'을 붙여 뒤에 상속할 클래스 명을 붙여준다.(자세한 개념은 후에 상술)
}

내부에 구조체와 동일하게 프로퍼티와 메소드를 정의할 수 있다.

 

[ ⭐️ 알짜 상식  - 인스턴스 표현 ]

보통 클래스의 인스턴스를 '객체'라고 표현한다고 한다.

그러나 Swift 공식 문서(Apple Developer의 사이트)에서는 인스턴스라는 한정적 표현만을 사용한다고 한다.

 

 

📂  Structure vs Class

가장 큰 차이점은, 무엇이 전달되느냐!

  structure class
공통점 - 내부에 프로퍼티와 메소드를 정의할 수 있다.
- protocol을 준수할 수 있다.
- extension이 가능하다.
- 프로퍼티에 접근할 수 있도록 '서브스크립트'를 정의할 수 있다.
차이점 - 상속이 불가능하다.
- 타입캐스팅이 불가능하다.
- value type이다.

- 상속이 가능하다.
- 타입캐스팅이 가능하다.
- reference type이다.
  (해제 시 deinit()이 호출됨, reference counting이 가능)

서브스크립트: 특정 member element에 간단하게 접근할 수 있는 문법.

ex) array[3], myDictionary["name"] 

 

deinit() : class는 reference value(참조 타입)이므로, 더는 참조할 필요가 없을 때 메모리에서 해제된다. 그 때 호출되는 함수.

클래스당 하나만 구현할 수 있으며, 파라미터와 리턴 값을 가질 수 없다.

Value Type

새로운 변수에 할당하거나, 함수 전달인자로 전달 시에

전달하려는 값이 들어간 새로운 인스턴스가 생성되고, 이를 넘기는 타입

기존의 인스턴스와 새 인스턴스는 서로 가진 값에 영향을 주지 않는다.

Reference Type

새로운 변수에 할당하거나, 함수 전달인자로 전달 시에

새로운 인스턴스가 아닌 기존의 인스턴스 참조를 전달하는 타입

값을 변경하면, 기존의 인스턴스가 가진 값에 영향을 준다.

 

[ ⭐️ 알짜상식 - 식별 연산자 ]
' == ' : 두 값의 value가 같은지 비교하는 연산자
' === ' : 두 변수가 참조하고 있는 인스턴스가 같은지 비교하는 연산자

 

 

🗝 상황에 맞게 Structure와 Class를 사용하기

프로퍼티와 메소드를 정의할 수 있다는 공통점이 있지만, 타입에 있어 차이점이 존재한다는 것은 용도가 다르다는 것을 의미한다.

Swift Programming Language Guide에서는 다음 조건 중 1개 이상을 만족한다면, Structure 사용을 권장한다고 한다.

  • 연관된 간단한 값의 집합을 캡슐화 하는 것만이 목적인가?
  • 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당한가?
  • 구조체에 저장된 프로퍼티가 값 타입이며 참조하는 것보다 복사하는 것이 합당한가?
  • 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없는가?

 

 

📌 마치며

사용자가 정의하여 사용하는 데이터 타입은 대다수가 클래스로 구현할 일이 많아서

우리가 상대적으로 Structure보다 Class가 익숙하다고 느끼는 것 같다.

클래스와 구조체의 타입 차이를 잘 짚어서 고민할 줄 안다면, 완벽히 이해한 것이라고 생각한다.

 

 

 

 

 

오류 및 지적사항은 댓글로 남겨주시면 감사하겠습니다!

참고 : Swift Programming 3판, 야곰 지음

Comments