2016년 4월 25일 월요일

신입 개발자 면접용 컴퓨터공학 기본지식

신입 개발자로서 입사를 준비하기 위해 CS분야의 전반에 걸쳐 기술 면접 시 물어볼 만한 내용을 정리하였습니다.
주제 요약 링크순으로 볼 수 있습니다. 너무 기초적인 부분은 적절히 제외하였습니다.
요약만 보고 내용을 파악하기 어렵습니다. 주제를 자세히 다룬 링크를 타고 들어가 관련 내용을 공부할 필요가 있습니다.

데이터베이스
NoSQL RDBMS 차이 ( NoSQL : Not only SQL )
-      NoSQL등장배경 : SNS 및 아마존 과 같은 비 복잡 단순 데이터가 엄청나게 증가하면서, 기존 오라클과 같은 RDBMS에 대해 용량 부족과 접근의 비효율성 증가
-      목적 : 페타 바이트 급 단순데이터를 다루기 위해 사용.
-      특징 : join 불가, table col의 형식이 제한 되어있지 않음, putget 명령어로만 사용, RDBMS와 혼합하여 사용하는 것을 장려.
ERD ( Entity Relationship Diagram )
-      개요 : 엔티티간의 관계를 나타내는 그림. DFD와 함께 시스템 분석과 설계에서 매우 유용하게 사용. 데이터를 중심으로 데이터간의 관계를 나타내는 그림. 객체지향 프로그래밍에 적함
-      엔티티 : 프로세스 상에 존재하는 모든 데이터 개체. 물리적 추상적 모두 포함. [ 네모 ]
-      릴레이션 : 엔티티간의 연관성을 나타냄. 소유,소속,첨부 등의 의미. 1:1,1:N,N:N [ 마름모 ]
-      어트리뷰트 : 엔티티가 가지고있는 속성 데이터 [ -o ]
-      ERD를 실제 table로 구현하기 위한 세가지 방법 : 링크 참조
데이터베이스 정규화
-      정규화 : 중복을 최소화, 이상현상 제거 ( 삽입, 삭제, 변경 )
-      1단계 : 도메인 원자성
-      2단계 : 모든 비 기본키가 기본키에 완전 함수 종속’ ( 부분함수종속제거 )
-      3단계 : 이행적 함수종속 제거
-      BCNF : 오직 후보키결정자가 되도록 유지
대용량 트랜잭션 처리
-      개요 : 트랜잭션에는 반드시 트랜잭션 로그를 기록하게 되어있음. Full 복구 모드의 대용량 트랜잭션에는 이렇게 행 별 트랜잭션 로그를 기록하는 방식이 용량 문제와 병목현상으로 인한 속도 문제를 야기한다.
-      최소 로깅 작업 : 행 별 변경사항을 로깅할 것이 아니라, table별로 로깅 작업을 진행하여, 테이블 삭제 시 delete가 아니라 truncate를 수행, insert 또한 이와 같은 방식으로 수행.
-      제약 : full 복구모델에선 사용 불가. SIMPLE BULK LOGGED 모델에서만 사용가능. 무결성 제약조건을 따르지 않음.
조인 종류
-      조인의 종류 5가지
n  INNER JOIN
n  OUTER JOIN : Left / Right
n  CROSS JOIN
n  FULL OUTER JOIN
n  SELF JOIN
-      조인 방식 3가지
n  Nested loop join
n  Hash join
n  Merge join
Sql 쿼리 성능 측정
-      쿼리 분석기 사용 : SET STATISTIC IO ON
-      쿼리 수행 시 각 테이블에 대해 -> 스캔, 논리적 읽기 수, 물리적 읽기 수, 미리 읽기 수
-      쿼리 튜닝을 통해 개선시킬 수 있는 부분 : 논리적 읽기 수 ( 버퍼 캐시에 접근하는 횟수 )
대용량 데이터베이스와 쿼리 튜닝
-      대용량 데이터베이스 : 5000만건 이상의 데이터가 적재되는 테이블을 의미.
-      쿼리 튜닝 : 결론적으로 I/O를 줄이기 위한 노력. 꼭 필요한 데이터만을 스캔할 수 있도록 스캔 범위를 조정하는 작업을 포함
-      최적화 : 인덱스를 활용한 것 인가. 병목 구간을 정확히 파악했는가.
그 외
-      데이터 무결성 유형
n  개체 무결성 : 모든 테이블은 기본 키를 가져야 하며 기본 키로 선택된 열은 고유하고, 빈 값은 허용하지 않음.
n  참조 무결성 : 왜래 키 값이 다른 특정 테이블의 기본 키 값을 참조해야만 한다.
n  범위 무결성 ( Domain ) : 해당 속성은 각각의 도메인 집합 안에 존재하는 값만을 취해야 한다.
-      트랜잭션의 특성과 트랜잭션이 깨졌을 때의 복구 방법.
n  ACID : 원자성 부분 실행 X / 일관성 전후 일관된 데이터 / 고립성 다른 작업 끼어들기 X / 지속성 수행된 작업은 영원히 반영
n  ACID transaction 구현 방법 ( 데이터 lock에 의존 )
u   로깅 방식 : 변경사항을 로그에 저장 실패 시 로그를 이용한 롤백
u   새도우 패이징 방식 : 변경사항을 DB복사본에 저장 실패시 DB복사본을 활용한 롤백

운영체제
스레드와 프로세스
-      프로세스 : 프로그램의 인스턴스. 프로세스간 공유부분 ( 프로그램의 코드 및 라이브러리 ), 할당 받는 비 공유부분 ( 변수 할당을 위한 데이터/스택 세그먼트, 실행 위치를 나타내는 PC ),
-      쓰레드 : 한 프로세스의 다양한 실행 흐름. 프로세스 생성 시 Main 쓰레드 하나 생성. 각 쓰레드는 각각의 스택 공간을 제외한 나머지 부분을 공유한다.
-      멀티 쓰레드 장점 : 멀티 프로세스에 비해 메모리 및 시스템 자원 소모 매우 낮음. 쓰레드간 통신 용이 ( 전역 변수로 쉽게 통신 )
-      단점 : 전역변수를 이용한 통신은 충돌 문제를 지니고있다. 동기화 문제를 해결해야 함.
Fetch Decode Execute Pipeline
-      CPU구성요소 : Decoder, CU, ALU, ACC, PC(program counter), IR(instruction), AR(address), DR(data)
-      CPU가 일하는 순서 : fetch -> decode -> execute
-      Fetch : 메모리로부터 instruction을 가져온다.
-      Decode : instruction을 담은 register를 해석한다.
-      Execute : 각종 read, shift, ALU, write 등을 수행한다.
-      Pipe line : CPU의 다른 부분을 사용하는 fetch/decode/execute를 동시에 수행하기 위한 방법
-      Pipe line control hazard, data hazard에 노출 되어있다.
n  Control Hazard : Branch명령을 받아 jump하게 되면, execute단계에서 이미 fetch해 놓은 놈을 버려야하는 문제
n  Data Hazard : 이미 파이프라인 내에서 조작하고 있는 register 데이터를 바로 다음 프로세스가 조작하려 함
가비지 컬렉션
-      동적 할당된 메모리 영역 가운데 더 이상 사용할 수 없게 된 영역을 탐지하여 자동으로 해제하는 기법.
-      장점 : 비 유효 메모리 접근 차단, 이중 해제 차단, 메모리 누수 차단
-      단점 : 메모리 해제 결정에 따른 비용
-      방법 1. 포인터 추적 방식 : 한 개 이상의 변수가 접근 가능한 메모리는 사용할 수 있는 메모리로 간주, 아닌 경우 해체
n  mark and sweep : 각 메모리 할당 영역에 1비트 메모리를 남겨두고 mark단계에서 변수가 가리키는 메모리를 true로 표시, sweep단계에서 false인 영역을 모두 해제
콜백함수
-      Callback : 어떤 이벤트가 발생했을 때 나에게 알려달라고 핸들러를 등록하는 작업. , 함수call을 하는 주체는 사용자가 아니고, OS이다. 기존의 함수 call과는 제어권의 차이가 존재한다.
-      Ex ) < java script > : > a=[3,1,2]; function b(v1, v2){console.log(‘c’, v1, v2); return 0}; a.sort(b); console.log(a);
n  위 예제의 경우 b함수는 유저가 호출하는 것이 아니라, sort에 주입하여 필요에 따라 sort가 호출하는 함수임으로 이를 callback 함수라고 할 수 있다.
데드락
-      개념 : 동일한 자원을 공유하고 있는 두 개 이상의 컴퓨터 프로그램들이 상대방이 자원에 접근하는 것을 사실상 서로 방해함으로써 두 프로그램 모두 기능이 중지되는 결과를 낳는 상황을 말한다.
-      발생 조건 : 전부다 존재해도 발생하지 않을 수 있고, 하나만 존재해도 발생할 수 있다.
n  Mutual Exclusion : 데이터 접근을 상호 배제
n  Hold and Wait : 한 프로세스가 A자원을 hold한 상태로 B자원을 잡기 위해 Wait
n  No Preemption : 다른 프로세스가 잡고있는 자원을 가로챌 수 없다.
n  Circular Wait : 2개 이상의 프로세스가 서로의 작업이 끝나기를 기다린다.
-      해소방안
n  System Dead Lock 상태에 들어가지 않도록 만든다. ( 발생 조건 차단 )
n  System Dead Lock 상태에 들어갈 경우 recover하도록 만든다. ( 데드락 탐색 필요 )
n  문제를 무시하고 Dead Lock이 발생하지 않은 것처럼 수행한다. ( 리눅스/유닉스 서버에서 주로 수행 )

네크워크
TCP/IP 계층
n  IP : 단말과 단말 간 패킷을 전송하기 위해 각 단말은 4바이트 IP주소가 필요. IP ADRESS <-> DNS
n  TCP : 서버와 클라이언트 간 데이터를 신뢰성있게 전달하기 위해 만들어짐. 패킷의 손실을 교정하고 순서를 재조합 한다. 연결 지향 : 전송측과 수신측의 전송 선로인 Session을 만든다.
-      Layer 4. Application Layer ( OSI : application, presentation / HTTP ) : FTP/Telnet/SMTP등으로 이루어진 응용프로그램
-      Layer 3. Transport Layer ( OSI : session, transport / TCP ) : 각 시스템을 연결하고, TCP 프로토콜을 이용해 데이터를 전송하는 계층.
-      Layer 2. Internet Layer ( OSI : network, datalink / IP ) : 데이터를 정의 및 경로 배정(라우팅). 정확히 라우팅 하기 위해 IP프로토콜을 사용한다.
-      Layer 1. Physical Layer ( OSI : physical / Ethernet ) : 이더넷 카드와 같은 하드웨어를 말함.
OSI 7계층
n  ( 장비 / 데이터 형태 / 프로토콜 )
-      7. 응용 ( 서버 / 데이터 / DHCP, DNS, FTP, HTTP, Telnet, SMTP ) : 사용하고 있는 프로세스를 어떻게 인식할 것인가.
-      6. 표현 ( 서버 / 데이터 / SMB, APP, MPEG, JPEG ) : 데이터의 표현 차이 극복. 정보를 어떻게 부호화 할 것인가 압축, 부호화, 암호화.
-      5. 세션 ( 서버 / 데이터 / SSH, TLS ) : 통신 경로의 확립, 단절, 전송 방식을 어떻게 규정할 것인가. 응용 간 논리적 연결 확립
-      4. 전송 ( L4스위치 / 세그먼트 / TCP, UDP, ARP ) : 정보를 전송할 때 신뢰를 어떻게 확보할 것인가. 연결 지향 서비스 제공.
-      3. 네트워크 ( L3스위치, 라우터 / 패킷 & 데이터그램 / IP, ICMP, IGMP ) : 송신 노드에서 수신 노드로 어떤 경로로 정보를 전달할 것인가.
-      2. 데이터링크 ( 스위치 / 프레임 / MAC, PPP ) : 인접한 기기 사이에서 정보를 어떻게 전송할 것인가.
-      1. 물리 ( 케이블, 허브, 리피터 / 비트 / Ethernet ) : 어떤 신호로 통신할 것인가.
그 외
-      L3스위치와 L4스위치의 차이점
-      세션이란 무엇인가
-      대칭키, 비대칭키(공개키) 방식이란

웹 어플리케이션과 웹 프로그래밍
-      웹 어플리케이션이란 웹을 기반으로 실행되는 프로그램을 의미, 웹 프로그래밍이란 웹 어플리케이션을 구현하는 작업.
-      웹 어플리케이션 구조 : 웹 브라우저 웹 서버 웹 어플리케이션 서버 데이터베이스
-      단계 1. 웹 브라우저가 웹 서버에 페이지 요청 2. 웹 서버는 요청을 받아서 요청된 페이지의 로직 및 데이터베이스 연동을 위해 웹 어플리케이션 서버에 처리를 요청 3. 웹 어플리케이션은 데이터베이스와 연동하여 데이터 작업 수행 4, 처리된 결과를 다시 웹 서버로 돌려보냄 5. 웹 서버는 결과를 웹 브라우저에게 넘겨줌.
-      기존 CGI방식 : 웹 서버에서 각 브라우저의 요청 마다 프로세스를 생성하여 처리 -> 메모리 부하
-      WAS(웹 어플리케이션) 방식 : 웹 서버가 직접 프로그램을 처리하지 않고, 웹 어플리케이션에 넘겨줌. 여러 명의 사용자가 동일한 페이지를 요청할 경우, 오직 하나의 프로세스만 생성 후, 각 사용자에게 쓰레드를 할당. 더 많은 사용자에게 서비스를 할 수 있으며 전체적인 성능향상 도모
GET POST 차이
-      목적의 차이
n  Get : 서버에서 어떤 데이터를 가져와서 보여주는 용도
n  Post : 서버의 값이나 상태를 바꾸기 위해서 사용
-      형태의 차이
n  Get : URL에 이어 붙임 ( 길이 제한 -> 적은 양의 데이터 전송 ) ex, http://url.bbslist.html?id=5&pagenum=2
n  Post : 내용이 body안에 숨겨서 인코딩되어 보내짐. 길이 제한 없음.
-      목적과 혼용하여 사용했을 경우 google accelerator 사건 ( 게시물 삭제 버튼까지도 post가 아닌 get으로 설정해 놓은 웹 페이지 개발자들로 인해 get만 찾아 들어가는 accelerator가 게시물을 마구잡이로 삭제/변경 )
쿠키 vs 웹 스토리지
-      개요 : 웹 환경에서 사용자의 정보를 저장해야 할 필요가 있음 ex) 쇼핑몰의 오늘 보았던 물품, 검색 기록 등
-      쿠키 : 4kb허용, http헤더에 붙여 전송(트래픽 낭비 but 서버 전송 가능), 보안 취약
-      웹 스토리지 : 크기 제한이 없다. 서버로 보내지 않는다. 유효기간이 없다. 자바스크립트 객체 저장 가능. Keyvalue로 구성된다.
n  로컬 스토리지 : 도메인 마다 따로 생성된다. 지속 기간에 제한이 없다. (영구성) 도메인이 다르면 서로의 스토리지에 접근 불가. 사이트 고유 설정 정보 등을 대신하기에 적당.
n  세션 스토리지 : 도메인 별, 윈도우 별 따로 생성된다. 윈도우(세션)와 같은 유효 범위와 생존기간을 가진다.
-      http://croute.me/419
그 외
-      HTTPS란 무엇이고, SSL인증방식에 대해 설명하라 ( 혹은 웹 보안에 대해 설명하라 ) : https://opentutorials.org/course/228/4894

알고리즘/자료구조
맵 리듀스 알고리즘 ( Hadoop관련 추가 조사 )
-      목적 : 빅데이터처리를 위해 기존 하드웨어를 활용한 분산 프로그래밍 모델. 이미 분산 환경에 저장된 대용량 데이터를 다시 중앙에서 처리하는 것이 비효율적임으로, 각 분산시스템에서 데이터를 처리할 수 있도록 하기 위함. 혹은, 대용량 입력 파일을 분산시스템에서 처리하여 효율을 높이는 방안. 크게 맵/리듀스 과정으로 나눔
-      과정
n  Splitting : 입력 받은 대용량 데이터를 적절한 크기로 잘라냄
n  Mapping ( Map ) : key – value 로 맵을 구성함.
n  Shuffling : map 함수의 경과를 취합하기 위해 reduce 함수로 데이터를 전달하는 역할을 함. ( 정합병렬 )
n  Reducing : 결과를 key - value 로 정리하여 final result 로 취합.
트립 ( Treap )
-      정의 : 균형 잡힌 이진탐색트리. BST에서 Skewed Tree가 만들어지는 이유는 데이터가 일정한 순서에 의해 입력되는 이유이다. 이때, 각 들어오는 데이터에 대해 랜덤 하게우선순위를 부여함으로써, Heap처럼 우선순위에 따라 삽입한다.
-      조건
n  부모 노드의 우선순위가 자식 노드의 우선순위보다 커야 한다 ( heap )
n  부모 노드의 왼쪽 자식 노드는 더 작은 key, 오른쪽 자식 노드는 더 큰 key값을 가진다 ( BST )
-      삽입 / 삭제 알고리즘은 기존 BST보다 조금 복잡하다.

디자인 패턴
유스케이스 다이어그램 ( UML관련 추가 조사 필요, 질문 유형 : 너가 한 프로젝트를 UML로 그려봐라 or 클래스 다이어그램으로 표현하라 )
-      사용자와의 의사소통을 위해 만들어짐
-      Actor, use case, association ( include, exclude ) + generalization
싱글톤 패턴
-      개요 : 클래스당 유일한 인스턴스를 제공해야 할 필요가 있을 경우 사용. Ex) word processor의 도구 탭 등..
-      코드
Public class Singleton {
Private static Singleton uniqueInstance; // 유일한 인스턴스를 저장 -> static
Private Singleton() { } // 생성자는 내부에서만 쓰임 -> private
Public static synchronized Singleton getInstance() { // 해당 인스턴스를 리턴, 멀티 쓰레딩에 대비한 동기화 -> synchronized
          If( uniqueInstance == null) { uniqueInstance = new Singleton(); } // 생성된 인스턴스가 없다면 첫 인스턴스 생성
          Return uniqueInstance;
} }
MVC 패턴
-      Model View Controller : 어플리케이션을 세가지 역할로 구분한 개발 방법론
-      Controller : 사용자가 컨트롤러 클래스를 통해 모델 클래스를 조작한다. ( manipulate )
-      Model : 모델 클래스는 데이터베이스나 파일과 같은 데이터 소스를 제어한 후 결과를 리턴한다. ( update )
-      View : 컨트롤러는 모델로부터 리턴받은 결과를 뷰 클래스에 반영한다. ( see )

자바
객제지향
-      Keyword : 추상화, 부품화, 은닉화, 캡슐화, 인터페이스
컬렉션즈 프래임워크
-      개념 : C++STL과 같이 다양한 기능을 가진 자료구조를 담고있는 라이브러리 이다.
-      구성요소
n  Collection
u  SET ( HashSet, LinkedHashSet, TreeSet ) : 중복을 허용하지 않는다. 순서가 없다.
u  LIST ( ArrayList, Vector, LinkedList ) : 중복을 허용한다. 순서가 유지된다.
u  QUEUE ( PriorityQueue ) : 각각의 요소가 우선순위를 가지고 우선순위에 따라 정렬된다.
n  MAP ( SortedMap, Hashtable, .. ) : KeyValue 1:1 대응되어 구성된다. Key의 경우 중복이 없는 Set과 같다.
-      Iterator : Collection interface에 존재하는 자료구조로써, 자료구조를 순회하는 역할을 한다. 3가지 기능이 존재( HasNext, Next, remove )
n  사용방식
Iterator hi = A.iterator( );
While(hi.hasNext( )){
System.out.println(hi.next( ));
}
동기 vs 비동기
-      개념 : 일을 처리하는 방식의 두 종류. Ex) 빨래, 청소, 설거지를 해야하는 상황을 예시로 가정
-      동기 : 일을 순차적으로 처리하는 방식 ex) 빨래 청소 설거지를 순차적으로 처리한 후 다른 일이 가능
-      비동기 : 일을 외부에 모두 맡기고, 처리했다는 신호를 기다림 ex) 빨래를 빨래방에 맡김 청소를 청소 업체에 맡김 설거지를 식기세척기에 맡김 다른 일은 처리 빨래, 청소, 설거지가 다 되었다는 신호를 받음.
n  비동기 방식은 Node.js 처리 방식의 기본 철학이 된다. 수많은 요청을 처리해야 하는 서버의 경우, 동기 방식으로 일하게 되면 사용자 응답성에 치명적일 수 있기 때문.
그 외
-      프레임워크란 무엇인가 : 같은 언어로 개발하더라도 개발 방법은 사람마다 모두 다를 수 있다. 하지만 엔터프라이즈급 프로젝트를 진행할 때 이러한 다양성은 큰 문제가 된다. , 프레임워크란 개발 방법을 강제로 고정시키기 위해 아키텍터가 프로젝트 초기에 결정하는 사항 중 하나로써, 프로젝트 특성에 맞게 설정한다.
-      스프링 프레임워크는 왜 쓰는가
-      동시성은 어떻게 확보할 수 있는가 : http://mar7r.blogspot.kr/2013/08/1.html

안드로이드
-      개론 : 안드로이드 응용 프로그램은 적절한 권한만 있으면 언제든지 인스턴스화할 수 있는 4개의 주요 컴포넌트로 구성된다. 그래서 main 같은 유일한 진입점이 따로 없으며 처음 생성되는 인스턴스의 생성자가 실질적인 진입점이다.
-      4개의 컴포넌트
n  액티비티 : 사용자 인터페이스를 구성하는 기본단위. 윈도우와 유사하나 보다 큰 개념. 화면 하나가 액티비티이며 여러 개의 뷰나 프래그먼트로 구성된다. 응용 프로그램은 필요한 만큼의 액티비티를 가질 수 있다.
n  서비스 : UI가 없으며, 백그라운드에서 무한히 실행되는 컴포넌트. UI가 없음으로 사용자의 명령을 받아들일 수 있는 액티비티와 연결해서 사용. Ex) 노래 재생, 네트워크 감시, 백그라운드 계산
n  방송 수신자 ( broadcast receiver : BR ) : 시스템으로부터 전달되는 방송을 대기하고 신호 전달 시 수신하는 역할. UI를 가지지 않으며 방송 수신 시 방송의 의미를 해석하여 적절한 액티비티나 서비스를 띄우는 역할. 컴포넌트끼리 통신할 수 있는 공식적인 방법. Ex) 배터리가 떨어짐, 사진을 찍음, 네트워크 전송이 완료됨 등의 신호를 수신.
n  콘텐츠 제공자 ( content provider : CP ) : 다른 응용프로그램을 위해 자신의 데이터를 제공. 응용 프로그램 간에 데이터를 공유할 수 있는 유일한 합법적 장치. Ex) 주소록 데이터베이스.
-      인텐트 : 액티비티에서 다른 액티비티를 호출하는 주 목적은 뭔가 작업을 시키기 위해서이다. 액티비티끼리 서로 호출하려면 통신을 위한 장치가 필요한데 이 장치가 바로 Intent이다. 인텐트는 액티비티 뿐만 아니라 서비스,BR 등의 컴포넌트가 수행해야 할 작업에 대한 정보를 가지며 작업 결과를 돌려 주기 위해서도 사용된다. 즉 인텐트는 액티비티간에 인수와 리턴값을 전달하는 도구로 사용된다.
-      액티비티 생명주기 : 안드로이드는 멀티 태스킹을 지원하며 여러 개의 응용 프로그램을 동시에 실행할 수 있지만, 데스크톱 환경과는 달리 자원이 넉넉하지 않음으로 여러가지 제약이 따른다. 메모리와 화면의 제약 때문이다. , 여러개의 응용프로그램을 실행할 수 있지만 직접 사용하는 프로그램은 하나밖에 되지 않으니, 대신 사용자는 배경의 프로그램을 활성화 함으로써 교대로 실행한다. 시스템은 태스크의 실행 중인 액티비티를 스택으로 관리한다. 새로 생성된 액티비티는 스택의 최상단에 위치하며, 스택 제일 위의 액티비티가 종료되면 바로 아래쪽에 있는 액티비티가 자연스럽게 활성화된다. 스택상의 액티비티는 다음 세 가지 상태중의 하나이다.
n  Active, running : 사용자가 직접 사용하는 상태. 스택 제일 위에 존재. 포커스를 가지며 사용자의 입력을 직접 처리한다.
n  Stopped : 다른 액티비티에 의해서 완전히 가려진 상태. 눈에 보이지 않는다. 그러나 모든 정보를 유지하고 있음으로 언제든지 다시 활성화될 수 있다. 메모리가 부족하면 언제든지 강제 종료할 수 있다. ( killable )
n  Pause : 포커스는 잃었지만 사용자에게 보이는 상태. 위쪽의 다른 액티비티가 완전히 가리지 않았거나, 반투명한 상태. 살아있는 상태이지만 강제종료 가능하다. ( killable )

임베디드
-      개론 : PC는 여러 목적을 가진 범용적인 시스템이다. 문서작업 뿐 아니라 그래픽이나 멀티미디어 작업까지 가능하다. 하지만 임베디드 시스템은 특수한 목적을 가진 컴퓨터이다. 예를 들어 전자레인지는 음식을 데우기 위한 용도로만 사용되고, 입력은 몇가지 버튼을 통해, 출력은 LED를 통해 이루어진다. 범용의 목적이 아니기떄문에 각 시스템을 구성하는 장치나 소프트웨어가 제한적이다.
-      구현 : 임베디드는 하드웨어 구현과 소프트웨어 구현으로 나눌 수 있다. 하드웨어 구현은 속도는 빠르지만, 확장성이 부족하다. 기능을 확장하기 위해서는 하드웨어를 새로 설계해야 하기 때문이다. 하지만 소프트웨어 설계와 병행한다면, 기능 구현이나 확장이 용이해진다. 소프트웨어 실행을 위해 다양한 임베디드용 프로세스를 사용한다( ARM, MIPS … ). 임베디드 개발 환경은 구성에 따라 모두 달라서 개발자가 직접 컴파일러에 필요한 정보를 입력해 주거나 프로그램에서 직접 처리해야 한다.
-      소프트웨어 개발방법 : 기존 PC는 개발 환경과 실행 환경이 동일하다. 하지만, 임베디드 시스템은 키보드와 마우스가 없음으로 입출력장치가 있는 개발 환경과 테스트를 위한 실행 환경이 다르다. , 개발은 PC에서 수행을 하고 특별한 케이블을 통해 임베디드 시스템에 소프트웨어를 다운로드 시킨 후 테스트를 해볼 수 있다. , 다른 프로세스 환경에서 개발을 해야한다는 것을 의미하여 이를 크로스 개발환경이라 한다. 또한 컴파일러 또한 실행 환경에서 이해할 수 있는 컴파일을 진행해야 함으로 크로스 컴파일러를 사용해야 한다.
-      입출력 : 대체로 memory mapped i/o 방식을 차용한다. , 입출력과 메모리의 주소 공간을 분리하지 않고 하나의 메모리 공간에 취급하여 배치하는 방식이다. , 특정 LED에 해당하는 메모리 주소 공간에 비트를 갱신 시키면 LED가 점등되는 방식이다.

기술면접 문제 형식
: 총 네 가지 영역에서 질문을 합니다. 다만 회사의 특성에 따라 질문하는 비중이 모두 다를 수 있습니다.
1.     지식기반 질문 ( 필기시험 뿐만 아니라 기술 면접에서도 전반적으로 물어보는 추세입니다. )
: 기본 자질을 알아보기 위함. 때로는 경험한 프로젝트 관련 심층 지식을 물어보는 경우도 존재. 임계치를 넘지 못하면 좋은 결과를 기대할 수 없습니다.
n  브라우저애서 주소를 요청해서 결과를 받을 때까지의 과정
n  자신 있는 기술
n  OSI 7 계층에 대한 질문
n  싱글 톤 패턴을 화이트보드에 구현하기
n  안드로이드 액티비티 생명주기
n  스레드와 프로세스의 차이
n  데이터베이스 정규화
n  해시 테이블
n  TDD
n  대용량 트랜잭션 처리에 대한 문제
n  지원한 분야의 가장 기본이 되는 몇가지 API에 대해 어떻게 만들어졌고, 어떻게 구현할 것이고, 어떤 구조인지
n  스프링이나 대용량 DB구조, 인덱스
n  Java Java Script차이
n  Linked List Array 차이
2.     알고리즘관련 질문 ( 주로 개발업무를 직접적으로 맡아 하는 회사 및 직무에서 집중적으로 물어봅니다. )
: 실제 코딩 능력 및 문제해결 능력을 가졌는지 알아보기 위함입니다. 이것 하나만으로 당락이 결정되는 기업도 심심치 않게 볼 수 있습니다.
: 손 코딩의 경우 주로 입출력을 직접 받기보다는 메모리에 존재한다고 가정하고, 함수 단위로 작성하는 경우가 많음. 단계별로 진행하게 되는데, ‘아이디어 도출 -> 코드 작성 -> 코드 설명단계로 이루어지며, 감독관은 화이트보드에 적힌 코드를 핸드폰으로 찍는 경우 , 실시간으로 IDE에 따라 작성하여 디버깅하는 경우가 있음.
n  공이 9개 있다. 무게가 가벼운 공 하나를 찾는데 최소한의 횟수.
n  하노이 탑 손 코딩
n  1~1000 까지 숫자가 무작위로 10000 개가 있는데 이에 대한 평균값 가운데 값 을 알아내는 알고리즘 설계
n  디버깅 능력, 오류색출능력
n  토폴로지 소트 관련 손 코딩 : https://algospot.com/judge/problem/read/DICTIONARY
n  다이내믹 프로그래밍 관련 손 코딩 : https://www.acmicpc.net/problem/1912
3.     프로젝트관련 질문 ( 기술면접의 메인 디쉬 )
: 전문성과 협업 능력을 알아보기 위함입니다. 꼬리 물기 질문으로 진위여부를 가장 예민하게 탐색하는 부분입니다.
n  이전에 담당했던 프로젝트에 대한 구조 설명
n  기존 업무를 진행하면서, 디자이너들과 협업해본적은 있는지, 프로젝트 매니지먼트는 어떻게 했는지
n  기억에 남는 trouble shooting.
n  가장 창의적인, 도전적인, 끈기를 다한, 실패한 직무관련경험
4.     인성 질문 ( 기술면접 파트에서도 드물게 물어볼 때가 있습니다. )
: 조직 및 기업 친화적 성향을 가졌는지, 자기자신 및 기업의 미래 청사진은 가지고 있는지 알아보기 위함입니다. 원한다면 프로젝트 관련 답변으로 방향을 돌릴 수 있는 질문도 출제됩니다.
n  자기소개서와 관련된 내용, 앞으로 하고 싶은 일이 무엇인지, 지금까지 무엇을 경험했는지
n  살면서 가장 큰 성공을 거두었던 경험
n  하고 싶은 것 좋아하는 분야가 어떤 분야인가
n  ~ 것들을 했는지
n  최근 사회 이슈 ex) 대기업의 사회적 의무, 정년 연장, 명예퇴직 권고 등에 대한 자신의 견해
5.     기타
: 지원자가 얼마나 공학적으로 현실 문제를 생각할 수 있는지 알아보기 위함입니다. 최대한 SW개발자 답게 문제를 풀어내는 능력을 보이는 것이 좋습니다.
n  창의성 문제 : 경험상 알고리즘 풀이법을 적용해 보는 것이 좋을 듯 하다. 문제는 항상 불완전하다고 가정하고 문제를 논리적으로 재정의해가면서 푸는 능력이 필요하다.
u  문제정의 (problem space n이 몇일까) -> 해결방안 모색 (time complexity는 얼마나 될 것 인가) -> 오차 값 추산(어느 정도의 error rate를 예상할 수 있을까)
n  프로젝트 설계 문제 : 관련 주제에 적합한 지식을 가지고있으면 유용하다. 기술은 항상 trade off 관계가 있기 때문에, 설계한 방식의 장단점을 미리 예측하여 정리하는 것이 필요하다.
u  Ex) 광고성, 악성 블로그 활동을 저지하기 위한 시스템 설계 -> 구글 페이지랭크 알고리즘


댓글 5개: