더미노드란? 유효한 데이터를 지니지 않는 그냥 빈(empty) 노드 처음 추가되는 노드는 무조건 두번째이후의 노드가 되기 때문에 노드를 삽입(추가), 삭제, 조회 할때 일관된 형태로 구성 가능 더미노드의 장점 더미노드를 통해서 삽입/삭제/참조가 이루어지기에, 코드가 간결해진다.(첫번째 노드일 경우와 2번째노드 이후의 경우를 안나눠줘도 됨) 더미노드가 있으면 이중 연결리스트에서 head와 tail이 움직일 필요가 없어진다. 더미노드를 사용하면 위와같은 조건문(if/else)으로, 굳이 case분류를 해주지 않아도 된다 (노드가 0개인가, 1개인가...할 필요 X) Why? 더미노드가 이미 1개가 만들어져 있기 때문 이전 단일 연결리스트와의 차이점 1. Node구조체 포인터들을 하나의 구조체로 묶음 2. 헤..
기존의 배열리스트의 단점 1. 정적인(static) 메모리 구성 배열은 정적인(static) 자료구조로 한번 크기를 정하면 크기 수정이 불가하고 이미 정한 배열 크기 이상의 데이터 개수는 삽입 불가함 2. 배열에 속한 데이터를 삭제하거나, 새로운 데이터 추가시 한칸씩 이동 시켜줘야하는 번거로움 물론 배열리스트와 연결리스트가 시간복잡도면에서 어느 하나가 절대적으로 유리하다고 할 수는 없다. 각각이 지닌 장단점이 다르기 때문이며 둘의 시간복잡도 비교에 대해서는 다른 포스팅을 통해 다루기로 하고 연결리스트에 집중! 연결 리스트(Linked List) 배열 리스트와 달리 메모리의 동적(dynamic)할당을 기반으로 구현된 리스트 연결리스트의 장점 1. 원할때 필요한 만큼 메모리를 동적할당하여 데이터를 생성하여 ..
지금까지 배운것들을 복습하는 느낌 INDEX 1. 객체내에서 클로저 사용 2. 강한 참조 사이클로 메모리 누수 사례 3. @autoclosure 4. 마무리 1. 객체내에서 클로저 사용 함수내부에 있는 클로저는 객체의 속성 및 메서드에 접근하기 위해서는 반드시 self키워드를 사용해야 했다. 이유는? why?? 실제로 클로저는 오래동안 객체를 사용해야 하고, 힙영역에 저장하고 사용할 객체의 주소를 저장한다. 따라서 클로저와 객체(클래스 인스턴스) 모두 힙영역에 존재하는 건 맞지만 둘다 힙영역에 재각각 따로 존재한다. (둘의 공간은 분리되어 있다. 아래코드를 예시로들면 sayMyName클로저들은 힙영역에 잇지만 모두 Person외부에 있음) 따라서 self키워드를 통해 객체를 강하게 참조를 하고 있다는 것..
이번 포스팅은 오늘 배울 것들을 언제 사용할까?에 초점을 맞추어서 보면 좋음 값(Value) 타입에서의 캡쳐리스트(Capture Lists)는 캡쳐(Capture)로는 불가능해 보이던 값 복사(value copy)를 가능하게 해주고, 참조(Reference)타입에서 캡쳐리스트(Capture Lists)는 weak, unowned과 함께 Strong Reference Cycle(강한 참조 사이클)을 해결하는데 사용 전에 포스팅했던 강한 참조, 약한 참조, 메모리 누수 개념이 기본으로 들어가기 때문에 ARC 부분에 대한 최소한의 이해도가 있어야 한다. INDEX 1. 클로저의 캡쳐(Capture) 현상 2. 캡쳐 리스트(Capture Lists) 3. @escaping 4. non- escaping 클로저와..
INDEX 1. ARC(Automatic Reference Counting) 2.강한 참조 싸이클(Strong Reference Cycle) 3. 약한 참조(weak References) 4. 미소유 참조(unowned References) 5. 마무리 1. ARC(Automatic Reference Counting) ARC는 자동 참조 카운팅으로, Swift에서 자동으로 메모리관리를 해주는 방식이다. RC(Reference Counting)은 참조타입인 클래스의 인스턴스(객체)에만 적용된다. ARC의 작동방식 객체(클래스의 인스턴스)가 생성될때마다 객체가 얼마나(몇 번이나) 참조(reference)되고 있는지를 계산(Counting)하는 방식 Swift의 경우, 컴파일러가 실제로 retain() 할당 ..
ArrayList(순차 리스트) - 배열 기반 구현 리스트 LinkedList(연결 리스트) - 메모리의 동적할당 기반 구현 리스트 구현 방법 기준으로 한 구분으로 두 리스트의 ADT는 동일 리스트 자료구조는 데이터를 나란히 저장하고, 중복 데이터의 저장을 허용한다. 배열리스트의 장점과 단점 장점 - index값만 기준으로 해서 데이터 참조가 쉽다 단점 - 배열길이가 초기에 결정되어 변경이 불가능하다. 삭제과정에서 데이터 이동 빈번히 일어난다. //정수만 저장되어 있는 배열리스트 type def LData의 사용 이유 1. int형이라고해서 어느 CPU에서나 4바이트가 아니다. 16비트와 8비트에서의 CPU에선 int가 2바이트, 1바이트로 다르기 때문에 여러 시스템 환경(CPU가 다른)에서도 동일하게 ..
들어가기에 앞서... Swift는 객체지향 프로그래밍 언어이자, 프로토콜지향 프로그래밍언어이며, 함수형프로그래밍 언어다. 클래스와 구조체 단원을 정리하며 객체지향임을 알 수 있었고, 프로토콜 단원을 공부하며, 프로토콜 지향 언어인 것도 알 수 있었다. 이제는 클로저(Closure)를 공부하며 Swift가 함수형 프로그래밍 언어임에 대해 이해해볼 차례다. 물론 초반부에서 함수에 대한 설명을 했지만, 클로저를 알아야 함수형 프로그래밍 패러다임 스타일을 더 명확하게 이해할 수 있다. 개인적으로 Swift를 공부하면서 가장 낯설고, 어려웠던 부분이다. 기본 클로저 표기 문법들은 연습하면 금방 익숙해지지만, 메모리관리와 참조에 관한 부분이 섞여있어 한번에 이해하기엔 무리가 있는 개념이다. 하지만 너무나 중요한 부..
작년에 배운 경험이 있으나, 깊이있게 해보지 않고 겉핥기식으로 각 자료구조의 코드 구현 - 백준으로 PS만 대강해보며 넘겼었다. 곧 개강후 전공으로 C로하는 자료구조가 있기에 이번 기회에 윤성우의 열혈 자료구조 책을 참조해 제대로 다져보고자 한다. (앞으로의 그림 자료들 역시 이 책을 참조하였다) https://search.shopping.naver.com/book/catalog/32441031922 윤성우의 열혈 자료구조 : 네이버 도서 네이버 도서 상세정보를 제공합니다. search.shopping.naver.com 1. 알고리즘 성능 평가요소 1. 시간 복잡도(Time Complexity): 얼마나 빠르게 결과를 출력 하는가?, 연산횟수는 얼마나 되는가? 2. 공간 복잡도(Space Complexi..