두나무 기술면접

자기소개

Q) 우리는 … 이제 승훈님 자기소개 해주세요. A) 어쩌고 저쩌고 …

Q) 퇴사한 이유가 무엇인가요? A) 내가 좋은 개발문화를 정착시키려고 노력할 때 그런것들이 좌절된다거나, 단순한 버그가 있는 코드조차도 리뷰를 통한 피드백이 없고, 더이상 내가 발전하지 않는 모습이 보여서 퇴사를 결심하게 되었습니다.

Q) 새로운 기술을 도입하고자 할 때 어떻게 시니어 개발자에게 설득하나요? A) 우선, 해당 기술에 대한 자료를 열심히 찾습니다. 그리고 잔디나 슬랙같은 메신저의 해당 채널에 링크를 올립니다. 그리고 직접 말로 설득하는 편입니다. 그렇게 해서 안된다면, 저는 개인 프로젝트로 해당 기술을 적용시켜서 어떠한 성과를 지표로 보여주도록 할 것 같습니다.

Q) 부트캠프같은건 보통 비전공자들이 많이 하지않나요? A) …

기술면접

Java

Java Basic

Q) 자바가 C, C++과의 차이점은 무엇인가요? A) Write Once, Run Everywhere

Q) 자바가 왜 느리다고 하는 걸까요?

Q) JVM에서 힙 메모리에 대해서 설명해주세요.

Q) 자바의 GC는 …

Q) 자바의 클래스, 인터페이스, 열거형의 차이를 말씀해주세요.

Q) volatile과 synchronized

Q) JVM 튜닝 해보셨나요?

Q) GC의 어떤 부분을 튜닝하여 성능을 개선할 수 있을까요?

Q) 함수적 인터페이스란 무엇인가요?

Q) 자바의 디폴트 메서드는 무엇인가요?

Q) A는 제네릭을 파라미터로 갖고, B는 Supplier를 갖습니다. 여기에서 유추할 수 있는 차이는 무엇인가요?

Spring

Q) 스프링 MVC에서

Kotlin

Q) var과 val 차이를 말씀해주세요.

Q) data class는 무엇인가요?

Q) companion object는 무엇인가요?

Computer Science

시스템

Q) OOM이 발생하는 경우, 방지 대책은 무엇이 있나요?

Q) SOF는 어떤 경우에 발생하나요?

Q) 재귀와 꼬리재귀는 무엇인가요?

Q) 재귀 말씀하실 때 스택영역에 계속 쌓인다고 했는데, 탈출조건없이 계속 쌓이면 어떻게 되나요? A) 아까 말씀하신 SOF가 발생할 것 같습니다.

자료구조

Q) 해시맵은 어떤 자료구조인가요?

Q) ArrayList와 LinkedList의 차이점이 무엇인가요? A) ArrayList는 연속적으로 저장되므로, 인덱스 접근이 가능해서 O(1)만에 탐색이 가능하고, LinkedList는 링크로 연결되어있어서 노드를 일일이 방문해야하므로 O(n)만큼 순차탐색 해야합니다. 또 삽입/삭제 시 ArrayList는 일일이 인덱스를 당겨주어야 하므로 O(n)만큼의 시간복잡도가 발생합니다. 반면에, LinkedList는 노드의 링크를 끊어서 다시 연결하기만 하면되니까 한 번만 참조하면 됩니다.

Q) 만약에 ArrayList의 끝부분에서만 삽입/삭제가 일어난다면 삽입에 어떤 것이 더 유리할까요? A) 아무래도 LinkedList는 끝에 있는 노드가 아니면 찾아가는 시간이 들 것이고, 끝에 있다고 하더라도 링크를 끊는 연산이 추가로 발생하므로 조금 더 느릴 것 같습니다.

Q) 바이너리 트리가 무엇인가요? A) 일종의 그래프인 트리는 루트노드에서 자식노드로 뻗어나가는 구조입니다. 그런데 이진트리는 자식노드를 최대 두개까지만 가지는 트리로 알고 있습니다. 그리고 무조건 둘 다 가진다면 완전이진트리라고 부릅니다.

네트워크

Q) TCP와 UDP의 차이점이 무엇인가요? A) TCP는 3-way handshaking을 통해서 논리적 연결을 맺은 후 통신하므로 신뢰성이 있습니다. 반면에, UDP는 단방향으로 데이터를 전송하므로 신뢰성은 떨어지지만 성능에 유리합니다.

Q) HTTP의 GET과 POST 메서드의 차이점이 무엇인가요?

데이터베이스

Q) 인덱스가 무엇인가요?

Q) 인덱스를 불리언 타입에 걸면 좋을까요?

Q) INNER JOIN과 LEFT JOIN의 차이점은 무엇인가요?

Q) 집합과 연관지어서 말씀해 보실래요? A) A와 B라는 집합이 있고 서로 겹치는 부분이 있다면, 그 교집합이 INNER JOIN이고, A 부분이 LEFT OUTER JOIN 입니다.

컬쳐핏

Q) 최근에 학습한 기술이 있나요? A) 새로운 기술이라기 보다는 스프링 코어에 대해서 학습했습니다.

Q) 학습하기 위해서 어떻게 하셨나요? A) 인프런에서 김영한님의 강의도 듣고, 그걸 듣고 나니깐 토비의 스프링이 잘 읽혀서 읽었습니다.

Q) 생각나는 구절이 있나요? A) 머릿말인가 어디에서 스프링의 핵심가치는 객체지향 프로그래밍을 잘 하게 해주는 것이고, 또 다른 것은 테스트 코드 작성을 용이하게 해준다는 것이다.

Q) 우선, 객체지향 프로그래밍을 잘 하게 해주는 것은 어떤 부분에서 그렇죠? A) 만약에 순수 자바 코드로 작성하게 되면 무조건 구현체를 로직이 있는 코드에 모두 포함시킬 수 밖에 없습니다. 하지만 스프링에서는 설정자를 분리함으로써 그러한 구현체 설정 부분을 자동주입으로 대체하므로 SOLID 원칙을 지킬 수 있도록 해주기 때문입니다.

Q) 개인적으로 테스트코드 작성을 용이하게 해준다는 말은 동의하지 않는데, JUnit으로 순수하게 테스트 하는 것에 비해서 SpringBoot 애너테이션을 붙여서 쓰면 활용성이 많이 떨어지거든요. A) 아, 들어보니 맞는 것 같습니다. 스프링에서 제공해주는 기능이 아니라, Gradle과 JUnit으로만 테스트 코드를 주로 작성했던 것 같습니다.

질의응답

기술스택이나 업무 등을 물어봄.