본문 바로가기

취업/준비

pure OOP / Java는 왜 pure OOP가 아닐까? pure OOP Pure Object Oriented Language 혹은 Complete Object Oriented Language 는 말 그대로 완전히 OOP를 지향하고 관련 기능을 support하는 언어를 말한다. primitive type의 변수조차 없이 모든 변수가 객체여야 한다는 점이 가장 특징적이다. 아래에서 좀 더 구체적인 pure OOP의 조건을 알아보자. pure OOP의 조건 Encapsulation/Data Hiding 캡슐화/은닉화 Inheritance 상속 Polymorphism 다형성 Abstraction 추상화 All predefined types are objects 이미 작성된 타입이 모두 객체 All user defined types are objects 사용자가 작성..
[보안] 대칭키 / 비대칭키(공개키) / SSL handshaking 대칭키 방식 암호화/복호화를 같은 키를 통해 수행하는 것. 장점 키의 크기가 상대적으로 작고, 알고리즘 내부 구조가 단순하여 개발이 쉽다. 연산 속도도 빠르다 단점 키 자체는 암호화 되지 않기 때문에 분실되거나, 타인에게 노출되면 큰일(...)난다. 키를 매우 신경써서 관리해야 한다. 키를 전달하기가 어렵기 때문에 잦은 키 변경이 있는 경우 불편함을 초래한다. 전자서명에는 적용할 수 없다. 안정성을 분석하기가 어렵고, 중재자가 필요하다. 결국 보안에 취약하다. 종류 블록 암호 스트림 암호 비대칭키 (공개키) 방식 암호화/복호화를 각각 다른 키로 수행하는 것. 암호화를 public key, 복호화를 private key로 사용하는 경우 어떤 내용이든 자신만 복호화할 수 있어야 하는 경우 사용 일반적인 데이..
깊은 복사 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++) ..
[알고리즘/정렬] 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
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..
Overriding VS Overloading (오버라이딩 VS 오버로딩) 공통점 둘 다 다형성을 지원하는 방법이다. 이름이 같은 메소드를 상황에 맞춰 다양하게 이용할 수 있도록 하여 다형성을 지원한다. 차이점 Overriding 오버라이딩 부모 클래스로부터 상속받은 메소드를 재정의하는 방법이다. 메소드 이름은 물론 return 타입, parameter 타입, 개수, 순서가 모두 동일해야 한다. return type이 같다는 것은 자동 캐스팅이 가능한 경우도 포함한다. body 내용만 다를 수 있다. Overloading 오버로딩 같은 이름의 메소드/생성자를 한 클래스 내에서 여러 방법으로 사용할 수 있게 하는 방법이다. parameter 타입이나 개수 혹은 둘 다 달라야 한다. return 타입은 같아도, 같지 않아도 상관 없다.
node.js의 특징 node.js의 등장 배경 = 기존 서버의 한계 기존 서버 스레드 기반의 동기 방식 일이 많아지면 스레드를 계속 만들어야 하기 때문에 메모리 사용량이 폭발적으로 증가하고, 서버가 다운될 위험성이 커진다. node.js로 만든 서버 비동기 방식으로 처리하기 때문에 단일 스레드로도 굉장히 빠르게 처리할 수 있다 이벤트 메커니즘으로, 서버가 멈추지 않고 반응할 수 있게 해준다. -> 높은 확장성 node.js의 특징 비동기 I/O 처리 → non blocking API가 실행되었을 때 그 반환 결과를 기다리지 않고 다음 API 실행. 이전 API가 완료되면 node.js의 이벤트 알림 메커니즘을 통해 결과값을 받아옴. 빠른 속도 구글 크롬의 V8 Javascript Engine을 사용하여 빠른 코드 실행 제공..