210322 Mon

Sunny·2021년 4월 3일
0

Today I Learned

목록 보기
16/88

학습 내용

1. 첫 번째 학습 내용: 알고리즘, 자료구조

알고리즘이란?

  • 문제해결을 위한 절차/ 방법
  • 어떠한 문제를 해결하기 위한 여러 동작들의 모음
  • 대표적인 알고리즘 - 정렬, 탐색, 재귀 등

예시1 ) 우리 집을 찾아가는 방법을 하나하나 step 별로 구현한 것
예시2) 여행 가방 쌀때 어떤 순서로 물건을 넣을지?

자료구조란?

  • 자료를 효율적으로 이용할 수 있는 방법론
  • 데이터를 구조적으로 표현하는 방식

예시2) 여행가방에 들어가는 물건들을 모두 자료라고 생각하면 됨.
이걸 어떻게 최적화해서 넣을까?
옷을 돌돌 말아 넣는 다든지 안경, 이어폰을 케이스에 넣어서 찾기 쉽게 해줌
예시3) 방에 들어가는 가구들을 모두 자료라고 생각할 수 있음.
공간을 더 효율적으로 사용하기 위해 접고 펼 수 있는 침대 시트를 사용한다든지? 이동할 수 있는 책상을 배치한다든지.
→ 효율적으로 물건들을 부피를 줄이고(자료구조) 꺼낼 순서에 맞게(알고리즘) 차곡차곡 정리해 넣으면 알차게!

  • 배열의 단점은?
    배열은 칸 수가 정해져있음.
    첫번째는 무조건 0으로 시작함.
    데이터를 3개만 넣었다고 해서
    배열의 크기를 마음껏 늘리거나 줄이거나 할 수 없음 (처음에 설정한 만큼 메모리 공간 차지)

  • 연결 리스트의 장점
    중간 꺼를 없애고 하나를 추가하고 추가/삭제 자유로움

  • 연결 리스트의 단점

    100번째 꺼를 가려고 하면 1번째 꺼에서 다음꺼, 그 다음꺼 이런 식으로 100번 째까지 순차적으로 가야함.

비교) 배열은 100번을 물어보는게 아니라 이 칸의 위치를 알고 있으면 100번째 칸으로 점프하면 됨.

Why? 칸의 크기가 같다는걸 알고 있으니까.
그래서 배열은 훨씬 빠르게 처리할 수 있음!

연결 리스트는 언제 뭐가 추가, 삭제될지 모르기 때문에 메모리 확보 안됨.

값도 가지고 있고, 다음 친구의 주소도 저장해야 하기 때문에 훨씬 차지하는 리소스가 큼.

  • 단순 연결 리스트: 파란색 부분이 다음 꺼의 주소를 갖고 있음
  • 이중 연결 시스트: 파란색에서 반은 앞에꺼, 나머지 반은 다음꺼 주소 갖고 있음.
  • 원형 연결 리스트: 파란색이 다음꺼 갖고 있음. 근데 마지막꺼는 맨 앞의 것을 갖고 있음. 순환 구조. 끝이 없음.

스택이란? FILO, First In Last Out

  • 스택은 구현체라기 보다는 개념.
  • 데이터가 차곡차곡 쌓아서 필요할 때마다 나중꺼를 꺼내 쓴다.
  • 예시) 앱, 웹브라우져의 뒤로가기 버튼
  • 버튼 누르면 맨 마지막 페이지 누르면 빠져 나와서 그 전의 페이지로 이동함.

큐(Queue) FIFO, First In First Out 선입선출

덱(Dequeue)

: 큐가 양쪽으로 들어있다.
위에서도 밑에서도 나가고 들어갈 수 있음

트리(Tree)

그래프(Graph)

: 서로 연결된 그물망

트리 vs 그래프

  • 트리는 하나의 뿌리가 있음.
    거기서 브랜치를 뻗어나감.
    서로 선이 겹쳐지지 않음
  • 그래프는 끝이 없이 여기저기 연결될 수 있음

선택 정렬
버블 정렬
삽입 정렬
병합 정렬
퀵 정렬 (대체적으로 다른 것보다 평균 이상의 속도는 나옴)

  • 시간복잡도란?
    알고리즘이 실행되는데 소요되는 시간분석
    점근 표기법 (대문자 O 표기법)

탐색 알고리즘의 시간복잡도

  • 선형 탐색 - O(n) → 100개 있으면 100개 쭉 살펴본다.
  • 이진 탐색 - O(logn) → 전화번호부에서 박영희 찾을때 반을 갈라서 왼쪽에 있는지? 오른쪽에 있는지? 확인 반복

2. 두 번째 학습 내용: 프로토콜, 익스텐션

프로토콜 (Protocols)

프로토콜은 특정 기능 수행에 필수적인 요수를 청의한 청사진(blueprint)입니다. 프로토콜을 만족시키는 타입을 프로토콜을 따른다(conform)고 말합니다. 프로토콜에 필수 구현을 추가하거나 추가적인 기능을 더하기 위해 프로토콜을 확장(extend)하는 것이 가능합니다.

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.

익스텐션 (Extensions)

익스텐션을 이용해 클래스, 구조체, 열거형 혹은 프로토콜 타입에 기능을 추가할 수 있습니다. 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)

3. 세 번째 학습 내용: Quiz

  • 프로그래밍 디자인 패턴이란?

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

  • KVO (Key-Value Observing)와 Notification은 타입 사이의 (결합도)를 낮출 수 있다

결합도를 낮춘다?
A타입이 B타입의 프로퍼티를 갖고 있고
B타입이 C타입의 프로퍼티 갖고 있음

A랑 B는 결합도가 큰 거임
(A는 B가 꼭 필요함)

결합도를 낮춘다 = 서로의 상관 관계를 점점 줄여나간다는 의미
서로가 서로를 몰라도 notification을 보내는 쪽이나, 받는 쪽이나 가능함

A라는 타입의 인스턴스와
B라는 타입의 인스턴스가
서로 프로퍼티로 값을 교환하거나
서로 알고있는 결합도를 생성
노티피케이션이란 매개체를 통해서 전달

KVO은 Notification보다는 결합도가 높다.
(서로의 존재는 알아야 하니까)

결합도를 낮추는 방법 중의 하나가 프로토콜 사용하는 것
타입의 결합도를 낮추는 것유지보수를 위해 중요하다

e.g. 그냥 빵 구울줄 아는애, 양상추 올려줄 수 있는 애 필요해?
-> 이때 ‘프로토콜’이라는 약속으로 표현해줄 수 있음

타입을 대체해서 표현해줄 수 있음

  • 코코아터치 환경에서 앱 전역에 노티피케이션을 관리하는 노티피케이션 센터를 불러오는 방법은? NotificationCenter.default
  • userinfo라고 해서 진짜 사용자 정보가 아님
  • 인스턴스끼리 메서드를 호출하는 것은 메시지를 보낸다고 표현할 수 있다.
  • 뷰 컨트롤러가 관리하는 뷰의 상태변화는 (UIViewController) 클래스의 메서드를 재정의(override)하여 파악할 수 있다.
  • super → 상속 때문에 하는거임

4. 네 번째 학습 내용: UML (Unified Modeling Language) - 의사소통을 좀 더 쉽게

  • 도식화: 특정 개념을 추상화해서 도표 등으로 표현하는 것 (관계를 단순화하는 작업)
  • UML은 프로그래밍 랭귀지는 아니고 모델링하는 랭귀지
  • UML은 왜 필요할까? 의사소통 - 표준화된/표기화된 방법을 통해 더 빠른 이해 도모함
  • UML은 단순히 한 다이어그램 의미하는게 아니라 필요에 따라 여러 다이어그램 의미함.
  • 구조 다이어그램 중 클래스 다이어그램
    객체지향에서는 의존성을 줄이는 설계가 확장성이 좋음.
profile
iOS Developer

0개의 댓글