1. 자료구조 및 알고리즘
(1) Hash Table에 대한 설명 중 이중 해쉬에 대한 원리를 자세하게 기술하라. (필요하다면 그림으로 그려서 설명)
- 여러 Hash Table 기법 중 클러스터(데이터 군집) 현상을 피하는 가장 이상적인 방법.
- Hash 함수가 각가 2개가 존재하기 때문에 이중 해쉬라 함.
- 키 값은 소수가 좋음. (소수는 클러스터를 피하기 좋음)
(2) Deterministic ALG와 Non-Deterministic ALG에 대한 차이를 기술하라.
- 결정적 알고리즘과 비결정적 알고리즘에 대한 설명.
- 오토마타에 대한 이론과 밀접함.
(3) Fibonacci 방식의 Recursion, Dynamic Programming, 반복 세 가지 방식에 대한 차이를 자세히 기술.
- 각각 방식에 대한 이점과 시간복잡도, 공간복잡도에 대한 내용을 기술
- DP 방식에 대해 이해를 하고 있는지, 방법론에서 Recursion과 반복적인 방법에 대한 각각 위험성과 한계를 알고있는지.
(4) C언어 포인터 문제(코드를 읽고 포인터가 어떻게 움직이는지 이해)
- 포인터에 대해 잘 알아야 했던 문제.
- 여러 포인터 사용으로 헷갈리게 했던 문제.
- 또한 &와 *의 차이를 알아야 함.
(5) DFS와 BFS의 차이를 기술하라.
- DFS와 BFS는 비밀 이야기 VS 소문.
- 큐와 스택.
- Back Tracking의 유무.
(6) If문에서 If ~ else if ~ else if ~ else 라는 구문이 있다면, 비교는 처음 한 번 일어나는지, 각 구문마다 일어나는지.
- 각 구문마다 일어남. 총 3번.
(7) Hash중 Hash 용량을 판단하는 기준인 Load Factor가 75%이상일 때, ReHash() 과정이 발생. ReHash()란?
- 기존 HashTable 크기를 늘리고 새로이 데이터를 복사하는 과정.
- ReHash()외에도 Linked List기반 Hash를 사용한다면 해결 가능.
(8) 후위 표현식에 대한 계산 원리 기술 및 그리고 이를 코드화.
- 후위 표현식 알고리즘은 스택 자료구조를 기반으로 작성.
- 스택에 넣었다가 기호(+,-,*,/)를 기준으로 하나의 식이 완성되면 스택에서 pop()한 뒤, 그 결과를 push()함.
(9) 이진트리에서 각 트리 순회법 전위, 중위, 후위 순회에 대해 기술.
- 각각의 기준은 가운데 노드가 몇 번째 순서로 검색할 것인지. 첫 번째: 전위, 두 번째: 중위, 마지막: 후위
- 전위는 맨 가운데 -> 왼쪽 -> 오른쪽 순위. (방향은 상관 없음)
- 중위는 왼쪽 -> 가운데 -> 오른쪽 순위.
- 후위는 왼쪽 -> 오른쪽 -> 가운데 순위.
(10) nlogn 속도의 정렬 중에서 최악의 경우 O(n^2)의 시간을 가지는 정렬은?
- 정답: 퀵 정렬
- 퀵 정렬은 보통 nlogn이 걸리는 정렬 중에서 가장 빠르지만 최악의 경우 O(n^2)이 되는 특징을 가짐.
2. C언어와 JAVA 차이
(1) 부모 클래스를 상속받은 자식 클래스에서 static으로 선언된다면 변수는 어떻게 움직이는지.
- static은 Scope란 개념으로 접근. (staticd은 선언된 Scope안에서 프로그램 종료시 까지 존재)
- 선언이 된다면 선언된 scope안에서 계속 존재.(즉, 함수가 종료된다 하여도 그 함수가 다시 호출될 때 살아있음)
- 만약 함수를 static으로 선언하게 된다면 그 함수를 선언한 파일 안에서만 이 static 함수에 접근 가능.
(2) C/C++언어에서 virtual 키워드는 왜 사용하고 언제 사용하는지.
- virtual 키워드는 바인딩 시점으로 인한 접근. (동적 혹은 늦은 바인딩)
- 왜냐하면 컴파일러가 컴파일 과정에서 바인딩하는 것이 정적 바인딩. 이 경우 사용자의 의도와 다른 바인딩이 됨.
- 그렇기에 virtual 키워드는 실행 시점에 바인딩을 함으로서 사용자의 의도에 맞는 바인딩이 가능하게 함.
(3) JAVA의 Garbage Collector는 어떻게 동작하는지.
- 가비지 콜렉터는 더이상 사용 불가능한 객체들에 대한 메모리 해제를 하는 역할.
- 그렇다면 객체의 사용 불가능을 판단하는 기준은?
- 객체의 사용 불가능을 판단하는 기준은 한 객체를 더이상 참조하는 객체가 없을 때.
- 또한 참조는 하지만 메모리 부족 현상이 일어나면 가비지 콜렉터가 작동함.
- 그래서 가비지 콜렉터는 시점으로 객체를 접근.
- 자바와 C#언어는 총 0~2세대로 객체 구분.
- 0세대는 자주 할당되고 해제 됨. 2세대는 한번 할당되면 거의 해제될 일이 없는 객체.
(4) C/C++ Reference 개념. unsigned P = 100; unsigned &k = P라 하면, k=300하면 P값은?
- Reference란 별명을 뜻함. 즉, 이름 P의 별명이 k임.
- 둘 중 하나를 지칭한다 하여도 가리키는 메모리 공간은 하나이기에 값은 똑같이 변함.
- 답은 300.
(5) 오버로딩과 오버라이딩의 차이.
- 오버로딩은 같은 이름의 메소드 그러나 매개변수의 유형과 개수가 다름.
- 오버로딩은 다양한 유형의 호출에 응함.
- 오버라이딩은 상속받은 클래스가 상위클래스의 메서드를 재정의 후 사용해야 함.
- 오버라이딩은 동작의 다형성을 위해 탄생.
(6) 자바에서 추상 클래스와 인터페이스 클래스의 차이는?
- 핵심 차이는 추상 클래스는 메서드의 기본 Default 동작을 구현할 수 있지만 Interface는 구현부를 가질 수 없음.
- 자바의 Interface는 implements라는 키워드를 사용하여 구현되고, 추상 클래스는 extends 키워드를 사용하여 확장.
(구현이란 개념과 확장이란 차이가 바로 이 둘의 차이)
- 자바의 Interface 멤버는 기본적으로 public 이지만 추상 클래스는 private, protected를 가질 수 있음.
(7) C++언어에서 추상 클래스와 인터 페이스의 차이는?
- 추상 클래스란 하나 이상의 순수 가상 함수를 가지는 클래스.
- 순수 가상 함수란 반드시 구체적인 동작이 정의되어야 하는 함수로 "=0;"을 선언과 함께 표기.
- 순수 가상 함수만으로 클래스가 이루어질 때, 이를 인터페이스라고 함.
(8) 자바에서 String 클래스와 StringBuffer 클래스의 차이는?
- String 클래스의 객체는 읽기 전용 목적.
- StringBuffer 클래스의 객체는 수정도 가능한 목적.
- 문자열을 추가할 때, String 객체는 +="문자열" 이지만 StringBuffer 객체는 .append("문자열") 메서드 사용.
- 연산자를 사용하는 첫 번째보다 append() 함수의 사용이 현저히 빠름.
(9) 자바에서 == 와 Equals() 메서드의 차이는?
- 얕은 복사와 깊은 복사와 비슷한 차이.
- 얕은 비교와 깊은 비교.
- 얕은 비교/복사란 겉으로 남아있는 형태만 비교.
- 깊은 비교/복사란 형태의 안에 메모리 영역까지 비교.
(10) 자바에서 객체 잘림 현상에 대해 super = sub는 오류인가, sub = super가 오류인가.
- Parent p = new Child() 가능
- Child c = (Child) new Parent()는 Class Cast Exception이 발생
(11) C언어 구조체 패딩 문제.
- 구조체 패딩이란 운영체제 32비트 또는 64비트에 따라서 구조체 선언에 들어가는 바이트 수가 달라지는 현상.
- 구조체 내부의 변수의 순서에 따라 바이트 할당이 달라짐.
- struct{ char c, short s, int i}struct1, struct{ char c, int i, short s}struct2의 경우 두 가지 sizeof(*)결과는 다름. (결과 8,12)
(12) C언어 포인터와 레퍼런스
- int p = 100 ;
- int& o = p ;
- int o = 200 ; >> p도 200으로 변함.
- int* ptr = p ;
- *ptr = 300 ; >> p와 o 둘다 300으로 변함.
- int*& r_ptr = ptr ; >> 이 *& 형식은 포인터 별명을 가리킨다. 난 &*을 골라서 틀림.
- 이 구문에 대한 이해 필요.
3. 운영체제
(1) Race Condition을 방지할 수 있는 방법.
- Race Condition이란 프로세스가 CPU 또는 Resource를 할당받기 위한 경쟁 상태를 뜻함.
- Process 동기화 기법으로 해결 가능.
(2) 프로세스에서 쓰레드를 복사할 때 달라지는 자원은?
- 쓰레드는 프로세스의 대부분의 자원을 공유하지만 유일하게 자신만의 실행 스택을 가짐.
(3) 뮤텍스와 세마포어에 대해 기술하시오.
- 이발소 예제.
- 한 이발소에 이발하는 공간은 2인, 대기를 위한 소파의 용량은 3인이 존재.
- 여기에 이미 2인이 이발하고 있을 때, 이 소파의 개념이 세마포어임.
- 그리고 이 소파의 용량이 1인일 때, 뮤텍스라 부름.
(4) 프로세스를 이루는 각 메모리 영역에 대한 이해(코드, 데이터, 스택 힙)
- 코드: 문법적인 내용이 기술되어 있는 곳.
- 데이터: 전역변수, 상수, Static 변수등이 해당.
- 스택: 프로그램 수행 과정 중에 사용되는 메모리 장소(할당과 해제가 수없이 반복)
- 힙: 프로그래머가 할당하는 메모리 장소.
(5) 메모리 할당에서 first fit 전략과 best fit 전략에 대한 기술 그리고 메모리 단편화에 대한 기술.
- first fit은 메모리 사이즈를 감당할 수 있는 첫번째 메모리 블럭과 매칭.
- best fit은 메모리 사이즈를 가장 적절하게 감당할 수 있는 메모리 블럭과 매칭.
- 메모리 단편화는 내부와 외부 단편화가 존재.
- 내부는 프로세스를 채워도 메모리 블럭의 메모리가 남는 현상.
- 외부는 프로세스를 채울 때, 조각난 여러개의 메모리 블럭으로 감당하기에 흩어져있는 현상.
- 페이징 기법은 Virtual 메모리에 보관된 프로세스 크기만큼 메모리 영역을 나누어서 적재.
- 외부 단편화 해결 그러나 내부 단편화 발생.
- 세그먼트 기법은 메모리에 있는 프로세스를 다양한 크기의 논리적 단위로 나누어 적재.
- 내부 단편화 해결 그러나 외부 단편화 발생.
(6) RISK 방식과 CISK 방식의 차이.
- RISK 방식은 한 clock 사이클내에 수행되는 아주 간단한 명령어 집합을 가진 컴퓨터.
- CISK 방식은 복잡한 명령어 집합을 가진 컴퓨터.
- RISK 방식은 일반적인 프로그램 코드의 95%가 CISK의 명령어 2%만을 활용하는 결과를 관찰하고 고안된 방식.
- 이 논문을 토대로 만들어진 RISK 방식의 CPU가 바로 ARM 프로세서임.
(7) Context Switching이란?
- CPU를 점유하고 있던 프로세스가 할당된 시간을 다 사용한 후 새로운 프로세스로 교체되는 과정.
(8) CPU 스케쥴링이 LRU 방식과 FIFO 방식의 차이를 기술.
- LRU는 최근에 참조된 프로세스를 기준.
- FIFO 방식은 가장 처음에 들어오면 가장 처음 나가야 하는 규칙. 그래서 First In, Fisrt Out.
4. 네트워크
(1) OSI 7계층에 대해서 서술하시오.
- 물리 계층 (실제 전자 신호가 움직이는 계층)
- 데이터 링크 계층 (데이터 형식: 패킷, Mac주소 감지, 리피터 및 허브가 여기에 속함)
- 네트워크 계층 (데이터 형식: 데이터그램, IP주소 감지, IP가 작동하는 곳, 라우터가 해당)
- 트랜스포트 계층 (데이터 형식: 세그먼트, Port주소 감지, UDP/TCP가 작동)
- 세션 계층 (논리적 연결을 담당)
- 프레전테이션 계층 (구문 분석)
- 애플리케이션 계층 (실제 프로그램이 실행되는 곳)
(2) 3-hands-shaking이란?
- TCP/IP의 논리적 네트워크 연결 과정을 의미.
- 연결 요청 -> 연결 요청 허락 -> 연결 확인의 3단계를 의미.
- SYN -> SYN+ACK -> ACK
- 이 논리적 연결이 수립되면 그제서야 통신이 시작.
(3) GBN 프로토콜과 SR 프로토콜의 차이를 기술.
- GBN은 타이머가 끝나고 ACK이 오지 않은 처음 패킷부터 전부 재전송.
- SR은 각 패킷마다 타이머가 존재하여 ACK이 오지 않은 패킷만 재전송.
(4) Client와 Server의 socket순서
- Client는 Connect >> ...
- Server는 socket >> bind >> listen >> accept >> ...
5. 소프트웨어 공학
(1) V모델을 설명하시오.
6. 컴파일러
(1) 컴파일러 과정을 기술하시오.
- 렉시컬 분석 -> 구문 분석 -> 중간 코드 생성 -> 목적 코드 생성
- 렉시컬 분석이란 토큰열을 생성하는 단계.
- 구문 분석이란 수행 후 파싱 트리를 생성하는 단계.
(2) Ex) S = { A | s }, A = { B | a | c } 를 보고 생성 가능한 구문을 고르시오.
- 오토마타 기본 이론 원리.
7. 그래픽스
(1) 그래픽스 파이프라인에 대해 기술하시오.
(2) 그래픽스에서 객체간 거리감을 나타내게 하는 방법은?
- Depth Buffer가 존재하여 각 객체간 계산된 거리를 저장.
8. 데이터베이스
(1) 간단한 SQL문 작성.
(2) DML과 DDL차이.
(3) View에 대한 설명 고르기.
(4) 간단한 ER 다이어그램 작성.
(5) Sum() 연산에서 null값은 0으로 취급할까? 애초에 연산에서 제외될까? 아니면 null일까?
9. 코딩
(1) 1-n까지의 합 구하는 방법 반복, 수열, 재귀로 모두 화이트 보드에 작성.
(2) 다익스트라 알고리즘 작성.
(3) 영어로 함수 해석 후 해석한 함수 화이트 보드에 작성.
(4) 충돌 알고리즘 작성.
(5) 어려운 문제는 Baak-Jun 사이트 알고리즘 문제 수준.
(6) 퀵 정렬 화이트 보드에 작성.
'테크 > 기초 지식' 카테고리의 다른 글
malloc() 과 new 연산자의 차이점 (0) | 2016.10.24 |
---|---|
if문과 논리연산자로 인한 조건 검사 순서의 비밀 - 컴파일러 (0) | 2016.10.07 |
재귀와 반복 그리고 꼬리 재귀 (2) | 2016.08.21 |
이번에 조금 더 알게된 C언어 지식들 (0) | 2016.08.21 |
내가 알게된 좋은 프로그래밍 습관 (3) | 2016.05.06 |