No.12
구조체, 클래스의 초기화 의미
- 클래스도 처음부터 만들어 낼 때 데이터를 담을 수 있다.
- 생성자
- 인스턴스를 만들때 사용하는 특별한 메서드
- 초기화 하는 역할
- 모든 저장 속성(변수)를 초기화 해야 함 (구조체, 클래스 동일)
- 생성자 실행 종료시점에는 모든 속성의 초기값이 저장되어 있어야 함(초기화가 완료되지 않으면 에러)
- 클래스, 구조체, (열거형)은 모두 설계도 일뿐, 실제 데이터(속성), 동작(메서드)을 사용하기 위해서는 초기화 과정이 반드시 필요
- 인스턴스 초기화 완료 시 메모리에 정상적으로 인스턴스가 생성
- 오버로딩 지원
- 생성자를 여러개 구현 가능
- 여러 방식으로 인스턴스를 생성하는 방법을 제공
class Dog {
var name: String
var weight: Double
init(name: String, weight: Double) {
self.name = name
self.weight = weight
}
}
var bori = Dog(n: "보리", w: 15.0)
bori.name // 보리
bori.weight // 15
- self 키워드는 클래스 / 구조체 내에서 해당 인스턴스(자기자신)를 가르킴
- 초기화의 의미 - 속성이 옵셔널 타입인 경우
- 옵셔널타입을 가진 변수의 경우는 반드시 초기화값이 있을 필요는 없음 ➞ nil로 초기화되기 때문
class Dog {
var name: String?
var weight: Int
init(weight: Int) {
self.name = "강아지"
self.weight = weight
}
func sit() {
print("\(name) 앉아!")
}
func layDown() {
print("\(name) 누워!")
}
}
var myDog = Dog(weight: 10)
if let i = myDog.name {
print(i) // "강아지"
}
- 식별 연산자
- 두개의 참조가 같은 인스턴스를 가리키고 있는지를 비교하는 방법
구조체와 클래스의 차이
- 구조체
- Value Type (값 형식)
- 값의 저장 : Stack / 복사 전달 → 메모리에서 자동 제거
- 인스턴스 상수(let) 선언시 저장 속성이 전부 상수로 선언
- 멤버와이즈 이니셜라이저 (자동)제공
- 메서드 내에서 속성 변경 원칙적으로 불가능
- 소멸자 없음
- 상속 불가능
- 클래스
- Reference Type (참조 형식)
- 값의 저장 : Heap / 주소 전달 → ARC로 관리
- 인스턴스 상수(let) 선언하면 가르키는 인스턴스 고정
- 편의 생성자 존재
- 메서드 내에서 속성 변경 가능
- 소멸자 있음
- 상속 가능(클래스가 유일)
값형식과 참조형식
- 값 형식(구조체)
- Value Type
- 필요시에 항상 메모리의 값이 복사되어 전달
- 값이 들어있는 스택의 스코프가 종료되면 메모리에서 자동 제거
- 스위프트 기본 타입(Int, String, … ), 튜플, 열거형, 컬렉션, 구조체
- 참조 형식(클래스)
- Reference Type
- 필요시에 항상 메모리의 주소를 전달
- 값의 저장: Heap (주소를 Stack에 저장)
- RC(Reference Counting)을 통해 메모리를 관리, Swift에서 사용하는 ARC 모델
- 클래스 ,클로저
객지프의 필요 이유
- 결국 클래스는 (의미있는)데이터를 묶음으로 만들려는 것
클래스/구조체를 사용하는 이유 2가지
- 사용하려는 모델의 설계
- Data Transfer Object (DTO) / VO : 관련 데이터를 한 곳에 담는 역할
- Data Access Object (DAO) : 데이터 처리(비즈니스 로직)
- Helper Object : 유틸리티 (도움주는 기능 / 날짜, 시간, 통화, 인코딩)
- 애플이 미리 설계해 놓은 클래스/구조체들을 잘 사용하기 위함(프레임 워크)
언제 클래스 / 구조체를 사용해야 하는가?
데이터 관점 |
➡️ |
➡️ |
➡️ |
변수/상수 |
구조체 |
클래스 |
|
메모리에 오랫동안 저장 하지 않음 |
메모리에 오랫동안 저장(관리) |
|
상속 없이, 조금 가볍게 사용 |
상속 |
|
|
|
- 정답이 있는 것은 아님. 프로젝트의 사례 적합성에 따라 선택
- 연관된 데이터들을 단순히 캡슐화(묶는)하는 것이 목적일 땐 구조체 사용
- 캡슐화한(묶은) 데이터를 참조하는 것보다 복사해서 사용하는 것이 효율적일때 구조체 사용
- 구조체에 저장된 저장 속성들이 값 타입이며 참조하는 것보다 복사하는 것이 합당할 때 구조체 사용
- 데이터에서 상속의 구조가 필요하면 클래스 사용
- 해당 모델을 serialize해서 전송하거나 파일로 저장할 경우가 발생하면 클래스 사용
객체지향 OOP 4대 특징
- 추상화
- 공통적인 특성을 뽑아내서 하나의 분류(클래스)로 만든 것(모델링)
- 캡슐화
- 속성 - 메서드를 하나의 클래스로 묶어서 활용한다는 개념
- 묶을 때, 객체는 자신이 맡은 역할을 수행하기 위한 하나의 목적을 가진 실체라는 관점에서 접근
- 추상화와 밀접하게 연결
- 추상화 : 디자인 레벨 관점에서의 개념, 캡슐화는 실제 코드 구현 레벨에서의 개념
- 접근제어자 사용을 통한 은닉화
- 상속성
- 다형성