반응형
카테고리 | 게시글 작성 날짜 | 게시글 최근 수정 날짜 | 작성자 |
iOS | 2020-02-15 15:08 | 2021.12.03. 22:58 | Dev.Yang |
🛠 구조체 (Struct)
구조체는 하나 이상의 변수를 묶어서 새로운 자료형을 정의하는 도구입니다. Swift에서의 구조체는 대문자 카멜 케이스를 사용하여 이름을 명명하며 프로퍼티와 메서드는 소문자 카멜 케이스를 사용하여 이름을 명명합니다. 또한 Swift에서의 구조체는 개발자가 직접 이니셜 라이저를 생성하지 않아도 자동적으로 생성이 된 기본 이니셜 라이저를 통하여 구조체의 프로퍼티 이름으로 자동 지정됩니다.
Swift에서 구조체를 사용하기 위해서 선언할 때 let으로 선언하는 경우에는 인스턴스 내부의 프로퍼티 값을 변경할 수 없습니다. 하지만 var로 선언하면 내부의 프로퍼티가 var선언 이 된 프로퍼티에 한해서 값을 변경할 수 있습니다. 또한 Apple 공식 문서에 따라서 아래와 같은 경우에는 Struct 자료 형태를 사용하는 것을 권장하고 있습니다.
- Swift의 기본 자료형 타입 (Int, Float, Double, String, Array, Dictionary, Set 등)은 모두 구조체 형태로 구현이 되어있으며, 이는 Swift 기본 자료형 타입은 모두 값 타입이라는 뜻입니다.
- 값 타입 (Value Type) 형태입니다.
구조체 (Struct)를 사용하는 경우는 아래와 같습니다.
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적인 경우
- 캡슐화한 값을 참조하는 것보다 복사하는 것이 적합한 경우
- 구조체에 저장 된 프로퍼티가 값 타입이며 참조하는 것보다 복사하는 것이 적합한 경우
- 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없는 경우
아래의 소스코드는 구조체 (Struct) 예제 소스코드입니다.
struct SomeStruct {
var name: String
init(name: String) {
self.name = name
}
}
var aStruct = SomeStruct(name: "Bob")
var bStruct = aStruct // aStruct and bStruct are two structs with the same value!
bStruct.name = "Sue"
println(aStruct.name) // "Bob"
println(bStruct.name) // "Sue"
🛠 클래스 (Class)
객체 지향 프로그래밍에서, 데이터와 그 조작 절차인 메소드를 정리한 객체의 추형을 정의한 것입니다. Swift에서 클래스를 정의할 때에는 class라는 키워드를 사용합니다. 또한 구조체와 동일하게 대문자 카멜 케이스를 사용하여 이름을 명명하며, 프로퍼티와 메서드는 소문자 카멜케이스를 사용하여 이름을 명명합니다.
- Swift 공식 문서에서는 다른 프로그래밍 언어와는 달리 클래스의 인스턴스를 객체가 아닌 인스턴스 용어를 사용할 것을 권장합니다.
- 참조 타입 (Reference Type) 형태입니다.
🛠 클래스와 구조체 공통점 및 차이점 (Swift Struct and Class Difference)
class Car {
var name: String
init(name:String){
self.name = name
}
}
var carA = Car(name: "BMW")
var carB = carA
//now I will change carB
carB.name = "Nissan"
print(carA.name) //This will print Nissan
struct CarStruct {
var name: String
init(name: String){
self.name = name
}
}
var carC = CarStruct(name: "BMW")
var carD = carC
//now I will change carB
carD.name = "Nissan"
print(carC.name) //This will print BMW
✏️ 공통점
- 값을 저장하기 위해서 프로퍼티를 정의할 수 있습니다.
- 기능 실행을 위해서 메서드를 정의할 수 있습니다.
- 서브 스크립트 문법을 통하여 구조체 또는 클래스가 갖는 값에 접근하도록 서브 스크립트를 정의할 수 있습니다.
- 초기화될 때의 상태를 지정하기 위해서 이니셜 라이저를 정의할 수 있습니다.
- 초기 구현과 더불어 새로운 기능 추가를 위하여 익스텐션 (Extension)을 통하여 확장할 수 있습니다.
- 특정 기능을 실행하기 위해서 특정 프로토콜을 준수할 수 있습니다.
🇺🇸 원문 내용은 아래의 접은글에서 확인 할 수 있습니다.
더보기
- Define properties to store values
- Define methods to provide functionality
- Define subscripts to provide access to their values using subscript syntax
- Define initializers to set up their initial state
- Be extended to expand their functionality beyond a default implementation
- Conform to protocols to provide standard functionality of a certain kind
✏️ 차이점
- 구조체는 클래스와 달리 상속을 할 수 없습니다.
- 타입 캐스팅은 클래스의 인스턴스에서만 사용이 가능합니다.
- Deinitializer는 클래스의 인스턴스에서만 사용할 수 있습니다.
- 참조 횟수 계산 (Reference Counting)은 클래스의 인스턴스에서만 적용됩니다.
🇺🇸 원문 내용은 아래의 접은글에서 확인 할 수 있습니다.
더보기
- Inheritance enables one class to inherit the characteristics of another.
- Type casting enables you to check and interpret the type of a class instance at runtime.
- Deinitializers enable an instance of a class to free up any resources it has assigned.
- Reference counting allows more than one reference to a class instance.
🚀 REFERENCE
반응형
'# 애플 [Apple] > iOS' 카테고리의 다른 글
[iOS] Swift 고차 함수 (Higher-order function) (0) | 2020.06.05 |
---|---|
[iOS] Xcode에서 파이썬 빌드하기 (Running Python in Xcode) (0) | 2020.05.14 |
[iOS] 🔗 유용한 iOS 오픈소스 라이브러리 (Awesome Open Source Library) (0) | 2020.01.15 |
[iOS] URL 주소를 통해서 사파리에서 열기 (How to open a URL in Safari?) (0) | 2019.11.20 |
[iOS] SQLite (SQLite With Swift Tutorial: Getting Started) (0) | 2019.10.25 |
댓글