면접 기출 Flashcards
데드락의 정의와 데드락을 해결하는 방법에 대해 설명해보세요 - 2018 하반기 컴투스 1차 면접
교착 상태(膠着狀態, 영어: deadlock)란 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태를 가리킨다.
해결하는 방법에는 예방, 회피, 발견이 있다.
가상메모리의 정의와, 가상 메모리의 주소 체계에 대해 설명해보세요 - 2018 하반기 컴투스 1차 면접
가상 메모리는 RAM을 관리하는 방법의 하나로, 각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식을 말한다.
이러한 방식은 멀티태스킹 운영 체제에서 흔히 사용되며, 실제 주기억장치보다 큰 메모리 영역을 제공하는 방법으로도 사용된다.
가상적으로 주어진 주소를 가상 주소(virtual address) 또는 논리 주소(logical address) 라고 하며, 실제 메모리 상에서 유효한 주소를 물리 주소(physical address) 또는 실주소(real address)라고 한다. 가상 주소의 범위를 가상 주소 공간, 물리 주소의 범위를 물리 주소 공간이라고 한다.
가상 주소 공간은 메모리 관리 장치(MMU)에 의해서 물리 주소로 변환된다. 이 덕분에 프로그래머는 가상 주소 공간상에서 프로그램을 짜게 되어 프로그램이나 데이터가 주메모리상에 어떻게 존재하는지를 의식할 필요가 없어진다.
캐시 메모리의 정의와, 캐시메모리를 이용해 프로그램의 성능을 향상시키는 법에 대해 말해보세요.- 2018 하반기 컴투스 1차 면접
컴퓨터 시스템의 성능을 향상시키기 위해 주로 CPU 칩 안에 포함되는 빠르고 작고 매우 비싼 메모리[1]이다. 프로그램에서 직접적으로 읽거나 쓸 수 없고 하드웨어의 메모리 관리 시스템이 내부적으로 제어한다. 대부분 프로그램은 한번 사용한 데이터를 다시 사용할 가능성이 높고, 그 주변의 데이터도 곧 사용할 가능성이 높은 데이터 지역성을 가지고 있다. 데이터 지역성을 활용하여 메인 메모리에 있는 데이터를 캐시 메모리에 불러와 두고, CPU가 필요한 데이터를 캐시에서 먼저 찾도록 하면 시스템 성능을 향상시킬 수 있다.
웹서버와 소켓 서버의 차이가 무엇인지, 게임 개발에서 웹서버와 소켓 서버를 어느 상황에 사용해야 하는지 말해보세요 -2018 하반기 컴투스 1차 면접
웹서버는 응용 계층의 HTTP 프로토콜, 소켓 서버는 트랜스포트 계층의 TCP 프로토콜을 사용한다. HTTP 프로토콜은 이전의 통신을 기억하지 않는 state-less 통신이다. 데이터를 저장하는 위주의 통신은 웹서버, 빠른 반응을 보여줘야 하는 서버는 소켓으로 짜는게 좋다.
중간에 요소가 삭제, 삽입될 경우가 잦을 때 가장 적합한 STL은 무엇인가? - 2018 하반기 컴투스 필기
List
다음 함수를 다양한 타입이나 클래스에 작동할 수 있도록, C++ 템플릿 기능을 이용해 바꾸어라(정확히 뭐였는진 기억 안나지만 간단한 함수였음. swap 같은거 하면 될듯) - 2018 하반기 컴투스 필기
template
STL 벡터를 쓰기 부적절한 상황은 무엇인가? - 2018 하반기 컴투스 면접
중간에 삽입 삭제가 잦다면 쓰면 안 된다.
stack과 queue 를 하나의 자료구조로 구현한다고 하자. 매우 큰 입력에 대처할 수 있으면서 가장 빠르게 동작하는 자료구조는 무엇인가?
- 배열 2. 연결리스트 3. 해쉬테이블 4. B 트리 5. 그래프
- 2018 하반기 NHN 필기
- 연결리스트
TCP, IP, 이더넷은 각각 어떤 계층인가?
- 2018 하반기 NHN 필기
트랜스포트, 네트워크, 링크
가비지 컬렉션의 정의와, 구현 방식별 장단점을 적어라 - 2018 하반기 라인플러스 필기
가비지 컬렉션은 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능이다.
쓰레기 수집이 지원되는 환경에서는 프로그래머가 동적으로 할당한 메모리 영역의 전체를 완벽하게 관리할 필요가 없어진다. 쓰레기 수집은 다음과 같은 버그를 줄이거나 완전히 막을 수 있다.
유효하지 않은 포인터 접근: 이미 해제된 메모리에 접근하는 버그를 가리킨다. 만약 이 포인터가 해제되고 새로운 값이 할당되었다면, 잘못된 값을 읽어오게 된다.
이중 해제: 이미 해제된 메모리를 또다시 해제하는 버그를 가리킨다. 일부 메모리 할당 알고리즘에서는, 해제된 메모리를 다시 해제하려고 시도하는 것은 오류를 일으킬 수 있다.
메모리 누수: 더이상 필요하지 않은 메모리가 해제되지 않고 남아있는 버그를 가리킨다. 메모리 누수가 반복되면 메모리 고갈로 프로그램이 중단될 수 있다. (접근 가능한 메모리가 증가하여 메모리가 고갈되는 문제는 쓰레기 수집으로도 막을 수 없다)
가비지 컬렉션의 구현 방법과, 각각의 장단점을 적어라 - 2018 하반기 라인 플러스 필기
추적 방식, 레퍼런스 카운팅 방식
장단점 못 찾음
스마트 포인터가 무엇인지, 코딩을 전혀 모르는 사람에게 설명해보세요. - 2018 넷마블 하반기
C++ 프로그램에서 new 키워드를 사용하여 동적으로 할당받은 메모리는, 반드시 delete 키워드를 사용하여 해제해야 합니다.
C++에서는 메모리 누수(memory leak)로부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공하고 있습니다.
스마트 포인터(smart pointer)란 포인터처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해 줍니다.
(비유를 이용해서 더 쉽게 설명해야 함)
자바의 String, StringBuffer, StringBuilder의 차이 - 2016년 배달의 민족 (출처:https://java.ihoney.pe.kr/416)
String과 (StringBuffer, StringBuilder)의 차이점은 String은 immutable(불변)하고 StringBuffer, StringBuilder는 mutable(가변)하다는 점이다.
쉽게 말해서 String은 new 연산을 통해 생성되면 그 인스턴스의 메모리 공간은 절대 변하지 않는다.
그래서 + 연산이나 concat을 이용해서 문자열에 변화를 줘도 메모리 공간이 변하는 것이 아니라 새로운 String객체를 new로 만들어서 새로운 메모리 공간을 만드는 것이다.
이렇게 새로운 문자열이 만들어지면 기존의 문자열은 가비지 콜렉터에 의해 제거되야 하는 단점(언제 제거될지 모름)이 있다.
또한 이러한 문자열 연산이 많아질 때 계속해서 객체를 만드는 오버헤드가 발생하므로 성능이 떨어질 수 밖에 없는 단점이 있다. (+연산에 내부적으로 char배열을 사용함)
대신 String 클래스의 객체는 불변하기 때문에 단순하게 읽어가는 조회연산에서는 타 클래스보다 빠르게 읽을 수 있는 장점이 있다. (+불변하기 때문에 멀티쓰레드환경에서 동기화를 신경쓸 필요가 없음(장점))
결론 => String 클래스는 문자열 연산이 적고 조회가 많을 때 멀티쓰레드 환경에서 사용하면 좋음.
StringBuffer와 StringBuilder 클래스는 String과 다르게 mutable(변경가능)하다. 즉 문자열 연산에 있어서 클래스를 한번만 만들고(new), 연산이 필요할 때 크기를 변경시켜서 문자열을 변경한다.
그러므로 문자열 연산이 자주 있을 때 사용하면 성능이 좋다!
심지어 StringBuffer와 StringBuilder 클래스의 메서드들이 같으므로 호환(?)이 가능하다.
그렇다면 StringBuffer와 StringBuilder의 차이는 무엇일까?
차이점은 StringBuffer는 멀티쓰레드환경에서 synchronized키워드가 가능하므로 동기화가 가능하다. 즉, thread-safe하다.
StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드환경에서는 적합하지 않다.
대신 StringBuilder가 동기화를 고려하지 않기 때문에 싱글쓰레드 환경에서 StringBuffer에 비해 연산처리가 빠르다.
결론 => 문자열 연산이 많을 때 멀티쓰레드환경에서는 StringBuffer, 싱글쓰레드또는 쓰레드를 신경쓰지 않아도 되는 환경에서는 StringBuilder를 사용하는 것이 적절하다.
출처: https://jeong-pro.tistory.com/85 [기본기를 쌓는 정아마추어 코딩블로그]
왜 다형성을 가진 C++ 클래스의 소멸자에는 virtual 키워드를 붙일까? -연도, 기업 미상
출처: http://makefortune2.tistory.com/243?category=695910 [Simple in Complex with Simple]
자식 클래스의 소멸자가 실행되지 않아 메모리 누수의 원인이 된다.
new 와 malloc의 차이는 무엇인가? -연도 미상, 엔씨소프트(추정)
new는 연산자, malloc은 함수이다. malloc은 생성자를 실행하지 않는다.