메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

백엔드 기술 면접 TIP: 자바 기본 문법 예상 질문 5가지와 해설

한빛미디어

|

2024-02-08

|

by 이준형

17,647

기술 면접에 대해 본격적으로 이야기하기 전에 기술 면접과 관련된 일반적인 TIP에 대해 이야기하겠습니다. 기술 면접에서 진행되는 질문들은 크게 보면 다음과 같이 세 가지로 나눌 수 있습니다. 지식에 대한 검증, 사고력 추론 능력에 대한 검증 그리고 면접자의 경험에 대한 검증 있습니다. 

 

 

①지식에 대한 검증

먼저 지식에 대한 검증부터 이야기해 보겠습니다. 면접은 일반적으로 질문과 답변으로 이루어지는데요. 보통은 면접관이 질문하고 면접자가 답변을 하는 형태죠. 대부분의 면접 질문은 기본적으로 지식에 대한 검증을 그 바탕에 두고 있습니다. 사고력/추론 능력에 대한 검증과 경험에 대한 검증 역시 큰 범주로 보면 이 지식에 대한 검증이라고 볼 수도 있습니다.

지식에 대한 검증은 면접관이 면접자가 정말로 어떤 지식 자체를 알고 있는지 모르고 있는지 그 자체를 검증하려는 성격이 강합니다. 지식에 대한 검증이 목적이라면 면접관은 면접자가 해당 내용에 대해 적절한 답을 이야기하길 요구합니다. 예시를 통해서 조금 전에 이야기드린 내용에 대해서 설명을 드리겠습니다. 

 

 

동일성과 동등성의 차이를 설명하라는 면접 질문에는 ==로 비교하면 동일성을 비교할 수 있고, equals()로 비교하면 동등성을 비교할 수 있다고 답변할 수 있습니다. 일반적으로 이런 질문은 지식에 대한 검증 그 자체가 목적이 됩니다. 여기까지는 사고력이나 추론이 필요한 영역이 아닙니다. 정말로 단순히 어떤 지식을 알고 있느냐 모르고 있느냐를 물어보는 질문이죠. 자 그런데 여기서 더 나아가서 사고력 추론 능력에 대한 질문으로 이어질 수도 있습니다.
 

 

 

②사고력, 추론 능력에 대한 검증
 

만약 조금 전에 질문에 대한 답변을 듣고 면접관이 이어서 어떤 질문을 할 수 있을까요? 예를 들어 이런  질문을 할 수 있겠죠. “equals() 메서드를 사용하기만 하면 동등성 비교를 할 수 있나요?”와 같은 질문입니다. 이 질문 역시 누군가에게는 단순한 지식에 대한 검증을 수 있습니다. 그러나 이 지식을 모른다고 하더라도 다른 지식들을 통해서 추론을 할 수 있습니다. 

모든 객체는 결국 object 클래스를 상속받는다는 걸 본 기억이 있을 겁니다. 그리고 object 클래스를 상속받았을 때 equals() 메서드 역시 상속을 받았겠죠. 그럼 내가 만든 어떤 클래스의  equals() 메서드는 이미 구현이 되어 있을 텐데 어떤 상태로 구현이 되어 있을까요? 이 equals() 메서드는 내가 정의한 객체에 두 인스턴스가 동일하다는 것을 비교하는 데에도 충분한 상태일까? 이런 식으로 추론을 해볼 수 있다는 겁니다. 즉 내가 정의한 객체의 두 인스턴스가 동일하다는 것을 내 마음대로 비교해 주려면 오버라이딩이 필요하다고 생각할 수 있겠죠.
 

 

 

다른 예시도 한번 들어볼게요. “ArrayList의 크기가 어떻게 변하는지 설명해 보세요.”라는 질문을 할 수 있습니다.(혹시 오해할까 봐 그러는데 이 사이즈는 size 메서드를 호출했을 때 나오는 결과를 이야기하는 게 아니라 엄밀히 말하면 ArrayList의 전체 크기를 이야기하는 겁니다. 정확하게는 capacity라고 표현하는 게 정확하겠죠.) 이 글을 보고 있는 분 중에 ArrayList의 크기가 변할 수 있다는 것 자체도 모르고 계셨던 분들도 있을 겁니다. 한 번도 생각해 보지 않았을 수 있어요. 그러나 이 크기는 여러분들이 신경 쓰지 않더라도 실제로 내부적으로 변하고 있습니다

만약 여러분들이 사용 중인 ArrayList가 가득 차면 어떻게 해야 할까요? 더 이상 저장할 수 없다고 예외를 던지면 될까요? 아마 아닐 겁니다. ArrayList에 더 많은 공간을 할당해 줘야겠죠. 그럼 더 많은 공간을 할당할 때 무작정 넉넉한 큰 공간을 추가로 할당해 주면 좋을까요? 그러기에는 얼마나 더 사용될지 모르기 때문에 무작정 큰 공간을 주는 건 좋지 않을 겁니다. 반대로 추가로 딱 필요한 만큼만 할당해 주면 바로 이어서 그 공간이 가득 차 버릴 수도 있겠죠. 따라서 적절한 만큼의 공간을 할당해 줘야 합니다. 적절한 만큼의 공간을 할당하는 방법 자체는 생각하기 나름이지만 여기까지 생각해 낼 수 있는 능력을 면접관이 검증하려고 할 수도 있습니다.

이 면접 질문은 비교적 간단한 내용이고 널리 알려진 내용이며, 이러한 사고력과 추론 능력에 대한 내용은 시스템 설계 문제에서 많이 등장하는 질문의 형태입니다. 단순히 지식을 머리에 넣어야 하는 것 외에도 사고력과 추론 능력을 키워야 면접에서 면접관이 만족할 만한 답변을 할 수 있겠죠?

 

 

③경험에 대한 검증

마지막으로 경험에 대한 검증은 진행했던 프로젝트 경력에 대한 검증을 이야기합니다. 이력서에 기재한 내용들이 과장되지 않았는지 우리가 요구하는 수준의 경험이 있는지를 검증하는 거죠. 여기 올 수 있는 질문들은 정말 다양합니다. 면접에서 가급적 면접관이 여러분들에게 어떤 걸 검증하고 싶어서 이 질문을 하고 있는지 생각해 보면서 답변을 이어나가는 걸 추천드립니다. 그리고 잘 모르겠는 내용이라고 하더라도 면접관에게 힌트를 요구하면서 면접에 대한 답변을 이어 나가 보세요. 

 

 


백엔드 기술 면접 TIP: 자바 기본 문법 예상 질문 5가지


 

Q1. IDE와 소스코드 편집기는 어떤 차이가 있나요?

 

(해설을 보기 전에 잠시 스크롤을 멈추고 답변을 생각해 보세요.)
 


A1.  통합개발환경인 IDE가 더 포괄적인 개념이라고 할 수 있습니다. IDE가 소스코드 편집기를 포함합니다. IDE는 개발에 필요한 여러 가지 기능, 빌드를 자동으로 진행하거나 디버깅하는 기능, 결정적으로 소스코드를 편집할 수 있는 기능을 포함하고 있어 개발자의 사용 편의를 높입니다.

해설)
이 질문에서 면접관의 의도는 ‘평소에 학습하면서 어느 정도의 문제 의식을 가지고 학습하는가’를 파악하는 것입니다. 개발자로 취업하기 위해 면접을 보러 왔다면 어떤 종류가 되었든 IDE를 한번쯤은 사용해 보셨겠다. 그럼 당연히 IDE라는 용어를 들어 봤을 것이고, 문제 의식을 가지고 학습하는 사람이라면 IDE와 소스코드 편집기의 명칭을 구분해서 부르고 있다는 사실을 파악했을 겁니다. 사소해 보이지만, 평소에 학습하면서 마주치는 용어들의 정의와 유사한 용어와의 차이점을 찾아보고 정확히 알아두는 편이 좋습니다.

 

 

 

 

 

Q2. 동일성과 동등성의 차이를 설명해 보세요.


(해설을 보기 전에 잠시 스크롤을 멈추고 답변을 생각해 보세요.)
 


A2.  동일성과 동등성은 두 인스턴스를 비교할 때 사용되는 개념입니다. 동일성은 두 인스턴스가 ‘같은 존재인지’ 판단하는 것으로, 자바에서는 ‘==’ 연산자로 두 인스턴스의 레퍼런스 변수를 비교합니다. 비교의 결과가 true라면 두 인스턴스는 동일한 인스턴스인 것입니다. 동등성은 두 인스턴스가 ‘같은 값으로 평가되는지’ 확인하는 것으로, String 클래스는 자바의 equals() 메서드를 통해 확인하고, 직접 선언한 클래스는 equals() 메서드를 오버라이딩해 어떤 조건에서 동등하다고 판단할지를 정해 줘야 합니다.

 

 

 

 

 

Q3. 객체지향에 대해 설명해 보세요.

 

(해설을 보기 전에 잠시 스크롤을 멈추고 답변을 생각해 보세요.)
 


A3.  객체지향은 현재 가장 널리 사용되고 있는 프로그래밍 방법론입니다. 객체지향의 핵심은 추상화와 다형성이라고 생각합니다. 추상화와 다형성은 곧 인터페이스로 연결되는데요. 인터페이스 없이 애플리케이션을 개발하면 클라이언트 코드가 구체적인 클래스에 의존하게 되고, 하나의 클래스가 변경되면 다른 클래스도 계속해서 변경해 줘야 하는 문제가 생깁니다. 이런 문제를 해결하려면 클라이언트 코드가 구체적인 클래스가 아니라 인터페이스에 의존해야 합니다. 결국 클라이언트 코드와 구체적인 클래스 모두 인터페이스에 의존하게 되는 것입니다. 이처럼 코드를 변경했을 때 얻을 수 있는 몇 가지 이점이 있습니다. 

첫째, 클라이언트 코드는 해당 인터페이스를 구현하고 있는 구체적인 클래스의 세부 구현을 몰라도 됩니다. 인터페이스에 의존하고 있기 때문에 구체적인 클래스가 바뀌더라도 인터페이스가 바뀌지 않는 한 클라이언트 코드로 변경 내용이 전파되지 않는다는 것입니다.

둘째, 클라이언트 코드는 해당 인터페이스를 구현하고 있는 구체적인 클래스가 구현되지 않았더라도 자신의 코드를 개발할 수 있습니다. 테스트 코드를 만들어 해당 인터페이스가 해야 하는 역할에 대해 정의해 주기만 하면 됩니다.

추상적인 존재는 보통 다형성도 가집니다. 인터페이스의 레퍼런스 변수는 해당 인터페이스를 구현하는 여러 클래스들의 인스턴스를 담을 수 있습니다. 그리고 레퍼런스 변수 안에 어떤 인스턴스가 들어 있는지 신경 쓰지 않고 메서드를 호출하면 안에 들어 있는 인스턴스의 종류에 따라 완전히 다른 동작이 실행될 수 있습니다. 만약 이런 성질 없이 인터페이스가 ‘필수로 구현해야 할 메서드의 집합’의 역할만 했다면, 인터페이스를 선언해도 추상화했을 때의 이점을 누릴 수 없게 될 것입니다.
 

해설)
이 질문에 대한 답변에서 절대 붕어빵과 붕어빵 틀과 같은 예시를 들지 마세요. 그것은 객체지향에 대한 설명이 아니다. 이 질문을 한 면접관의 의도는 무엇일까요? 면접자가 단순히 로직만 구현하는 게 아니라 ‘더 나은 코드를 작성하기 위해 고민하고 공부하는 사람인가?’를 판단하는 질문이라고 생각합니다. 객체지향에 대한 이해와 고찰은 단순히 개발을 많이 한다고 해서 자연스레 늘어나는 것이 아니죠. 객체지향적인 코드를 작성하기 위한 학습과 노력의 결과라고 보는 것이 맞습니다. 마음 가는 대로, 아무렇게나 즉흥적으로 작성한 코드는 객체지향적이지 않은 코드일 가능성이 높습니다. 우선 객체지향적이지 않은 코드를 작성하는 것부터 시작해 익숙해지면 점차적으로 객체지향적인 코드 작성에 도전해보세요. 

 

 

 

 

 

Q4. ArrayList의 크기(size)가 어떻게 변하는지 설명해 보세요.


(해설을 보기 전에 잠시 스크롤을 멈추고 답변을 생각해 보세요.)
 


A4. 자바 버전마다 그 구현 방식이 다를 수 있지만, 기본적인 틀은 최초 ArrayList 내부에 특정 크기의 배열이 생성된 다음 용량이 가득 찰 때마다 일정 비율로 늘려간다고 알고 있습니다. 자바 8 버전 이상을 기준으로 했을 때 크기를 지정하지 않으면 최초 10 크기의 배열이 생성되고, 용량이 가득 찰 때마다 1.5배씩 늘어나는 것으로 기억합니다.

해설)
면접자가 항상 정확한 답을 알고 있기를 바라면서 질문하는 것은 아닙니다. ArrayList의 최초 크기가 10이고, 1.5배씩 늘어난다라는 숫자를 외우길 바라는 것이 아니라는 말입니다(물론 ArrayList의 경우 면접에서 상당히 자주 등장하는 주제이므로 자연스럽게 기억하게 될 것입니다). 질문의 목적은 합리적으로 추론하는 능력을 가지고 있는지를 확인해 보려는 것입니다. 만약 면접자가 ArrayList의 크기가 어떻게 변하는지를 모른다고 가정하고 추론해 보겠습니다.

ArrayList는 Array와 List를 합친 이름이죠. 인터페이스가 List이고 내부 구현은 배열 형태라는 느낌을 줍니다. 그렇다면 내부에 배열을 가지고 있을 것이고, 배열은 생성할 때 그 크기를 지정해 줘야 하겠죠? 그럼 이 배열의 최초 용량이 가득 찼다면 다음 배열의 크기는 새롭게 어느 정도로 생성해 줘야 할까요? 단순히 1만큼 큰 배열을 생성하면 용량이 금방 다시 차므로 새로운 배열을 또 생성해야 할 것입니다. 그렇다고 무작정 엄청 큰 배열을 생성하는 것은 메모리 낭비로 이어질 수 있습니다. 따라서 현재 배열의 크기에 비례하여 적당한 크기의 새로운 배열을 생성해야 한다는 결론이 나옵니다.

혹은 면접관이 면접자가 자바 API에 관한 문서나 구현 방식을 살펴보는 습관을 가졌는지를 판단하려고 할 수도 있습니다. 훌륭한 면접자라면 합리적으로 추론하고, 자주 사용하는 라이브러리의 구현에 관심을 가지는 것도 중요합니다.

 

 

 

 

 

Q5. 오버라이딩과 오버로딩의 차이점을 말해 보세요.
 

(해설을 보기 전에 잠시 스크롤을 멈추고 답변을 생각해 보세요.)
 


A5. 오버라이딩은 부모 클래스에 정의된 메서드를 자식 클래스에서 새롭게 정의하는 것을 의미하고, 오버로딩은 동일한 메서드의 이름으로 서로 다른 파라미터와 리턴 타입의 메서드를 여러 개 정의하는 것을 의미합니다.

해설)
자바의 기본 문법을 알고 있는지 확인하기 위한 의도입니다. 실제로 두 개념의 이름이 헷갈려서 반대로 외우는 경우가 종종 있죠. 한 번역서에서는 오버라이딩을 ‘재정의’, 오버로딩을 ‘중복적재’라고 번역이 되어있었습니다. 오버로딩의 loading은 무언가를 싣는다는 의미가 있으니 중복적재, 즉 메서드를 여러 개 싣는다고 연상하고, 남은 오버라이딩은 자연스럽게 메서드를 재정의하는 것이라고 기억해 보세요.

 


 



위 콘텐츠는 『이것이 취업을 위한 백엔드 개발자다 with 자바』의 내용을 재구성하여 작성하였습니다.


 

댓글 입력
자료실

최근 본 상품0