신입 백엔드 개발자 기술 면접 핵심 정리 - 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)에 맞게 해석해주는 역할
📗 GC(가비지 콜렉터)에 대해 설명하세요.
- GabageCollector(GC)는 힙(Heap) 영역에서 사용하지 않는 객체(인스턴스)들을 제거하는 작업
- GC가 필요한 이유 : Java 언어는 개발자가 메모리를 직접 해제해줄 수 없는 언어이기에 객체를 사용하고 제거하는 기능이 필요함
📗 Java의 컴파일 과정을 설명하세요.
- Java 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요로 하는 메모리를 할당받는데 이 메모리를 용도에 따라 여러 영역으로 나누어 관리함.
- Java 컴파일러(javac)가 Java 소스(.java) 코드를 읽어 자바 바이트 코드(.class)로 변환시킨다.
- 변환된 Class 파일들을 클래스 로더(Class Loader)를 통해 JVM 메모리 영역(Runtime Data Area) 영역으로 로딩한다.
- 로딩된 Class 파일들을 실행 엔진(Execution Engine)을 통해 컴퓨터가 읽을 수 있는 기계어로 해석된다. (각 OS에 맞는 기계어)
- 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어지게 된다. 이러한 실행 과정 속에서 JVM은 필요에 따라 Thread Synchronization과 GC 같은 관리 작업을 수행한다.
📗 OOP(Object Oriented Programming)에 대해 설명하세요.
- 객체 지향 프로그래밍
- 현실 세계를 프로그래밍 설계에 반영한다는 개념을 기반으로 한다.
- 프로그래밍에서 필요한 데이터를 추상화시켜 행위(Method)와 상태(Attribute)를 가진 객체(Object)를 만들고, 그 객체들 간의 유기적인 상호 작용을 통해 로직을 구성하는 프로그래밍 기법
- 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)는 싱글 스레드
- [ 멀티 스레드를 사용하는 이유 ]
- 멀티 스레드는 각 스레드가 자신이 속한 프로세스의 메모리르 공유하므로, 시스템 자원의 낭비가 적다.
- 하나의 스레드가 작업을 할 때 다른 스레드가 별도의 작업을 할 수 있어 사용자와의 응답성도 좋아진다.
🔔 구글링 + 개인적인 생각 및 기술 면접 경험을 중심으로 작성하였습니다.
반응형
'CS 지식 & 기술면접 > 기술 면접 정리' 카테고리의 다른 글
[기술 면접] 신입 백엔드 기술 면접 질문 정리 및 답변 (2) | 2022.07.12 |
---|---|
[기술 면접 후기] 가장 인상 깊었던 3번째 기술 면접 및 질문 정리 (1) | 2022.06.03 |
[IT 기술 면접] Java의 Collection Framework 이란? (0) | 2022.05.31 |
[IT 기술 면접] JVM (자바 가상 머신) 이란? (0) | 2022.05.30 |
[IT 기술 면접] OOP(객체 지향 프로그래밍) 이란? (0) | 2022.05.30 |
블로그의 정보
무작정 개발
무작정 개발