예시1 ) 우리 집을 찾아가는 방법을 하나하나 step 별로 구현한 것
예시2) 여행 가방 쌀때 어떤 순서로 물건을 넣을지?
예시2) 여행가방에 들어가는 물건들을 모두 자료라고 생각하면 됨.
이걸 어떻게 최적화해서 넣을까?
옷을 돌돌 말아 넣는 다든지 안경, 이어폰을 케이스에 넣어서 찾기 쉽게 해줌
예시3) 방에 들어가는 가구들을 모두 자료라고 생각할 수 있음.
공간을 더 효율적으로 사용하기 위해 접고 펼 수 있는 침대 시트를 사용한다든지? 이동할 수 있는 책상을 배치한다든지.
→ 효율적으로 물건들을 부피를 줄이고(자료구조) 꺼낼 순서에 맞게(알고리즘) 차곡차곡 정리해 넣으면 알차게!
배열의 단점은?
배열은 칸 수가 정해져있음.
첫번째는 무조건 0으로 시작함.
데이터를 3개만 넣었다고 해서
배열의 크기를 마음껏 늘리거나 줄이거나 할 수 없음 (처음에 설정한 만큼 메모리 공간 차지)
연결 리스트의 장점
중간 꺼를 없애고 하나를 추가하고 추가/삭제 자유로움
100번째 꺼를 가려고 하면 1번째 꺼에서 다음꺼, 그 다음꺼 이런 식으로 100번 째까지 순차적으로 가야함.
비교) 배열은 100번을 물어보는게 아니라 이 칸의 위치를 알고 있으면 100번째 칸으로 점프하면 됨.
Why? 칸의 크기가 같다는걸 알고 있으니까.
그래서 배열은 훨씬 빠르게 처리할 수 있음!
연결 리스트는 언제 뭐가 추가, 삭제될지 모르기 때문에 메모리 확보 안됨.
값도 가지고 있고, 다음 친구의 주소도 저장해야 하기 때문에 훨씬 차지하는 리소스가 큼.
: 큐가 양쪽으로 들어있다.
위에서도 밑에서도 나가고 들어갈 수 있음
: 서로 연결된 그물망
선택 정렬
버블 정렬
삽입 정렬
병합 정렬
퀵 정렬 (대체적으로 다른 것보다 평균 이상의 속도는 나옴)
프로토콜은 특정 기능 수행에 필수적인 요수를 청의한 청사진(blueprint)입니다. 프로토콜을 만족시키는 타입을 프로토콜을 따른다(conform)고 말합니다. 프로토콜에 필수 구현을 추가하거나 추가적인 기능을 더하기 위해 프로토콜을 확장(extend)하는 것이 가능합니다.
A protocol defines a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality. The protocol can then be adopted by a class, structure, or enumeration to provide an actual implementation of those requirements. Any type that satisfies the requirements of a protocol is said to conform to that protocol.
In addition to specifying requirements that conforming types must implement, you can extend a protocol to implement some of these requirements or to implement additional functionality that conforming types can take advantage of.
익스텐션을 이용해 클래스, 구조체, 열거형 혹은 프로토콜 타입에 기능을 추가할 수 있습니다. retroactive modeling으로 알려진 것과 같이 원본 코드를 몰라도 그 타입에 대한 기능을 확장할 수 있습니다. 익스텐션은 Objective-C 의 카테고리와 유사합니다. Swift에서 익스텐션을 이용해 다음을 할 수 있습니다.
NOTE 익스텐션은 타입에 새 기능을 추가할 수 있지만 오버라이드는(override)는 할 수 없습니다.
Extensions add new functionality to an existing class, structure, enumeration, or protocol type. This includes the ability to extend types for which you don’t have access to the original source code (known as retroactive modeling). Extensions are similar to categories in Objective-C. (Unlike Objective-C categories, Swift extensions don’t have names.)
Extensions in Swift can:
- Add computed instance properties and computed type properties
- Define instance methods and type methods
- Provide new initializers
- Define subscripts
- Define and use new nested types
- Make an existing type conform to a protocol
In Swift, you can even extend a protocol to provide implementations of its requirements or add additional functionality that conforming types can take advantage of. For more details, see
NOTE
Extensions can add new functionality to a type, but they can’t override existing functionality.
출처: Protocol Extensions.
The Swift Language Guide (한국어) - 프로토콜 (Protocols)
Software design pattern (소프트 웨어 디자인 패턴)
In software engineering, a software design pattern is a general, reusable solution to a commonly occurring problem within a given context in software design. It is not a finished design that can be transformed directly into source or machine code.
참고: https://something-is-code.tistory.com/9
결합도를 낮춘다?
A타입이 B타입의 프로퍼티를 갖고 있고
B타입이 C타입의 프로퍼티 갖고 있음
A랑 B는 결합도가 큰 거임
(A는 B가 꼭 필요함)
결합도를 낮춘다 = 서로의 상관 관계를 점점 줄여나간다는 의미
서로가 서로를 몰라도 notification을 보내는 쪽이나, 받는 쪽이나 가능함
A라는 타입의 인스턴스와
B라는 타입의 인스턴스가
서로 프로퍼티로 값을 교환하거나
서로 알고있는 결합도를 생성
노티피케이션이란 매개체를 통해서 전달
KVO은 Notification보다는 결합도가 높다.
(서로의 존재는 알아야 하니까)
결합도를 낮추는 방법 중의 하나가 프로토콜 사용하는 것
타입의 결합도를 낮추는 것은 유지보수를 위해 중요하다
e.g. 그냥 빵 구울줄 아는애, 양상추 올려줄 수 있는 애 필요해?
-> 이때 ‘프로토콜’이라는 약속으로 표현해줄 수 있음
타입을 대체해서 표현해줄 수 있음