본문 바로가기

깊은 복사 VS 얕은 복사 (Deep Copy VS Shallow Copy) (아주 간단하게 설명됨 주의) 얕은 복사 Shallow Copy 변수 혹은 객체의 주소값(참조값)을 복사하는 것 메모리 상의 같은 곳을 가리키는 참조 변수가 하나 더 생기게 됨 C, C++에서 포인터 사용 시 얕은 복사가 이루어짐 int a = 3; int* p = &a; // Shallow Copy a = 5; printf("%d", *p); // 출력 : 5 물론 엄밀히 말하면 포인터는 Shallow Copy의 영역이 아니긴 하고(명시적으로 주소값을 복사하는 것이기 때문에)오히려 Shallow Copy를 이해하는데 도움이 되는 친구라서, JAVA 코드를 하나 더 준비했다. int[] arr = { 1, 2, 3 }; int[] arr2 = arr; for(int i = 0 ; i < 3 ; i++) ..
Array (배열) VS Linked List (연결 리스트) VS Dynamic Array (동적 배열) 배열 Array int arr[3] = { 0, 1, 2 }; 같은 타입의 데이터 여러개를 하나의 이름으로 groupping하여 관리할 수 있게 하는 자료구조 장점 논리적 저장 순서 = 물리적 저장 순서 인덱스에 해당하는 원소에 O(1)만에 접근 가능 다른 말로, 'Random Access가 가능하다'고 표현 심플한 자료구조. 단점 삽입/삭제가 어렵다. O(N)만큼 소요된다. 중간에 원소를 빼거나 끼워넣으려면 한칸씩 밀고 당기는 걸 해주는데, 이 때 O(N)만큼 걸린다. 초기에 배열 크기를 지정해야한다. 추후에 동적할당으로 수정할 수 있긴 하다. 연결 리스트 Linked List 어떤 노드가 데이터와 다음 노드에 대한 주소 정보(포인터)를 갖고, 노드들끼리 순차적으로 연결되어 있는 방식의 자료구조 장점 ..
MSA / 마이크로 서비스 / 마이크로 아키텍처 기존 : 모노리스(monolith) 아키텍처 쉽게 말하면 기존에는 하나의 코드 베이스에 모두가 달라붙어 기능을 모두 구현하는(...) 구조가 주로 사용되었다. 이러한 아키텍처의 문제는, 점점 커질수록 뭐 하나 마음대로 수정하기가 조심스럽다. (merge하다 conflict도... 문제..) 코드 몇줄 변경에도 전체 서비스를 다시 빌드하고 다시 배포해야 하므로 위험성이 너무 커지는 방법이다. 그러다 보니 어느 곳에서는 새로운 기능의 release가 아예 느려진다고 한다. 그래서 등장한게 마이크로 서비스! 기존 서비스 → 마이크로 서비스 하지만 기존에 이미 있는 서비스를 통째로 마이크로 서비스로 바꾸는 것은 참 난감하다. 특히 인증 절차의 구성이 쉽지 않은데, 이러다보니 결국 1개의 모노리스가 n개의 모노리..
[알고리즘/정렬] Quick Sort 퀵 정렬 - C++ 코드, 시간/공간 복잡도 알고리즘에 대한 설명은 생략하고, 바로 코드로 넘어가겠다 void quickSort(vector& v, int s, int e) { int pivot = v[s]; // 임의 선택 int bs = s, be = e; while(s v[s] && s e) break; swap(v[s], v[e]); } if(bs e) // 오른쪽 quickSort(v, s+1, be); } 코드를 풀어서 설명하자면, v[s] < pivot < v[e] 는 정상이다. 그 경우 s++, e--를 해야한다. (그냥 넘어가야 하..
[알고리즘/정렬] Merge Sort 합병 정렬 - C++ 코드, 시간/공간 복잡도 알고리즘에 대한 설명은 많은 곳에 있으니 생략하고, 코드와 시간복잡도 및 공간복잡도만 살펴보겠다. void mergeSort(vector& v, int s, int e) { if(s >= e) return; int m = (s+e)/2; // divide mergeSort(v, s, m); // s ~ m mergeSort(v, m+1, e); // m+1 ~ e // conquer vector ret(e+1); int ret_idx = 0; int i = s, j = m+1; // i : s ~ m, j : m+1 ~ e // 결과를 저장할 배열에 하나씩 비교하여 저장 while(i
[데이터베이스] 트랜잭션 ACID Atomic 원자성 All or Nothing 트랜잭션 작업 단위를 일부분만 실행하진 않는다. 전부 실행하거나 하나도 실행하지 않는다. 수행하고 있는 트랜잭션에 의해 변경된 내역은 테이블에 유지하면서, 이전에 commit된 상태 또한 임시 영역에 저장함. 만약 현재 수행중인 트랜잭션에서 오류가 발생하면 임시 영역에 저장했던 상태로 rollback rollback segment : 이전 데이터들이 임시로 저장되는 영역 save point를 지정해서, 확실하게 오류가 발생하지 않는 부분을 표시할 수 있음 중간에 오류가 나서 트랜잭션을 다시 수행할 때 이 지점으로 되돌아가면 됨 Consistency 일관성 트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지하는 것 일관성이란 domain이나 primary ..
[데이터베이스] 인덱스 Index Index란? RDBMS에서 대용량의 데이터(레코드)가 있을 때, 특정 데이터를 검색하기 위해서 테이블의 레코드를 full scan하는 것이 아니라, 인덱스가 적용된 컬럼의 테이블(컬럼, 인덱스주소)을 따로 파일로 저장해놓고 그것을 검색해서 검색 효율을 높이는 방법 사실 여기까지만 알고 그다지 깊게 알지 못했는데, 면접 때 구체적인 걸 물어보셔서 대답하지 못했던 부분이다. 좀 더 자세히 살펴보도록 하자. 범위 스캔 Range Scan 인덱스는 key column순으로 정렬되어 있기 때문에, 특정 값을 찾다가 해당 범위를 벗어나는 값을 만나면 멈춘다. (그러면 그 이전 값과 벗어났던 값 사이에 있다는 의미이므로) 인덱스 테이블 파일은 B-tree로 주로 표현한다 B-tree란? root block, bra..
Class VS Object VS Instance 현실 세계의 객체(Object)를 소프트웨어에서 클래스(Class)라는 설계도로 표현하고, 클래스를 통해 생성하면 인스턴스(Instance)가 된다 Object 어떤 역할을 하는 주체. 상태와 동작을 가진다. OOP에서는 이를 소프트웨어로 구현하고자 한다. → Class Class Object(객체)를 여러 개 만들기 위한 설계도 field와 method를 가진다. 이를 통해 객체의 상태와 동작을 표현한다. Instance 소프트웨어에서 Class를 통해 생성하여 메모리에 할당하면 인스턴스(Instance)라고 한다. 즉, Object가 실체화되면 Instance라고 하는 것. 실체화할 때 Class를 사용한다. Object는 Class의 Instance 반면, 실행 프로세스는 프로그램의 Instance..