OOP 기본
객체: 클래스에서 생성된 변수, 클래스에서 파생되어 나오는 것, 혼자서 존재하는것은 의미가 없다. 그 객체와 다른 객체들간의 상호작용이 있을때 의미가 있다.
객체지향 프로그래밍: 객체들을 설정하고 그 객체들간의 관계를 설계하는 것
- 내가 필요한 객체가 뭔지를 설계 하는 것
- 각 객체들간의 어떤형태로 상호작용을 하도록 만들것인지
1
"많은 개체들이 공통된 명칭을 가질 때 그것들은 언제나 또 하나의 이데아, 즉 형상을 갖는다. 가령 침대는 무수히 많지만 침대의 이데아, 즉 그 형상은 오직 하나이다. 여러가지 개개의 침대는 실재가 아니며 오직 그 이데아의 모사(模寫)에 의해 만들어졌을 뿐이다.” - 플라톤
똑같은 이데아 = 틀, 클래스
이데아에 의해 만들어지게되는 실제 물건이나 형상 = 객체, 오브젝트

[ Class ]
추상 (abstract) , 표현 대상에 대한 이데아(형상)
이상적인 존재 (이미지, 설계도, 틀, 설명서)
공통의 특징
강아지라는 공통적인 개념(예시)
[ Object ]
실체(instance) , 추상을 실체화한 대상
이데아의 모사
개별 속성
서로 다른 각각의 강아지들(예시)
Class
1 | let x = 5 // struct, Stack에 저장 |
Class Initialize(초기화 메서드)
- 초기화(init)가 불필요한 경우 : 모든 저장 프로퍼티에 초기값이 설정되어 있음
- 초기화(init)가 필요한 경우 : 저장 프로퍼티 중 하나 이상이 초기값 미설정됨
- 모든 저장 프로퍼티 (Stored Properties)에 초기값이 설정된 경우 Init 메서드 작성 불필요
- 객체 생성시 단순히
ClassName()만으로 생성 가능
1 | class Dog { |
Property
Stored Property(저장 프로퍼티)
- Class ⭕️ Structure⭕️ Enum ❌
1 | class StoredProperty { |
Lazy Stored Property(지연 저장 프로퍼티)
- 초기값이 인스턴스의 생성이 완료 될 때까지도 알 수 없는 외부 요인에 의존 할 때
- 초기값이 복잡하거나 계산 비용이 많이 드는 설정을 필요로 할 때
- 필요한 경우가 제한적일 때
- Class ⭕️ Structure ⭕️ Enumeration ❌
- 한번 저장된 값은 직접 변경해주지 않는 이상 바뀌지 않는다.
1 | class LazyStoredProperty { |
Computed Property(연산&계산 프로퍼티)
- 자료를 저장하지 않고 매번 호출할 때마다 새로 계산
- Class ⭕️ Structure ⭕️ Enumeration ⭕️
1 | // Computed Property 사용 |
- get: 연산프로퍼티를 호출할때 보여지는 구간
- Set: 연산프로퍼티에 값을 입력했을때 실행되는 구간 / 값을 저장할수 없으므로 저장프로퍼티를 이용한다.
1 | class ComputedProperty { |
Property Observer(프로퍼티 옵저버)
- Class ⭕️ Structure ⭕️ Enumeration ❌
- newValue값이 들어오면 변경직전 및 직후 상태를 확인(반환)해 줄 수 있다.
1 | // 저장프로퍼티 옵저버 사용 |
- 추가적인 작업을 자동으로 반복해야 할때 그것을 별도로 또다시 만들지 않고 변수만 수정해도 자동으로 반영되도록
1 | class PropertyObserver { |
Type Property(타입 프로퍼티)
- Shared(공유) / 하나의 타입이자 클래스가 모든것을 공유한다.
- Lazily Initialized(지연 특성을 지님)
- Class ⭕️ Structure ⭕️ Enumeration ⭕️
1 | // 타입프로퍼티 사용 |
- static var = 타입 프로포티, 객체를 만들지 않고 클래스에서 바로 .으로 사용가능
- 어떤 도형을 만들고싶을때 높이를 똑같이 공유하고싶다. 이럴때도 사용이 가능
- 타입전체가 공유하고자 할것을 만들 때
1 | class TypeProperty { |
Property 종류 정리
1 | class MyClass { |