-
[스위프트 : 기초] 데이터 구조와 알고리즘을 배우는 이유스위프트: Swift/스위프트: Swift 2018. 10. 8. 18:12
안녕하세요 ! 씩이 입니다!
저는 Swift 와 iOS 를 공부하고 연구하는 대딩 ( 대학생 ) 이구요!
같은 분야를 공부하는 분들에게 조금이라도 도움이 주고 싶어서 공부하는 것들을 공유합니다.
제 3자가 있다고 가정하고 설명하기 때문에 존대를 하지 않는점 이해 부탁드립니다.
공유가 미래 라고 생각합니다.
한국의 모든 개발자분들 존경합니다!
- Swift version : Swift 4.2 ( 18.09. 01 ~ ) Swift 언어
- 참고한 것들
- 씩이 Github
- 자료구조 소스파일 있습니다.
- iOS 관련 자료들, 정보들 정리해 두었습니다.
- 스위프트로 구현한 자료구조 : DataStructures in Swift4
- Swift4 : 연결리스트 (1 / 3) : #LinkedList : #DataStructrue : #자료구조
- Swift4 : 연결리스트 (2 / 3) : #LinkedList : #값 추가하기, push, append : #값 삽입하기,insert
- Swift4 : 연결리스트 (3 / 3) : #LinkedList : #값 제거하기, pop, removeLast, remove(at: )
- Swift4: 스택: #Stack: #자료구조: #DataStructure: #쌓기
- [스위프트 : 자료구조] 큐 (1 / 4): Queue: #자료구조: #배열로 구현한 큐: #배열의원리
- [스위프트 : 자료구조] 큐 (2 / 4): Queue: #자료구조: #연결리스트: #더블연결리스트: #DoublyLinkedList
- [스위프트 : 자료구조] 큐 (3 / 4): Queue: #자료구조: #Stack으로 구현: #더블스택: #DoubleStack: #제일좋음
- [스위프트 : 자료구조] 큐 (4 / 4): Queue: #자료구조: #RingBuffer: #링버퍼로 구현한 큐: #고정된배열: #마지막!!
- 스위프트: 트리: Tree: #자료구조: #깊이우선탐색: #레벨정렬탐색: #검색알고리즘: Swift4
- 스위프트: 이진 탐색 트리(1 / 2): #BinarySearchTree: #자료구조: #배열과 비교: #트리: #탐색: #삽입: #삭제
- 스위프트: 이진 탐색 트리(2 / 2): #BinarySearchTree: #자료구조: #배열과 비교: #트리: #탐색: #삽입: #삭제
- [스위프트 : 자료구조] AVL Tree: 자가 균형 트리: #balance: #트리의 높이: #rotation메소드: #성능오짐
- 스위프트로 구현한 알고리즘 : Algorithms in Swfit4
- [스위프트 : 알고리즘] 재귀호출 (1 / 6) : recursive: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 팩토리얼 (2 / 6) : factorial: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 거듭제곱 (3 / 6) : Power: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 피보나치 수열(4 / 6) : Fibonacci: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 하노이의 탑 (5 / 6) : Hanoi: 재귀호출: 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 최대공약수 (6 / 6) : GCD: 재귀호출: 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- Swift 주제별 분류
- Swift4 : 제어 전달 명령문( Control Transfer Statement ) : #continue, #break, #return 키워드
- Swift4 : 클래스와 구조체 : #값을 대하는 방식 : #참조타입, 값 타입 : #===
- Swift4 : 프로퍼티 : #Property : #get, set : #willSet, didSet
- Swift4 : 메소드 : #Method : #영향력 범위 : #self : #mutating : #값타입 수정
- Swift4 : 프로토콜 1 : #Protocol : #설계 : #요구사항 : #델리게이트 패턴 전처리 (1 / 2)
- Swift4 : 프로토콜 2 : #델리게이트 패턴 : #델리게이션 (2 / 2)
- Swift4 : 제네릭 : #Generics : #왜필요해? : #where키워드 : #제약사항걸기
- Swift4 : 자동 참조 카운팅 : #Automatic Referece Counting : #ARC :#강한참조 : #Strong Reference Cycle : #메모리 누수
- Swift4 : 클로저: Closure: #표현방식: #왜필요해?: #효율적: #간결성: #생략
내가 데이터 구조와 알고리즘을 배우는 이유
- 표현이 좀,., 부족한데?
- 내가 데이터 구조와 알고리즘을 계속 파고드는 이유.
- 나 스스로가 생각하는 데이터구조와 알고리즘에 대한 것이라는 점을 알릴게.
- 이 의문에 대한 답을 알기 위해 데이터 구조와 알고리즘이 무엇이며 어떻게 만들어져 있는지 간략하게 논해볼게.
데이터 구조의 정의는 by Swift Datastructrue and algorithms ( 저자 : 에릭 아자르, 마리오 에귈루즈)
- 데이터 구조는 프로그래밍에 있어 효율적이며, 확장 가능하고 유지 보수성 높은 시스템을 만들기 위한 주요 요소 중 하나로서
- 시스템에서 데이터의 공유, 유지, 정렬, 검색 등 데이터의 활용을 위한 데이터의 체계화 방법이다.
좀 더 들어가보자.- 영국의 컴퓨터 과학자 David Wheeler 가 정의한 데이터 구조에서
- "컴퓨터 과학의 모든 문제는 새로운 차원에서의 접근 방식으로 해결될 수 있으며.." 라는 구절이 있다.
- 작은 애플리케이션은 물론, 모바일 애플리케이션, 그리고 그 기업을 위한 대규모 웹 어플리케이션 등 어떤 유형의 시스템을 개발하더라도 그 모든 애플리케이션의 토대는 결국 데이터로 귀결된다.
- 이러한 애플리케이션 개발에는 놀랄만한 성능의 효율성을 제공하는 프레임워크와 라이브러리에서 가져온 다양한 API 가 사용되는데
- 이들 API야 말로 휠러가 이야기한 새로운 차원에서의 접근 방식이며
- 이들은 결국 데이터 구조와 알고리즘의 활용을 돕는 중요한 도구이자 구현 방법인 것.
정리하면- 모든 문제를 해결하는 새로운 차원의 접근방식이 데이터구조와 알고리즘을 활용하는 것이고 이것으로 컴퓨터 과학의 모든 문제를 해결할 수 있다는 거야.
데이터 구조는 어떻게 구현되어 있어??
- '데이터 추상화' 는 데이터가 지닌 복잡성을 관리하기 위한 기술이다. 데이터 구조를 디자인 할 때 필히 이 '추상화 기법' 을 사용하는데
- 이는 개발자가 애플리케이션을 만들 때 내부의 상세한 구현방식을 몰라도 되도록 해서 개발에 집중하게 하기 위함.
- 이렇게 내부의 복잡성을 드러내지 않음 으로써 개발자는 알고리즘과 데이터 구조가 제공하는 인터페이스 활용에 더욱 집중할 수 있다.
- 결국 내부의 복잡한 구현만 해 놓으면 해당 데이터 구조의 인터페이스만 활용하면 된다는 말인데 그럼 굳이 복잡한걸 왜 배우냐는 의문이 드는 시점이지?
그럼 더 본질를 파고들어보자. 가장 근원적인게 뭘까. 어디부터 시작인 걸까?- 데이터 구조의 가장 근원적인 형태는 배열과 포인터이다. 다른 것들은 모두 여기서 파생된다고 볼 수 있다. by Swift Datastructrue and algorithms
내가 하는 스위프트에 적용해보자.
스위프트에서 기본적으로 제공하는 primitive datatype( 원천적인 데이터 타입 ) 은 뭐야? 본질은 뭐야?
- value type, reference type 이 두가지가 스위프트가 제공하는 원천 데이터 타입이야. 이게 다른 언어와 다른 점이야. ( c 언어에서는 int, float 등등이 원천 데이터 타입임. )
좀 더 깊게 들어가보자.- value type
- 은 오직 하나의 소유 객체만을 지니며, 해당 타입의 데이터가 변수 또는 상수에 할당됐을 때 혹은 함수에 전달됐을 때, 지니고 있던 값을 복사한다.
- 밸류 타입은 구조체와 열거형 이 있으며, 스위프트의 모든 기본 데이터 타입은 가본적으로 구조체다.
- 다른 언어에서 원천 데이터 타입으로 제공되는 int, double, string 등은 스위프트에서는 '스위프트 표준 라이브러리' 에 정의된 구조체이다.
- 타 언어의 기본 데이터 타입들이 value type인 구조체로 정의되 있어서 int를 사용하려면 Int 구조체를 사용하는 거야.
- reference type 은
- 값을 복사하지 않고 공유한다. 변수나 할당하거나 함수에 전달할 때 값을 복사해서 제공하는 대신, 인스턴스의 참조값을 전달한다.
- 참조값을 전달한다는게 어려울 것 같은데 내가 정의한 값을 전달하는게 아니라, 메모리 주소를 전달한다는 말이야.
- c 언어의 포인터 역할을 한다고 생각할 수 있지.
- 잘 이해가 안된다면 여기 클래스와 구조체 에 자세히 설명해놨어!
내가 살고있는 이 시대에 우리가 작성해야 할 코드의 90% 가 이미 라이브러리와 같은 형태로 제공되고 있는데? 그러면 사용만 하면 되는데 우리가 데이터 구조의 복잡한 구현에 대해 왜 배워야 해? 그 이유가 뭐야?
- 데이터 구조에 대한 명확한 이해 없이는 다양한 데이터 타입의 장, 단점을 알 수 없고, 어떤 상황에서 어떤 데이터 구조를 사용해야 할지 판단하기 어려우며, 결국 이것이 프로그램 구현할 때 문제가 되기 때문.
- 또한 외우는게 아니라 그 원리를 완전히 이해하고 있어야 해.
- 수학에서 순열과 조합을 배울때 팩토리얼이 n! 이고 1~ n까지 곱하는 수이다. 라는걸 외워서 알고 있으면
- 여행을 갈건데 4개의 티셔츠중에 2개의 티셔츠만 선택할 수 있는 상횡인데 그러면 티셔츠를 선택할 수 있는 경우의 수는 뭘까? 라는 의문이 생긴다면
- 팩토리얼그냥 외워서 쓰면 그게 어떤 상황에 필요한 것이고 어떻게 활용할 것인지 모르거든..
- 참고로 답은 4! / 2! *(4-2)! 이야. 팩토리얼이 어떻게 생긴거고 순열과 조합이 어떻게 만들어 진지 알면 자연스럽게 알 수 있는 문제거든..
- 이렇듯 우리는 데이터구조와 알고리즘을 명확하게 이해하지 않고 있으면 다양한 문제들을 만났을 때 문제를 해결할 수 있는 적절한 방법을 찾을 수 없음.
오늘의 결론- 데이터 구조와 알고리즘 지식은, 모두가 해결 불가능하다고 말하는 문제에서 패턴과 실마리를 찾을 수 있게 해 주고, 일상적인 개발 업무에서 즉각적으로 활용할 수 있는 다양한 해법을 떠올릴 수 있게 될거야.
댓글