728x90
반응형
안녕하세요 🐶
빈 지식 채우기의 비니🙋🏻♂️ 입니다.
오늘은 Class와 Struct에 대해 알아보는 시간을 가지겠습니다.
1. 개요
iOS 개발자로 면접을 준비하다 보면 해당 질문을 많이 접할 수 있습니다.
우리가 흔히 개발할 때 자주 쓰여도 말로 설명하라고 하면 잘 못하겠어서 이렇게 정보 공유를 하고자 글을 작성하게 되었습니다.
저도 이론적으론 잘 몰랐..
2. Class 와 Struct
Class 와 Struct 는 OOP ( Object-Oriented Programming ) 을 위한 필수 요소로 프로그램의 코드를 추상화하기 위해 사용한다.
2-1. 기본 문법
- 기본 형태
struct testStruct {
// 프로퍼티와 메서드 구현
}
class testClass {
// 프로퍼티와 메서드 구현
}
- 인스턴스 생성
let classInstance = testClass() // 클래스 인스턴스 생성
let structInstance = testStruct() // 구조체 인스턴스 생성
- 초기화 ( Initialization )
- 구조체 초기화
struct BodySize {
var height = 0.0
var weight = 0.0
init(height: Double = 0.0, weight: Double = 0.0) {
self.height = height
self.weight = weight
}
init(_ height: Double = 0.0, _ weight: Double = 0.0) {
self.height = height
self.weight = weight
}
init(height: Double = 0.0) {
self.height = height
}
init(weight: Double = 0.0) {
self.weight = weight
}
}
let body1 = BodySize(height: 170.0)
let body2 = BodySize(weight: 63.5)
let body3 = BodySize(height: 170.0, weight: 63.5)
let body4 = BodySize(170.0, 63.5)
위에서 만든 BodySize 구조체가 있습니다.
- 저장 프로퍼티 대로 구조체 초기화가 가능합니다.
- 매개변수 앞에 _ 삽입 시, 인스턴스 생성을 보다 간단하게 할 수 있습니다.
- 클래스 초기화
class Person {
var name = ""
var age = 0
var body = BodySize(height: 170.0, weight: 63.0)
init(name: String = "", age: Int = 0, body: BodySize = BodySize(height: 170.0, weight: 63.0)) {
self.name = name
self.age = age
self.body = body
}
convenience init(name: String = "") {
self.init(name: name, age: 27, body: BodySize(height: 170.0, weight: 63.0))
}
func introduce() {
print("나의 이름은 \(name) 입니다. 나이는 \(age)살이고 키와 몸무게는 각각 \(body.height)cm \(body.weight)kg 입니다.")
}
}
let person1 = Person(name: "티스토리", age: 29, body: .init(height: 180.0))
let person2 = Person(name: "티스토리2")
위에서 만든 BodySize 클래스가 있습니다.
지정 이니셜라이저 ( Designated Initializer )
- 클래스의 모든 저장 프로퍼티를 초기화 한다.
- 부모 클래스의 이니셜라이저를 호출을 할 수 있다.
- 클래스 내부에는 반드시 한 개 이상의 지정 이니셜라이저가 있어야 한다.
init(매개 변수) {
// 구현부
}
편의 이니셜라이저 ( Convenience Initializer )
- 지정 이니셜라이저의 일부 매개 변수의 기본 값을 설정하여 초기화 한다.
- 더 적은 입력으로 초기화를 편리하게 할 수 있게 해준다.
convenience init(매개 변수) {
// 구현부
}
3. 공통점
- 값을 저장하기 위한 저장 프로퍼티를 지정
- 간단하게 let, var 로 생각할 수 있습니다.
- 기능 동작을 위한 메소드 정의 가능
- 생성자을 구현하여 초기화 가능
- 상단 초기화 예시에서 확인이 가능합니다.
- Extension 을 통해 기능 확장 가능
- 프로토콜 채택하여 기능을 설정할 수 있음
- 서브스크립트 사용 가능
서브스크립트에 대한 설명
참조) [ Swift ] 서브스크립트 ( Subscript )
4. 차이점
4-1. Class
- 참조 타입 ( call by reference )
- 인스턴스 Heap 저장, 주소 Stack 저장
- COW ( Copy-On-Write )
- ARC ( Auto Reference Counting ) 으로 메모리 관리
- 상속 가능
- 고유성을 유지하고 싶을 때 사용
COW ( Copy-On-Write )
ARC ( Auto Reference Counting )
4-1-1. 참조 타입 ( call by reference )
데이터를 전달할 때 값의 메모리 위치를 전달
class Student {
var name = ""
}
var student1 = Student() // (1) Student1 인스턴스 생성
student1.name = "티스토리" // (2)
print(student1.name) // 티스토리
var student2 = student1 // (3) Student2 인스턴스 생성
student1.name = "새로운 티스토리" // (4)
print(student2.name) // 새로운 티스토리
위에 간단하게 만든 Student 클래스가 있습니다
- student1 인스턴스 생성
- name 저장 프로퍼티에 "티스토리" 할당
- student2에 student1 할당
- student1 저장 프로프티에 "새로운 티스토리" 할당
3번 과정에서 student1를 할당시 메모리의 위치를 전달을 하기 때문에 student1, student2 둘다 동일한 주소 값을 바라보게 된다.
그러므로 4번 과정에서 student1 의 내부 값이 바뀌어도 동일한 주소를 바라보는 student2의 값도 바뀌게 된다.
if student1 === student2 {
print("Equal instance")
}
식별 연산자(===, !==)를 통해 같은 인스턴스를 참고하고 있는지 체크가 가능합니다.
4-2. Struct
- 값 타입 ( call by value )
- 인스턴스 및 주소 Stack 저장
- 상속 불가능
- 불변성을 유지하고 싶을 때 사용
4-2-2. 값 타입 ( call by value )
데이터를 전달할 때 값을 복사하여 전달
struct Student {
var name = ""
}
var student1 = Student() // (1) Student1 인스턴스 생성
student1.name = "티스토리" // (2)
print(student1.name) // 티스토리
var student2 = student1 // (3) Student2 인스턴스 생성
student1.name = "새로운 티스토리" // (4)
print(student2.name) // 티스토리
위에 간단하게 만든 Student 구조체가 있습니다
- student1 인스턴스 생성
- name 저장 프로퍼티에 "티스토리" 할당
- student2에 student1 할당
- student1 저장 프로프티에 "새로운 티스토리" 할당
3번 과정에서 student1를 할당시 값을 복사하여 전달을 하기 때문에 student1, student2 둘다 각각의 독립적인 인스턴스로 구성된다.
그러므로 4번 과정에서 student1 의 내부 값이 바뀌어도 독립적인 student2 인스턴스의 값은 바뀌지 않는다.
5. 결론
구조체를 사용하는 것이 유리한 경우
1. 연관된 간단한 값의 집합을 캡슐화의 목적인 경우
2. 인스턴스가 참조가 되는 것보다 복사되는 것을 원하는 경우
3. 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때
이상으로 Class VS Struct 포스팅을 마치겠습니다.
틀린 부분이나 궁금한 사항은 댓글 남겨주세요~🤭
참고
728x90
반응형
'iOS 🖥️ > Swift' 카테고리의 다른 글
[ Swift ] KVC(Key-Value-Coding), KVO(Key-Value-Observing) (0) | 2023.01.05 |
---|---|
[ Swift ] 서브스크립트 ( Subscript ) (0) | 2022.12.30 |
[ Swift ] ARC (2) Retain Cycle, 강한참조, 약한참조 그리고 미소유참조 (0) | 2022.12.29 |
[ Swift ] ARC (1) 기본 개념, Reference Count 이해 (0) | 2022.12.28 |
[ Swift ] COW ( Copy-On-Write ) (0) | 2022.12.27 |