개발자자기계발 썸네일형 리스트형 [클린코드] 동시성 : 여러 스레드를 동시에 돌리는 이유와 어려움 | 동시성이 필요한 이유 동시성은 결합을 없애는 전략이다. 무엇과 언제를 분리하는 전략이다. 스레드가 하나인 프로그램은 무엇과 언제가 서로 밀접하다 무엇과 언제를 분리하면 애플리케이션의 구조와 효율이 극적으로 나아진다. 어떤 시스템은 응답 시간과 작업 처리량 개선이라는 요구사항으로 인해 직접적인 동시성 구현이 불가피하다. 많은 사용자를 동시에 처리하면 시스템 응답시간을 높일 수 있다. | 동시성에 대한 미신과 오해 - 동시성은 항상 성능을 높여준다? 동시성을 때때로 성능을 높여준다. 대기시간이 길거나 여러 프로세서가 동시에 처리할 독립적 계산이 많은 경우에만 그렇다. - 동시성을 구현해도 설계는 변하지않는다? 무엇과 언제를 분리하면 시스템 구조가 크게 달라진다. - 웹 또는 ejb 컨테이너를 사용하면 동.. 더보기 [클린코드] 창발성을 높이는 네가지 설계 규칙 켄트 백이 제시한 단순한 설계 규칙 네가지를 지키면 소프트 웨어 설계 품질을 크게 높일 수 있다고 대부분의 사람들은 말한다. | 켄트백의 규칙 네가지 (중요도순) - 모든 테스트를 실행한다 - 중복을 없앤다 - 프로그래머의 의도를 표현한다 - 클래스와 메서드 수를 최소로 줄인다 단순한 설계 규칙 1 : 모든 테스트를 실행하라 설계는 의도한 대로 돌아가는 시스템을 내놓아야 한다. 모든 테스트 케이스를 만들어 무조건 통과하는 시스템이야말록 ‘테스트가 가능한 시스템’이다. 이는 크기가 작고 한가지 목적만 수행하는 클래스를 만든다. 단일 책임의 원칙을 준수하는 클래스는 테스트가 훨씬 쉽다. 의존 관계 역전 원칙을 적용하고, 의존성 주입, 인터페이스, 추상화 등과 같은 도구를 사용해 결합도를 낮추면 설계 품질이 .. 더보기 [클린코드] 시스템 수준에서 깨끗한 코드를 유지하는 법 1. 시스템 제작과 시스템 사용을 분리하라 - 제작은 사용이 아니다. 👉 소프트웨어 시스템은 (애플리테이션 객체를 제작하고 의존성을 서로 '연결' 하는) 준비과정과 (준비 과정 후에 이어지는) 런타임 로직을 분리해야한다. 시작단계 : 관심사 분리 1) Main 분리 : 시스템생성과 시스템 사용을 분리하는 방법 생성과 관련한 코드는 모두 main이나 main 이 호출하는 모듈로 옮기고, 나머지 시스템은 모든 객체가 생성되었고 의존성이 모두 연결되었다고 가정할 때, main에서 시스템에 필요한 객체를 생성한 후 이를 애플리케이션에 넘겨 사용하도록 한다. 2) 팩토리 ABSTRACT FACTORY 패턴 (추상 팩토리 패턴) 추상 팩토리 패턴은 다양한 구성 요소 별로 '객체의 집합'을 생성해야 할 때 유용하다... 더보기 [자료구조] 연결리스트의 응용 연결리스트 관련 함수 1. 순회 2. 연결 3. 역순 헤더 파일 추가(linkedlistop.h) #ifndef _LINKEDLIST_OP_ #define _LINKEDLIST_OP_ void iterateLinkedList(LinkedList* pList); void concatLinkedList(LinkedList* pListA, LinkedList* pListB); void reverseLinkedList(LinkedList* pList); #endif 리스트 실행 소스(linkedListop.c) 순회함수 iterateLinkedList() void iterateLinkedList(LinkedList* pList){ ListNode* pNode = NULL; int count = 0; if(pLi.. 더보기 [자료구조] 연결리스트의 종류와 특성 연결리스트의 종류 - 단순 연결 리스트(singly Linked List) - 원형 연결 리스트(Circular Linked List) - 이중 연결 리스트(Double Linked List) 연결리스트의 특성 비교 - 이전 노드에 대한 접근 연산 단순 연결 리스트 이전노드를 접근할수 있는 방법이 없음 무조건 가장 처음 노드부터 검색해야함 원형 연결 리스트 계속 가다보면 나의 이전 노드의 값을 찾을 수 있다 이중 연결 리스트 이중으로 연결되어 있기 때문에 바로 이전 노드를 접근 할 수 있다 단순 연결 리스트 LinkedList 구조체 헤더 노드의 사용목적 : 구현의 간편함 #ifndef _LINKEDLIST_ #define _LINKEDLIST_ typedef struct ListNodeType{ int.. 더보기 [자료구조] 배열리스트의 특징과 원소 추가 제거 방법 - 배열리스트(ArrayList) 논리적 (저장)순서와 물리적 저장 순서가 동일하다 원소의 위치 인덱스는 0부터 시작한다 (C배열에서와 동일) 배열리스트의 단점 원소의 개수가 10만개인 배열리스트에서 원소의 추가/제거가 빈번하게 발생한다면? 중간에 추가 제거가 일어날때 해당 데이터와 관계없는 데이터들의 이동이 필요하다 배열리스트의 원소 추가 추가전 시작 지점과 방향, 어디까지 의 3가지 점을 주의해야함 1의 위치에 5를 삽입하기위해 가장 뒤에 있는값을 하나씩 옮긴 후 새로운 데이터를 삽입한다 추가가능한 위치인지 확인 필요 newElementCount 개수 만큼 값을 추가로 저장할 수 있음 int addALElement(ArrayList* pList , int position, ArrayListNode e.. 더보기 [자료구조] 포인터의 포인터의 의미와 사용방법 포인터의 포인터 : 포인터 변수를 가리키는 포인터 변수 int int_value = 100; int *ptr_int = &int_value; int **pptr_int = &ptr_int; 포인터의 포인터는 주소가 저장된 포인트 변수의 주소를 저장하는 변수. 변수 int_value : 100 포인터 변수 ptr_int : c300 포인터 변수 ptr_int가 가리키는 변수의 값 : 100 더블포인터 변수 pptr_int : b200 더블포인터 변수 pptr_int 가 가리키는 주소 : c300 더블 포인터 변수 pptr_int 가 가리키는 주소가 가리키는 값 : 100 - 행과 열의 크기에 따라 동적으로 배열을 생성 int row = 3; int col = 4; int **pptr_int_array = .. 더보기 이전 1 다음