반응형
https://dev-coco.tistory.com/153 참고
신입 개발자 기술면접 질문 정리 - 자바
💡 Java의 특징을 설명해주세요.Java는 객체지향 프로그래밍 언어입니다. 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어
dev-coco.tistory.com
Java의 특징 설명
- Java는 객체지향 프로그래밍언어로, 다형성, 상속, 캡슐화, 추상화 등의 특징을 가집니다.
- JVM 위에서 구동되어 운영체제에 독립적입니다. 하지만 이 때문에 실행 속도가 상대적으로 느립니다.
- GC가 자동으로 메모리를 관리해줍니다.
JVM에 대한 설명
- JVM은 Java Virtual Machine의 약자로, Java가 운영체제에 독립적일 수 있게 합니다.
- 클래스 로더 영억, 런타임 데이터 영역, 실행 엔진 영역으로 나뉩니다.
- 클래스 로더는 바이트파일을 JVM 메모리에 로드하는 역할을 하며, 동적으로 런타임 데이터 영역에 클래스들이 배치됩니다.
실행 엔진에서 바이트파일을 실행시키며, GC로 메모리 관리를 합니다.
Java의 컴파일 과정
- .java 확장자의 파일을 Java 컴파일러로 .class 확장자의 바이트파일로 컴파일합니다.
- 컴파일된 바이트파일을 클래스 로더가 JVM 메모리에 로드합니다.
- 실행 엔진이 해당 파일을 실행시킵니다. 처음에는 인터프리터 방식으로 실행시키고, 자주 사용되는 것들은 JIT(Just In Time)로 실행시킵니다.
Overriding과 Overloading
- Overriding이란 인터페이스나 부모 클래스에서 상속받은 메소드를 재정의하는 것을 의미합니다.
- Overloading이란 같은 이름의 메소드를 변수의 수 등을 다르게 하여 여러개 정의하는 것을 의미합니다.
객체지향 프로그래밍(OOP)이란?
- 모든 요소들을 객체의 형태로 바라보고, 각 객체들의 역할에 따라 상호작용하도록 하는 것을 의미합니다.
- 즉, 기능 중심이 아닌, '누가 어떤 역할을 하는가?'를 중심으로 합니다.
- 특징으로는 다형성, 상속, 캡슐화, 추상화가 있습니다.
- 상속: 부모 객체나 인터페이스에 정의된 메서드를 하위 객체가 사용할 수 있는 것을 말합니다.
- 다형성: 오버라이딩이나 오버로딩을 통해 같은 메서드를 호출하여도 다르게 동작하는 것을 말합니다.
- 캡슐화: 클래스 내부에서만 접근할 수 있도록 하고, 외부에서 이를 직접적으로 조작하지 못하게 하는 것을 말합니다.
- 추상화: 반환타입, 파라미터 타입, 메소드명과 같이 핵심적인 것들만 정의하는 것을 말합니다.
객체지향 설계 원칙 설명
- 객체지향 설계 원칙은 SOLID를 따릅니다.
- SRP (단일 책임 원칙) : 하나의 클래스는 하나의 역할만 수행다는 원칙입니다.
- OCP (개방 폐쇄 원칙) : 확장에는 열려있고, 수정에는 닫혀있다는 원칙입니다.
- LSP (리스코프 치환 원칙) : 하위타입은 항상 상위타입을 대체할 수 있어야 한다는 원칙입니다.
- ISP (인터페이스 분리 원칙) : 인터페이스의 메소드를 최소화하여, 여러개의 인터페이스로 분리하라는 원칙입니다.
- DIP (의존성 역전 원칙) : 구체적인 클래스보다 수정 가능성이 덜한 추상 클래스나 인터페이스와 관계를 맺도록 하는 원칙입니다.
try-with-resources란?
- try-catch-finally 구문을 보완하고자 등장한 개념입니다.
- try구문에 자원 객체를 전달하면, try 블록 종료 시 자원 할당이 자동으로 해제됩니다.
불변 객체란?
- 불변 객체란 데이터 내부의 상태가 변하지 않는 객체를 말합니다.
- 해시값 변경이 없기 때문에 해시를 사용하는 Map이나 Set으로 관리하기 좋습니다.
- 자원 동기화가 필요 없어 멀티 스레드 환경에서도 안전하게 사용 가능합니다.
불변객체를 만드는 방법
- final 키워드로 불변객체를 만들 수 있습니다.
- 다만, 참조 자료형의 경우 내부 값들까지 불변으로 유지해야하기 때문에, 참조하는 객체의 내부 값들을 복사하여 저장하는 형태로 만들 수 있습니다.
- 이를 방어적 복사(defensive copy)라고 합니다.
추상 클래스와 인터페이스의 차이
- 추상 클래스는 abstract로 정의되어 있거나, 추상 메소드를 포함한 클래스를 말합니다.
- 인터페이스는 모든 메소드가 추상 메소드여야 합니다.
- 클래스는 다중상속이 불가능하지만, 인터페이시는 가능합니다.
싱글톤 패턴이란?
- 싱글톤 패턴이란, 프로그램 내에서 1개의 인스턴스로 존재하는 것을 말합니다.
- 인스턴스가 1개만 존재하는 것을 보장하고 싶은 경우 사용합니다.
- 또는 동일한 인스턴스를 자주 사용해야 하는 경우 메모리 낭비를 방지하기 위해 사용합니다.
- 대표적인 예로는 Spring의 Bean이 있습니다.
Garbage Collection이란?
- Java에서 자동으로 메모리를 관리해주는 기법을 말합니다.
- JVM의 엔진 영역에서 구동됩니다.
- GC는 '대부분의 객체는 생명주기가 짧고, 오래 사용된 객체는 계속해서 오래 사용될 가능성이 높다'라는 가정하에 설계되었습니다.
Garbage Colloection 과정
- Young Generation과 Old Generation으로 나뉘며, Young Generation에서 일어나는 GC 작업을 Minor GC라고 합니다.
- Young Generation은 에덴 영역과 서바이버 영역으로 나뉘어져 있습니다. 에덴 영역에 새로운 객체들을 저장하고, 사용되는 객체들은 나이를 부여하며 서바이버 영역에 존재하게 합니다.
- Minor GC 작업 시 사용되지 않는 객체를 정리하고 사용되는 객체들의 나이가 임계치를 넘어설 경우 Old Generation 영역에 저장합니다.
- Old Generation 영역이 가득차게 되면 Major GC를 수행하여, 객체들을 정리합니다.
- GC 작업은 모든 스레드가 중단된 후 이루어집니다.
자바의 메모리 영역에 대한 설명
- 자바의 메모리 영역은 메소드 영역, 힙 영역, 스택 영역으로 나뉘어집니다.
- 메소드 영역은 static변수들이나 method들이 저장되며, 프로그램 실행부터 종료까지의 생명주기를 갖습니다.
- 힙 영역은 프로그램이 실행되며 생성된 객체들이 저장됩니다. GC에 의해 관리되어지는 영역입니다.
- 스택 영역은 메소드가 실행되며 생성된 변수들이 저장되는 공간입니다. 메소드 호출부터 종료까지의 생명주기를 갖습니다.
클래스/객체/인스턴스 의 차이
- 클래스는 객체를 생성하기 위한 설계도, 틀을 의미합니다.
- 클래스를 기반으로 생성되는 것을 객체라고 합니다.
- 객체에 실제 메모리가 할당되어 사용되는 것을 인스턴스라고 합니다.
생성자에 대한 설명
- 클래스와 같은 이름을 가진 메소드로, 객체를 생성할 때 호출합니다.
- 명시적으로 생성자를 정의하지 않아도 default로 생성되며, 이 경우에는 파라미터를 아무것도 받지 않습니다.
- 오버로딩으로 여러 생성자를 생성할 수 있습니다.
Wrapper Class, Boxing과 Unboxing 설명
- int, long과 같은 기본 자료형을 객체로 표현한 것을 Wrapper Class라고 합니다.
- 기본자료형을 Wrapper Class로 변환하는 작업을 Boxing, 반대의 작업을 Unboxing이라고 합니다.
Synchronized 설명
- 멀티스레드 환경에서 한 스레드가 특정 자원을 사용하고 있을 때 다른 자원이 사용하지 못하도록 하는 것입니다.
- 변수와 메소드에 Synchronized 키워드를 사용해 동기화 할 수 있습니다.
- Synchronized 키워드 남발 시 프로그램 성능이 저하될 수 있습니다.
new String()과 리터럴("") 차이
- 리터럴로 생성한 문자열 객체는 힙메모리의 String pool에 저장됩니다.
- 만약 동일한 값의 문자열을 리터럴로 생성하면, String pool에 저장된 문자열 객체를 동일하게 사용합니다.
- 생성자를 통해 문자열을 생성하면, 동일한 값의 문자열이여도 새로운 객체를 생성하여 사용하게 됩니다.
String, StringBuffer, StringBuilder의 차이
- String은 기본적으로 불변객체의 특성을 가집니다. 때문에 값 수정이 불가능합니다.
- 때문에 문자열 값이 빈번하게 바뀔 경우 String은 새로운 객체를 계속 생성하여 메모리 낭비를 발생시킵니다.
- StringBuffer와 StringBuilder는 문자열 수정이 자유롭습니다.
- StringBuilder의 경우 동기화를 지원하지 않아 싱글 스레드 환경에 적합합니다.
- StringBuffer의 경우 동기화를 지원하여 멀티스레드 환경에 적합합니다.
접근 제한자의 종류
- private : 해당 클래스에서만 접근 가능.
- (default) : 해당 패키지에서만 접근 가능.
- protected : 해당 패키지내에서 접근 가능. 또는 다른 패키지에서 상속받아 자식 클래스에서 접근 가능.
- public : 접근 제한 없음.
클래스 멤버 변수 초기화 순서
- static 변수 선언부 : 클래스 로드 될 때 초기화 됩니다.
- 필드 변수 선언부 : 객체 생성 시 생성자 block보다 먼저 초기화 됩니다.
- 생성자 block : 객체 생성 시 가장 마지막에 초기화 됩니다.
static 키워드란?
- static 키워드를 사용한 변수나 메서드는 클래스 로드될 때 생성되어, 로딩이 완료하면 곧바로 사용 가능하다.
- 모든 객체가 메모리를 공유한다는 특징이 있고, 메소드 영역에 있기 때문에 GC의 관리를 받지 않습니다.
- 보통 자주 변하지 않는 값이나 공통으로 사용되는 값에 사용됩니다. '전역변수'와 같은 개념으로 접근할 수 있습니다.
Inner Class의 장점
- 서로 관련있는 클래스를 논리적으로 묶어서 표현할 수 있으므로 응집도를 높일 수 있다.
- 외부에서 내부 클래스에 접근하지 못하도록 캡슐화 하여, 보안을 높일 수 있다.
Inner Class를 static으로 선언해야 하는 이유
- 내부 클래스는 암묵적으로 외부클래스 인스턴스를 참조합니다.
- 외부 클래스가 필요없어질 경우 GC가 이를 제거해야하지만, 내부클래스의 참조로 인해 제거가 되지 않을 수 있습니다.
- 때문에 static으로 선언하여 외부 클래스와 독립적으로 만드는 것입니다.
리플렉션(Reflection)이란?
- 리플렉션이란 구체적인 클래스의 타입을 알지 못해도 해당 클래스의 변수, 메소드 등에 접근할 수 있도록 하는 것을 말합니다.
- 제네릭과 달리 타입안정성을 보장하지 않습니다.
- 스프링 프레임워크의 어노테이션이 리플렉션을 활용한 기능이라고 알고 있습니다.
Error와 Exception의 차이 설명
- Error는 실행 중 일어날 수 있는 치명적인 오류를 말합니다. Error가 발생하게되면 프로그램이 비정상적으로 종료됩니다.
- Exception은 Error에 비해 경미한 오류를 말합니다. 예외 처리를 통해 비정상적 종료를 예방할 수 있습니다.
CheckedException과 UncheckedException
- CheckedException은 실행 전 예측 가능한 예외들을 말하며, 반드시 예외처리를 수행해야 합니다.
- UncheckedException의 경우 실행 후에야 알 수 있는 예외들을 말합니다.
Optional API에 대한 설명
- 개발 시 가장 자주 발생하는 오류는 NullPointException입니다.
- 하지만 매번 null을 검증하는 코드를 작성해야 하는 경우, 코드가 복잡해지게 됩니다.
- 이를 보완하고자 Java8부터 등장한 개념입니다.
Optional<T>
를 통해 null을 사용하지 않고도 빈 값을 표현할 수 있게 하며, null로인한 예외가 발생하지 않게 합니다.
Collection 프레임워크 설명
- 다수의 데이터를 관리할 수 있는 프레임워크입니다.
- List, Set, Map, Stack, Queue 등 다양한 자료구조를 지원합니다.
List, Set, Map, Stack, Queue의 특징
- List: 데이터가 순서를 지키며 나열된 구조입니다. Array와 다르게 크기를 유연하게 조정할 수 있스빈다.
- Set: 순서와 상관없이 중복을 허용하지 않으며 데이터를 저장합니다.
- Map: key와 value 쌍으로 이루어진 데이터 구조입니다. key는 순서를 보장하지 않으며 중복을 허용하지 않습니다.
- Stack: LIFO를 따르는 데이터 구조입니다.
- Queue: FIFO를 따르는 데이터 구조입니다.
Set과 Map의 타입이 객체를 받을 때 중복 검사 방법
- Set과 Map의 구현체는 HashSet과 HashMap이 있습니다.
- 이들이 객체를 받을 때에는 equals를 재정의 하여 내부 데이터가 논리적으로 같은 값인지를 구별해야 합니다.
- 뿐만 아니라, hash코드로도 값을 비교하기 때문에 hashcode도 함께 재정의해야합니다.
제네릭이란? 왜 사용하는가?
- 제네릭이란 데이터 타입을 포괄적인 범위로 지정하는 것을 의미합니다.
- 데이터 범위를 넓히며 타입 안정성을 보장하고, 유연한 프로그래밍이 가능합니다.
final, finally, finalize의 차이 설명
- final: 불변객체를 만들기 위한 키워드입니다.
- finally: try-catch문에서 예외 발생 여부와 관계없이 실행되는 블록을 정의할 때 사용합니다.
- finalize: GC에 의해 사용되는 메소드로 알고 있습니다. 사용하면 안되는 메소드입니다.
직렬화란?
- 시스템 내부에서 사용되는 객체나 데이터들을 외부에서도 사용할 수 있도록 byte로 변환하는 과정을 말합니다.
- 반대로 byte데이터를 객체나 데이터로 변환하는 과정은 '역직렬화'라고 합니다.
- 직렬화 수행 시 SerialVersionUID를 통해 버전을 관리합니다.
728x90
반응형
'Language > Java' 카테고리의 다른 글
equals와 hashCode 오버라이딩 (0) | 2025.03.11 |
---|---|
[JSP] JSP(JavaServer Pages)의 정의와 기본 구성 요소 (1) | 2025.01.02 |
record 클래스 (Java 14) (0) | 2024.12.13 |
직렬화(Serialization) (0) | 2024.12.12 |
동기화(synchronization)와 락(Lock) (1) | 2024.12.11 |