open:java-프로그래밍-면접-이렇게-준비한다

JAVA 프로그래밍 면접 이렇게 준비한다

1부. 면접 과정 살펴보기

1부는 면접관의 시선을 사로잡는 이력서 작성 방법부터 특정 언어에 관한 것이 아닌 일반 기술적인 주제까지 개발자 면접에서의 핵심부분을 다룬다.

1장에서는 지원자를 평가하는 다양한 면접 형태에 관해 설명한다.

2장에서는 면접관을 사로잡는 이력서와 자기소개서 작성 방법을 설명하고, 면접관이 이력서의 어떤 부분을 중점적으로 살펴보는지 알려준다.

3장에서는 다양한 면접 유형에 어떻게 대응해야 할지를 설명한다.

4장에서는 정렬이나 검색 같은 기본 알고리즘을 다룬다. 정렬과 검색은 면접에서 자주 묻는 주제고, 일상적인 프로그래밍 업무를 이해하는 데 꼭 알아야 할 내용이다.

5장에서는 몇 가지 중요한 자료구조를 다룬다. 자료구조 또한 면접에서 자주 묻는 주제고, 개발 업무에서 중요한 내용이다.

6장에서는 디자인 패턴을 다룬다. 디자인 패턴 역시 자주 묻는 면접 주제다.

7장에서는 자바 관련 면접뿐만 아니라 다양한 프로그래밍 언어에 공통적으로 해당하는 몇 가지 유용한 질문들을 살펴본다.

면접 과정 중이라면 지원한 회사의 기본 사항을 알아두어야 함은 필수다. 이럴때는 회사 웹 페이지의 about us페이지나 회사 블로그를 읽어두면 도움이 된다.

면접 과정의 마지막에는 보통 면접관에게 질문할 것이 있냐고 물어본다. 따라서 면접을 끝내기 전에 어떤 질문을 할지 미리 잘 생각해두기 바란다. 팀 분위기는 어떤지, 팀의 협업절차는 어떤지, 사무실 환경은 어떤지 등을 질문하면 적절하다. 아직 연봉이나 업무 보상 등을 질문할 단계는 아니다. 합격한 후에 질문할 기회가 충분히 있을 것이다.

어떤 기술 면접 형식을 요구하든 단위 테스트를 먼저 작성하는 것이 좋다. 시간이 좀 더 걸릴 수 있지만 단위 테스트는 정상적인 코드 작동을 보장해줄 것이다. 면접에서 단위 테스트를 작성하라는 지시가 없더라도 면접관에게 여러분이 얼마나 부지런하고 꼼꼼한 사람인지 보여줄 수 있다.

업무 소개와 관련되 사항은 미리 숙지해두자. 어떤 경우든 여러분이 회사에서 사용하는 기술을 배우고 싶어 한다는 것을 어필하는 것이 가장 중요하기 때문이다.

회사가 무슨 업무를 하는지 정확히 이해하고 있어야 한다. 여러분 역시 회사가 무슨 업무를 하는지 이해한 만큼 질문을 할 수 있고 또 여러분을 채용하려고 면접을 치르는 팀에서는 개발한 특정 애플리케이션이 무엇을 하는지 질문할 것이다.

  • 사전 심사나 개별 면접에서 알아봐야 하는 사항을 포함하는 기술 면접
  • 채용하려는 팀에서 관심 있는 주제나 질문을 더 많이 포함하는 상세한 기술 면접
  • 화이트보드에 코드를 작성하거나 페어 프로그래밍을 요청받을 수 있다.
  • 팀의 비즈니스를 책임지는 몇몇 구성원과의 면접, 주로 제품 관리자나 프로젝트 관리자가 여기에 해당한다.
  • 채용 담당자와의 면접. 몇 가지 간단한 기술과 기술 이외의 주제를 다루게 된다. 여러분이 팀에 잘 동화될 수 있는지를 보는 것이다.
  • 사내의 채용 담당자나 HR 담당자에게 마지막 결과를 듣게 된다. 예상 연봉과 다른 계약 사항과 관련해 대화를 하게 되고, 채용 절차의 다음 단계와 관련된 모든 안내를 받게 된다.

다음은 샘플 이력서의 한 예다.

소매업, 은행업과 관련해 4년의 경력을 쌓은 자바 개발자입니다. 항상 새로운 기술을 배우려고 노력하며 프로젝트 수행에 좀 더 뛰어난 리더쉽을 갖추고자 노력합니다.

사용할 수 있는 핵심 기술들을 다음처럼 설명하면 면접관에게 어필하는 데 훨씬 도움이 될 것이다.

스프링 JMS와 HTTP 프로토콜의 전문가이며, 아파치 카산드라도 조금 다룰 줄 압니다.

면접관은 면접자가 어떤 성과를 이뤘는지와 전에 근무했던 팀이 성공하는 데 어떤 역할을 했는지를 알고 싶어 한다는 점을 염두에 두자.

저는 'xxx' 게임의 서버 부분을 개발했습니다. 안정성에 중점을 두고 개발했으며, 첫 한 달 동안 서버가 중지되는 일 없이 일일 활성 사용자 2백만 명이 접속 했습니다.
소프트웨어 개발자 업무에 지원하는 제 이력서를 첨부했습니다.

현재 제 업무는 'X'회사의 서버 측 자바 개발자입니다. 이 회사에서는 3년 동안 일했고 자바 개발자로서 두 팀에서 일했습니다.

'X'회사에서 근무하는 동안에는 많은 것을 얻었다고 생각합니다. 그리고 이제 제 능력을 다른 분야에 적용해볼 때가 되었다고 생각합니다. 이제는 새로운 경험을 하고 싶습니다.

'Y'회사에서 근무하게 되면 지원하는 업무에 제 열정과 경험이 반드시 보탬이 될 것이라고 확신합니다. 곧 좋은 소식을 기다리겠습니다.

위 예는 다른 지원자와 여러분의 지원 사항을 차별화하는 세심한 배려가 담긴 자기소개서다.

Comparable과 Comparator 인터페이스의 차이는 무엇인가?

두 인터페이스 모두 public 접근 변경자로 선언하기 떄문에 모든 용도의 자료를 담을 수 있다. Comparable 인터페이스는 자연스러운 순서로 정렬할 때 사용하고, Comparator는 원하는 대로 정렬 순서를 지정하고 싶은 곳에 사용한다.

삽입 정렬 알고리즘은 어떻게 구현하는가?

삽입 정렬insert sort 알고리즘은 또 하나의 설명하기 쉬운 알고리즘이다.

snippet.java
Given a list l, and a new list nl
  for each element originallistelem in list l:
    for each element newlistelem in list nl:
      if (originallistelem < newlistelem):
        insert originallistelem in nl before newlistelem
      else move to the next element
    if orginallistelem has not been inserted:
      insert at end of nl

삽입 정렬 구현하기

snippet.java
public static List<Integer> insertSort(final List<Integer> numbers){
  final List<Integer> sortedList = new LinkedList<>();
 
  orginalList: for (Integer number: numbers) {
    for (int i =0; i< sortedList.size(); i++){
      if (number < sortedList.get(i)) {
        sortedList.add(i, number);
        continue originalList;
      }
    }
    sortedList.add(sortedList.size(), number)
  }
 
  return sortedList;
}
퀵 정렬 알고리즘은 어떻게 구현하는가?
snippet.java
method quicksort(list l):
  if l.size < 2:
    return l
 
  let pivot = l(0)
  let lower = new list
  let higher = new list
  for each element e in between l(0) and the end of the list:
    if e < pivot:
      add e to lower
    else add e to higher
 
  let sortedlower = quicksort(lower)
  let sortedhigher = quicksort(higher)
  return sortedlower + pivot + sortedhigher

퀵 정렬 알고리즘 구현하기

snippet.java
public static list<Integer> quicksort(List<Integer> numbers){
  if (numbers.size()< 2){
    return numbers;
  }
 
  final Integer pivot = numbers.get(0);
  final List<Integer> lower = new ArrayList<>();
  final List<Integer> higher = new ArrayList<>();
 
  for (int i =1; i < numbers.size(); i++){
    if (numbers.get(i)< pivot){
      lower.add(numbers.get(i));
    }else {
      higher.add(numbers.get(i));
    }
  }
 
  final List<Integer> sorted = quicksort(lower);
  sorted.add(pivot);
  sorted.addAll(quicksort(higher));
 
  return sorted;
}

자연스런 순서로 정렬할 수 있는 키들은 Comparable 인터페이스를 이용하면 되고, 직접 키들의 순서를 결정하고 싶으면 Comparator 인터페이스를 이용하면 된다.

TreeMap과 HashMap의 주된 차이점은 무엇일까? TreeMap에서는 컬렉션이 순서대로 저장되므로 전체 컬렉션을 반복해서 순회할 때 키의 순서가 보존되는 데 반해 HahsMap 클래스에서는 순서가 보존되지 않는다는 것이다.

템플릿 메서드 패턴은 알고리즘의 일부 또는 전부를 하위 클래스에서 구현하거나 위임하는 데 사용한다. 즉, 공통으로 사용하는 알고리즘은 부모 클래스에 정의하고 특정 부분에서 사용하는 알고리즘은 하위 클래스에서 수행하도록 설계하는 것이다.

데커레이터 패턴은 특정 객체의 기능을 설정하거나 변경할 수 있게 해준다. 죽, 버튼을 추가하거나 스크롤 바에 기능을 추가하거나 같은 재료로 만드는 샌드위치를 두 명의 고객에게 주문 받았을 때 어떻게 처리할지 등이 해당된다.

7장에서는 자주 묻는 몇 가지 면접 질문들을 자바로 구현해본다. 여기서 다루는 질문의 대부분은 널리 알려진 기술 면접 웹 사이트인 www.interviewzen.com을 인용했다.

2부. 자바 핵심

3부. 컴포넌트와 프레임워크

이 책에 나오는 모든 예제 코드는 www.wiley.com/go/javaprogramminginterviews에서 다운로드 할 수 있다.(한빛미디어 홈페이지의 자료실 http://www.hanbit.co.kr/exam/2152/에서도 다운로드 할 수 있다.)


  • open/java-프로그래밍-면접-이렇게-준비한다.txt
  • 마지막으로 수정됨: 2020/06/02 09:25
  • 저자 127.0.0.1