INDEX 1. 에러 처리가 필요한 이유 2. 에러 처리 방법 3. 예제를 통한 에러 처리 연습 4. rethrows 키워드 5. 생성자와 메서드에서 throw 6. 마무리 1. 에러 처리가 필요한 이유 에러의 종류는 2가지 1) 컴파일 에러: 스위프트 문법과 관련된 에러(컴파일러가 미리 알고 수정해야한다고 고맙게 알려줌) 2) 런타임 에러: 프로그램이 실행되는 동안 발생 런타임 에러 -> 크래시(별도의 알림 없이 앱이 강제로 종료됨) : 발생가능한 에러를 미리 처리해 두면, 강제종료되지 않음 (개발자가 처리해야만 하는 에러) 런타임 에러 처리가 왜 필요할까? - 앱이 실행하는 중간에 꺼질까? - 어떤 얘기치 못한 상황이 발생할 수 있음(보험 느낌으로 필요) - 우리가 구현한 기능이 100% 정확히 동작..
원형 연결 리스트(CircleLinkedList) : 단일 연결리스트와 거의 동일해 보이지만, 마지막 노드가 NULL이 아닌 첫 번째 노드(head가 가리키는 노드)를 가리킨다 단순 연결리스트와 원형 연결리스트 비교 원형연결리스트의 장점 단순 연결 리스트처럼 머리와 꼬리를 가리키는 포인터 변수(head포인터와 tail포인터)를 각각 두지 않아도, 하나의 포인터 변수만 있어도 머리 또는 꼬리에 노드 추가 가능 지금까지의 (더미노드 포함)단일 연결리스트에서는 head 포인터를 통하여 새로운 노드를 추가하는 방식이었음 이번에는 tail포인터만으로 머리와 꼬리 둘다에 노드를 추가해볼 것 꼬리를 가리키는 포인터 변수는 tail 머리를 가리키는 포인터 변수는 tail -> next tail포인터만을 사용하여 머리와..
더미노드란? 유효한 데이터를 지니지 않는 그냥 빈(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가 다른)에서도 동일하게 ..