- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Algorithm
- dart
- 스위프트디자인패턴
- swift split
- 자료구조
- datastructure
- sort
- 프로그래머스 레벨2
- swift
- 정렬 알고리즘
- coding test
- 코테
- swift 알고리즘
- 정렬
- 디자인 패턴
- 디자인패턴
- 다트
- swift 코딩테스트
- 코딩테스트
- 프로그래머스
- 스위프트
- programmer
- 프로그래머스 level1
- 알고리즘
- Design Pattern
- programmers
- 정렬알고리즘
- 감성에세이
- 프로그래머스 swift
- rxswift
Bill Kim's Life...
[Swift] Class & Structure : 공통점과 차이점 본문
Swift5의 클래스와 구조체의 공통점과 차이점에 대해서 살펴봅니다.
#. 개발 환경
- Xcode 11.x 이상
- Swift 5
클래스와 구조체의 공통점
Swift에서의 클래스와 구조체의 공통점은 대략적으로 아래와 같습니다.
- 프로퍼티 정의가 가능
- 메소드 정의가 가능
- 초기화(initializer) 정의가 가능
- 확장(extension) 사용 가능
- 프로토콜(protocol) 사용 가능
- 서브스크립트(subscript) 사용이 가능(해당 내용은 추후 별도 강좌로 소개해드리겠습니다)
클래스와 구조체의 차이점
그렇다면 Swift에서의 클래스와 구조체의 차이점으로는 무엇이 있는지 살펴보겠습니다.
- 구조체는 값 타입(Value type)
- 클래스는 참조 타입(Reference type)
- 구조체는 상속이 불가능
- 타입캐스팅은 클래스의 인스턴스에만 허용
- 디이녈라이저는 클래스의 인스턴스에만 활용
- 구조체에서는 AnyObject로 타입캐스팅이 불가능
- 구조체는 생성자를 구현하지 않을 시 기본 initializer를 사용 가능
- 클래스는 Reference counting으로 메모리 관리가 가능
초기화 및 인스턴스화
그렇다면 클래스와 구조체의 초기화 및 인스턴스화하여 사용하는 방법을 소스를 통해서 한번 살펴보겠습니다.
★ 구조체 사용 예시
struct Person {
var name: String
var age: Int
}
// 프로퍼티 이름(name, age)으로 자동 생성된 이니셜라이저를 사용하여 구조체를 생성합니다.
var bill: Person = Person(name: "Bill", age: 99)
bill.age = 30
bill.name = "Bill"
var joyce = bill;
joyce.age = 50;
print(bill.age) // 30
print(joyce.age) // 20, joyce는 별도의 주소로 생성
★ 클래스 사용 예시
class Person {
var name: String = "" // 값을 초기화하지 않을 경우는 기본 초기화 함수를 생성하여야 한다.
var age: Int = 0 // 값을 초기화하지 않을 경우는 기본 초기화 함수를 생성하여야 한다.
// 기본 초기화 함수인 init 함수이며 변수 선언과 동시에 값을 초기화하지 않는 경우
// 반드시 선언하여 변수 값을 설정해주어야 한다.
init(name: String, age:Int)
{
self.name = name
self.age = age
}
}
var bill: Person = Person()
bill.age = 30
bill.name = "Bill"
print(bill.age)
var joyce = bill
joyce.age = 20;
print(bill.age) // 20, joyce 객체가 bill의 인스턴스 주소와 동일하여 bill의 나이도 같이 변경됨
print(joyce.age) // 20
Deinitialize(해제)
Swift에서는 클래스 인스턴스가 해제될 때 deinit 함수가 자동으로 호출됩니다.
아래는 deinit 함수 관련 예제입니다.
따라서 객체 소멸과 관련된 처리는 deinit() 함수에서 처리하면 좋습니다.
class Person {
var name: String
var age: Int
init(name: String, age:Int)
{
self.name = name
self.age = age
}
deinit {
print("Person 클래스의 인스턴스가 소멸됩니다.")
}
}
그렇다면 언제 구조체를 사용할까?
앞서 클래스와 구조체에 대한 공통점과 차이점을 살펴보았습니다.
대부분의 구조체의 기능은 클래스에서 거의 사용이 가능합니다. 그렇다면 구조체는 왜 필요한 것이며 언제 사용하면 좋을까요?
이 물음에 대한 대답은 애플에서도 아래와 같이 제시하고 있습니다.
다음 아래의 조건 중 하나 이상에 해당된다면 바로 구조체를 사용하면 좋은 시점이 될 것입니다.
1) 연관된 간단한 값의 집합을 캡슐화 하는 것만이 목적일 때
2) 캡슐화된 값이 참조되는 것보다 복사되는 것이 합당할 때
3) 저장된 프로퍼티가 참고보다는 복사되기를 기대하는 경우
4) 프로퍼티나 메소드 등을 상속할 필요가 없는 경우
이상으로 Swift에서의 클래스와 구조체의 공통점과 차이점에 대해서 살펴보았습니다.
그럼 여러분들께 조금이나마 좋은 정보가 제공되었기를 희망하며 글을 마치도록 하겠습니다.
감사합니다.
www.slideshare.net/BillKim8/class-structure-233789888
[참고 자료(References)]
[1] 클래스과 구조체 (Classes and Structures) : https://jusung.gitbook.io/the-swift-language-guide/language-guide/09-classes-and-structures
[2] Swift struct vs. class 차이점 비교 분석 : https://www.letmecompile.com/swift-struct-vs-class-차이점-비교-분석/
[3] Swift – 구조체 클래스 : https://blog.yagom.net/530/
[4] Swift :: 구조체와 클래스 차이 (struct VS class) : https://shark-sea.kr/entry/Swift-구조체와-클래스-차이-struct-vs-class
[5] 오늘의 Swift 상식 (Struct, Class) : https://medium.com/@jgj455/오늘의-swift-상식-struct-class-60fa5fd2218d
[6] Swift - 언제 class 대신 struct 를 사용하는가 : http://seorenn.blogspot.com/2016/04/swift-class-struct.html
[7] Swift 구조체와 클래스 : https://hwiveloper.dev/2017/05/31/swift-struct-and-class/
[8] [iOS][Swift] 구조체와 클래스 : Difference between Struct and Class : https://caution-dev.tistory.com/6
[9] [Swift]Class와 Structure 정리 : http://minsone.github.io/mac/ios/swift-classes-and-structures-summary
[10] [Swift] 구조체와 클래스의 차이점 (Mutating) : http://blog.davepang.com/post/353
'CS(컴퓨터 과학) > Swift' 카테고리의 다른 글
[Swift] Types : Named(명명) Type과 Compound(복합) Type (0) | 2020.06.11 |
---|---|
[Swift] Method(메소드) : 인스턴스 메소드와 타입 메소드 (0) | 2020.06.11 |
[Swift] Properties(프로퍼티) : 개념과 사용 방법 (0) | 2020.06.11 |
[Swift] Swift5 vs Objective C : 문법적 차이 (0) | 2020.06.11 |
[Swift] Swift5 vs Objective C : 개념적 차이 (0) | 2020.06.11 |