무작정 개발.Vlog

신입 백엔드 개발자 기술 면접 핵심 정리 - Java

by 무작정 개발
반응형

📚 국비 수료 후 약 20곳의 회사를 면접을 보며 경험했던 기술 면접 경험을 공유하고, CS 기본 지식을 다시 복습하기 위해 이 글을 작성하였습니다.

  • 필자가 중소SI, 중견, 스타트업 등 여러 회사 면접을 경험하며 겪었던 기술 면접 질문을 중점으로 작성하였습니다.
  • 물론 이보다 더 깊고 어려운 기술 면접 질문 또한 존재합니다. 

📗 C 언어와 Java의 차이점에 대해 설명하세요.

  • C언어는 순차적으로 읽어가는 절차 지향 언어
  • Java는 클래스를 사용하고 설계적인 측면이 강조된 객체 지향 언어

 

📗 Java의 특징에 대해 설명하세요.

  • Java는 객체 지향 프로그래밍 언어
  • 기본 자료형을 제외한 모든 요소들이 객체(Object)로 표현되고, 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어
  • [ 장점 ]
    • JVM(자바 가상 머신) 위에서 동작하기 때문에 운영체제(OS)에 독립적이다.
    • GabageCollector(GC)를 통해 자동으로 메모리 관리가 가능하다.
  • [ 단점 ]
    • JVM 위에서 동작해서 실행 속도가 다른 언어에 비해 느리다.
    • 단일 상속만 가능하고, 문법(Type 등)이 엄격하다.

 

📗 JVM이란 무엇이고, 역할에 대해 설명하세요.

  • 자바 가상 머신의 약자를 줄여 부르는 용어(Java Virtual Machine)
  • 메모리 관리(GC)를 수행하며 스택(Stack) 기반으로 동작하고 Java Byte Code를 운영체제(OS)에 맞게 해석해주는 역할

[Java] JVM와 바이트 코드

 

📗 GC(가비지 콜렉터)에 대해 설명하세요.

  • GabageCollector(GC)는 힙(Heap) 영역에서 사용하지 않는 객체(인스턴스)들을 제거하는 작업
  • GC가 필요한 이유 : Java 언어는 개발자가 메모리를 직접 해제해줄 수 없는 언어이기에 객체를 사용하고 제거하는 기능이 필요함

[Java] JVM와 바이트 코드

 

📗 Java의 컴파일 과정을 설명하세요.

  1. Java 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요로 하는 메모리를 할당받는데 이 메모리를 용도에 따라 여러 영역으로 나누어 관리함.
  2.  Java 컴파일러(javac)가 Java 소스(.java) 코드를 읽어 자바 바이트 코드(.class)로 변환시킨다.
  3. 변환된 Class 파일들을 클래스 로더(Class Loader)를 통해 JVM 메모리 영역(Runtime Data Area) 영역으로 로딩한다.
  4. 로딩된 Class 파일들을 실행 엔진(Execution Engine)을 통해 컴퓨터가 읽을 수 있는 기계어로 해석된다. (각 OS에 맞는 기계어)
  5. 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어지게 된다. 이러한 실행 과정 속에서 JVM은 필요에 따라 Thread Synchronization과 GC 같은 관리 작업을 수행한다.

[Java] JVM와 바이트 코드

 

📗 OOP(Object Oriented Programming)에 대해 설명하세요.

  • 객체 지향 프로그래밍
  • 현실 세계를 프로그래밍 설계에 반영한다는 개념을 기반으로 한다.
  • 프로그래밍에서 필요한 데이터를 추상화시켜 행위(Method)와 상태(Attribute)를 가진 객체(Object)를 만들고, 그 객체들 간의 유기적인 상호 작용을 통해 로직을 구성하는 프로그래밍 기법
  • OOP의 4가지 특징 (캡 상 추 다)으로 캡슐화, 상속, 추상화, 다형성이 존재함.

OOP의 4가지 특징
OOP의 4가지 특징

 

📗 SOLID 원칙에 대해 설명하세요.

  • SRP - (단일 책임 원칙) : 하나의 클래스는 하나의 책임만 가져야 한다.
    • 코드를 변경하지 않으면서 확장을 어떻게 해야 하나? 정답은 [ 다형성 ]이다.
  • OCP - (개방-폐쇄 원칙) : 소포트웨어 요소는 확장에는 열려있고, 변경에는 닫혀 있어야 한다.
  • LSP - (리스코프 치환 원칙) : 상위 타입은 항상 하위 타입으로 대체할 수 있어야 한다.
  • ISP - (인터페이스 분리 원칙) : 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다.
    • 공통 인터페이스 1개보다는 특정 목적을 위한 인터페이스 여러 개가 있는 것이 좋다.
  • DIP - (의존 관계 역전 원칙) : 개발자는 추상화에 의존해야지, 구체화에 의존하면 안 된다.
    • 즉, 구현 클래스가 아닌 인터페이스에 의존하라는 의미

 

📗 Java에서 제공하는 원시 타입들의 종류와 각각 몇 바이트를 차지하는지 설명하세요.

  • 정수형 [ byte(1byte), short(2byte), int(4byte), long(8byte) ] / 실수형 [ float(4byte), double(8byte) ] / 문자형 [ char(2byte) ] / 논리형 [ boolean(1byte) ]
반응형

📗 클래스(Class)와 객체(Object)에 대해 설명하세요.

  • Class는 객체(Object)를 만들어내기 위한 설계도 혹은 틀이라 할 수 있다.
  • 객체(Object)는 설계도(Class) 기반으로 생성되며, 자신의 고유 이름과 상태, 행동을 갖는다.
  • 여기서 상태는 필드(Field), 행동은 메서드(Method)라고 표현
  • 객체(Object)에 메모리가 할당되어 실체는 '인스턴스'라고 부른다. 
  • 객체와 인스턴스는 동일한 의미라고 보면 된다.

 

📗 생성자(Constructor)에 대해 설명하세요.

  • 생성자(Constructor)는 클래스와 같은 이름의 메서드, 객체가 생성될 때 호출되는 메서드이다.
  • 주로 초기화 작업에서 사용한다. 
  • 기본 생성자는 작성하지 않아도 기본적으로 만들어지고, 매개 변수를 다르게 하여 매개 변수가 다른 생성자를 생성할 수 있다.

 

📗 오버라이딩(Overriding)과 오버로딩(Overloading)에 대해 설명하세요.

  • 오버라이딩(Overriding)은 상위 클래스에 있는 메서드를 하위 클래스에서 재정의 하는 것을 의미
  • 오버로딩(Overloading)은 같은 클래스 내에 동일한 이름을 가진 메서드가 있지만, 매개 변수의 타입 혹은 개수가 다르게 정의하는 것을 의미
  • [ 추가 ] : 메서드 위에 @Override 어노테이션을 써야 하는 이유는 컴파일 타임에 오버라이딩에 대한 안정성을 부여해주기 때문이다.

 

📗 Java의 리플렉션(Reflection)에 대해 설명하세요.

  • 구체적인 클래스 타입을 알지 못해도 클래스의 메서드, 타입, 변수들을 접근할 수 있게 해주는 Java API
  • JVM에서 실행되는 애플리케이션의 런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 프로그램에서 사용됨.
  • [ 장점 ]
    • 런타임 시점에서 클래스의 인스턴스를 생성하고, 접근 제어자와 관계없이 필드와 메서드에 접근하여 필요한 작업을 수행할 수 있는 유연성을 가지고 있다.
  • [ 단점 ]
    • 캡슐화를 저해
    • 런타임 시점에서 인스턴스를 생성해서, 컴파일 시점에서 해당 타입을 체크할 수 없다.

 

📗 Java의 제네릭(Generics)에 대해 설명하세요.

  • 제네릭(Generics)은 Java의 타입 안정성을 맡고 있다.
  • 컴파일 과정에서 타입 체크를 해주는 기능으로 객체의 타입을 컴파일 시에 체크하기에 객체의 타입 안정성을 높이고 형 변환의 번거로움을 줄여준다.

 

📗 추상 클래스와 인터페이스의 차이점에 대해 설명하세요.

  • 추상 클래스와 인터페이스는 자기 자신을 상속받는 하위 클래스에서 구현을 강제하는 추상 메서드를 가지고 있다.
  • 다른 점은 추상 클래스는 추상 메서드 말고 변수, 일반 메서드 등이 작성이 가능하지만, 인터페이스는 상수, 추상 메서드만 작성이 가능합니다.
  • 인터페이스는 다중 상속이 가능하고, 추상 클래스는 단일 상속만 가능하다.
  • [요약]
    • 인터페이스 : 구현 객체의 같은 동작을 보장하기 위한 목적
    • 추상 클래스 : 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 사용

 

📗 static(정적) 키워드에 대해 설명하세요.

  • static(정적)이란 고정된 의미를 뜻하는데 static 키워드는 필드와 메서드에 올 수 있다.
  • ex) 클래스 변수, 클래스 메서드
  • 클래스 로더(Class Loader)가. class 파일을 메모리에 적재할 때 static 영역에 생성되기 때문에 인스턴스를 생성하지 않아도 접근이 가능하다.
  • 모든 객체(Object)가 메모리를 공유한다는 특징이 있고, GC 관리 영역 밖이기에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재한다.

 

📗 static을 사용하는 이유에 대해 설명하세요.

  • static은 자주 변하지 않는 값이나 공통으로 사용되는 값 같은 공용 자원에 대한 접근에 있어 매번 메모리에 로딩하거나 값을 읽어 들이는 것보다 일종의 [ 전역 변수 ]와 같은 개념을 통해 접근하는 것이 비용을 줄이고 효율을 높일 수 있다.
  • 객체 생성 없이 바로 사용이 가능하기에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용하면 좋다.

 

📗  컬렉션 프레임워크(Collection  FrameWork)에 대해 설명하세요.

  • 컬렉션 프레임워크란 데이터의 집합, 그룹을 의미하며 자료 구조를 바탕으로 객체나 데이터들을 효율적으로 관리할 수 있는 자료 구조들이 있는 라이브러리이다.
  • 컬렉션 프레임워크는 Java의 인터페이스를 사용해서 구현된다.
  • 대표적으로 List, Set, Map, Statck, Queue 등이 있다.

[IT 기술 면접] Java의 Collection Framework 이란?

 

📗 List와 Map의 차이점에 대해 설명하세요.

  • List는 순서가 있는 데이터의 집합으로 데이터의 중복을 허용하고, 순서를 보장한다.
  • Map은 Key - Value으로 이루어진 데이터의 집합으로 Key의 중복을 하용하지 않으나 Value의 중복은 허용하고, 데이터 순서가 보장되지 않는다.
  • Collection Framework는 매우 중요하므로 이전에 정리했던 글 첨부

[IT 기술 면접] Java의 Collection Framework 이란?

 

📗 Array와 ArrayList의 차이점에 대해 설명하세요.

[ 공통 ]

  • Array, ArrayList 둘다 배열(Array)이라는 점은 동일하다.

[ 차이점 ]

  • Array는 인덱스(Index)로 접근하고, ArrayList는 메서드를 통해 접근한다.
  • Array는 Object 뿐만 아니라 원시 타입(int, long, double 등)도 담을 수 있지만,
  • ArrayList는 Object만 담을 수 있다. 그래서 정수를 ArrayList에 넣을 경우 Integer형은 가능하지만 int 형은 불가능하다.

 

📗 HashMap와 Hashtable의 차이점에 대해 설명하세요.

[ 공통 ]

  • HashMap와, Hashtable은 Map 인터페이스를 상속 받아 구현되고, Key-Value 형태로 데이터를 관리하는 자료 구조

[ 차이점 ]

 

1. HashMap, Hashtable 이 2개의 가장큰 차이점은 동기화(Synchronization) 지원 여부이다.

  • [ HashMap ]은 동기화를 지원하지 않는다. 따라서 단일 스레드 환경에서 사용하기 좋은 자료 구조 - (Thread-safe) X
  • [ Hashtable ]은 동기화를 지원한다. 따라서 멀티 스레드 환경에서 사용하기 좋은 자료 구조 - (Thread-safe) O

2. Null 여부

  • [ HashMap ]은 key,value 에 null을 허용하지만, [ Hashtable ]은 key,value에 null을 허용하지 않는다.

3. 속도

  • 멀티 스레드 환경이 아니라면 Hashtable이 HashMap보다 느리다. (다른 스레드가 block되고 unblock되는 대기 시간을 기다리기 때문)

 

📗 직렬화(Serialize)와 역직렬화에 대해 설명하세요.

  • 직렬화(Serialize)란 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 시스템에서도 사용할 수 있도록 바이트(Byte) 형태로 데이터를 변화하는 과정을 뜻한다.
  • 역직렬화란 직렬화된 바이트(Byte) 형태의 데이터를 다시 객체로 변환하는 과정을 뜻한다.

 

📗  예외 처리(Exception Handling)에 대해 설명하세요.

  • 예외 처리란 프로그램 실행 흐름 상 오류가 발생했을 때 그 오류를 대처하는 방법

 

📗 Java에서 불변 객체가 무엇인지 설명하세요.

  • 불변 객체란 객체 생성 이후 내부의 상태가 변하지 않는 객체를 말합니다.
  • Java에서 필드가 원시 타입인 경우 final 키워드를 사용해 불변 객체를 만들 수 있다.

 

📗 왜 불변 객체나 final을 굳이 사용해야 하는지 설명하세요.

  • Thread - Safe 하여 병렬 프로그래밍에 유용하고, 동기화를 고려하지 않아도 된다.
    • [ 공유 자원이 불변이기 때문에 항상 동일한 값이 반환되기 때문 ]
  • 메서드 호출 시 파라미터 값이 변하지 않는다는 것을 보장(불변)할 수 있기 때문이다.

 

📗 주소값 비교( == )와 값 비교(equals)의 차이점에 대해 설명하세요.

  • == 연산자는 비교하고자 하는 2개의 대상의 주소값을 비교한다.
  • String 클래스의 메서드인 equals()는 비교하고자 하는 2개의 대상의 값 자체를 비교한다.

 

📗 Java는 멀티 스레드(Multi Thread) 환경인데 멀티 스레드에 대해 설명하세요.

  • 멀티 스레드(Multi Thread)란 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미
  • 멀티 스레드 프로그램은 공유하는 자원에 대해 동기화 문제가 발생할 수 있다.
  • 추가적으로 JS(JavaScript)는 싱글 스레드
  • [ 멀티 스레드를 사용하는 이유 ]
    • 멀티 스레드는 각 스레드가 자신이 속한 프로세스의 메모리르 공유하므로, 시스템 자원의 낭비가 적다.
    • 하나의 스레드가 작업을 할 때 다른 스레드가 별도의 작업을 할 수 있어 사용자와의 응답성도 좋아진다.

🔔 구글링 + 개인적인 생각 및 기술 면접 경험을 중심으로 작성하였습니다.

 

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기