💡Java의 특징을 설명해주새요
기본자료형을 제외한 모든 요소들이 객체로 표현되고, 객체지향개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어입니다.
또한 운영체제에 독립적이며 가비지컬랙션을 통한 자동적인 메모리 관리가 가능합니다.
💡JVM의 역할에 대해 설명해주세요.
스택기반으로 동작하며, 자바 바이트 코드를 운영체제에 맞게 해석해 주는 역할을 하고 가비지컬랙션을 통해 자동적인 메모리 관리를 합니다.
💡Java의 컴파일 과정에 대해 설명해주세요.
개발자가 자바파일을 생성하면 빌드를 통해 바이트코드를 생성합니다.
클래스로더를 통해 jvm메모리 내로 로드하고 실행엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석 됩니다.
💡Java에서 제공하는 원시 타입들에 무엇이 있고, 각각 몇 바이트를 차지하나요?
정수형으로는 바이트, 숏, 인트, 롱이 있고, 실수형으로는 프루트, 더블이 있으며, 문자형 차와 논리형 불린이 있습니다.
바이트는 1, 숏은 2, 인트는 4, 롱은 8을 차지하며, 프루트는 4, 더블은 8을 차지합니다.
문자형은 2를 차지하고 논리형은 1 바이트를 차지합니다.
💡오버라이딩(Overriding)과 오버로딩(Overloading)에 대해 설명해주세요.
오버라이딩은 상위 클래스에 있는 메소드를 하위클래스에서 재정의 하는 것을 말하고,
오버로딩은 매개변수의 갯수나 타입을 다르게 하여 같은 이름의 메소드를 여러개 정의하는 것을 말합니다.
💡객체지향 프로그래밍(OOP)에 대해 설명해주세요.
프로그램 구현에 필요한 객체를 파악하고 상태와 행위를 가진 객체를 만들고 각각의 객체들의 역할이 무엇인지 정의하여 객체들간의 상호작용을 통해 프로그램을 만드는 것을 말합니다.
특징으로는 캡슐와, 상속, 다형성, 추상화 등이 있고 모듈 재사용으로 확장 및 유지보수가 용이합니다.
💡try-with-resources에 대해 설명해주세요.
try안에 자원객체를 전달하면, try블록이 끝나고 자동으로 자원을 해제해주는 기능을 말합니다.
따로 finally 구문이나 모든 catch 구문에 종료 처리를 하지 않아도 됩니다.
💡불변 객체가 무엇인지 설명하고 대표적인 Java의 예시를 설명해주세요.
불변 객체는 객체 생성 이후 내부의 상태가 변하지 않는 객체를 말합니다.
final 을 사용하여 불변 객체를 만들 수 있습니다.
참조 타입인 경우에는 copy해서 저장하거나 새로운 값을 만들어 복사하도록 합니다.
💡불변 객체나 final을 굳이 사용해야 하는 이유가 있을까요?
쓰레드-세이프 하여 병렬 프로그래밍에 유용하며, 동기화를 고려하지 않아도 됩니다.
또한 부수효과를 피해 오류를 최소화 할 수 있으며, 가비지 컬랙션 성능을 높일 수 있습니다.
💡추상 클래스와 인터페이스를 설명해주시고, 차이에 대해 설명해주세요.
추상클래스는 클래스 내의 추상 메소드가 하나 이상 포함되거나 abstract(애브스트랙트)로 정의 된 경우를 말하고, 인터페이스는 모든 메소드가 추상 메소드로만 이루어져 있는 것을 말합니다.
공통점은 사용하기 위해서는 하위클래스에서 확장 및 구형을 해야합니다.
차이점으로는 인터페이스의 경우 구현하는 모든 클래스에 대해 특정한 메소트가 반드시 존재하도록 강제성이 있고, 추상클래스의 경우 상속받는 클래스의 공통적인 로직을 추상화 시키고, 기능 확장을 위해 사용합니다.
💡싱글톤 패턴에 대해 설명해주세요.
싱글톤 패턴은 생성자의 호출이 반복적으로 이루어져도 실제로 생성되는 객체는 최초 생성된 객체를 반환 해주는 것입니다.
이는 메모리 낭비를 방지해주며, 다른 클래스 간의 데이터 공유가 쉽습니다.
하지만, 자원을 공유하기 때문에 테스트시 매번 인스턴스의 상태를 초기화 시켜줘야 합니다.
💡싱글톤 패턴의 대표적인 예시를 간단하게 설명해주세요.
싱글톤 패턴의 대표적인 예시는 Spring Bean 입니다.
스프링의 빈 등록 방식은 기본적으로 싱글톤 스코프이고, 스프링 컨테이너는 모든 빈들을 싱글톤으로 관리합니다.
💡가비지 컬렉션(Garbage Collection)에 대해 설명해주세요.
가비지 컬렉션은 jvm의 메모리 기법중 하나이며, 시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요없어진 메모리 영역을 회수하여 메모리를 관리해주는 기법입니다.
💡가비지 컬렉션 과정에 대해 설명해주세요.
작업을 수행하기 위해 jvm이 어플리케이션의 실행을 멈추고, 가비지컬렉션을 실행하는 쓰레드를 제외한 모든 쓰레드의 작업을 중단 후 사용하지 않는 메모리를 제거하고 작업이 재개 됩니다.
💡객체지향프로그래밍(OOP)에 대해 설명하세요
프로그래밍에서 필요한 데이터를 추상화시켜 행위(Method)와 상태(Attribute)를 가진 객체(Object)를 만들고, 그 객체들 간의 유기적인 상호 작용을 통해 로직을 구성하는 프로그래밍 기법입니다.
💡OOP의 4가지 특징에 대해 설명하세요
먼저, 캡슐화는 독립적으로 역할 수행하기 위해 필요한 데이터와 기능을 하나로 묶은 것이며,
상속은 상위 개념의 특징을 하위 개념이 물려받는 것이고,
추상화는 객체들의 공통적인 특징을 모아 하나의 클래스로 다루는 것이고,
다형성은 하나의 타입으로 여러가지 참조변수를 사용할 수 있는 것이다.
💡객체지향의 설계원칙(SOLID)에 대해 설명해주세요.
1.SRP(단일책임원칙): 모든 클래스는 각각 하나의 책임만 가져야한다.
2.OCP(개방폐쇄원칙): 기존 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되는 원칙
3.LSP(리스코프치환원칙): 부모클래스가 들어갈 자리에 자식클래스를 넣어도 역할 하는데 문제가 없어야한다.
4.ISP(인터페이스분리원칙): 최소한의 기능만 제공하면서, 하나의 역할에 집중하는 것이다.
5.DIP(의존관계역전원칙): 구체적인 클래스 보다 상위클래스, 인터페이스, 추상클래스와 같이 변하지 않을 가능성이 높은 클래스와 관계를 맺으라는 것이다.
💡자바의 메모리 영역에 대해 설명해주세요.
method, stack, heap으로 구분되며,
method는 전역변수와 스태택변수를 저장하며, method영역은 프로그램 시작부터 종료까지 남아있습니다.
stack은 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 메모리에 할당되고 종료되면 메모리가 해제됩니다.
heap은 new 키워드로 생성되는 객체, 배열 등이 저장되면, 가비지 컬랙션에 의해 메모리가 관리됩니다.
💡각 메모리 영역이 할당되는 시점은 언제인가요?
Method 영역 : JVM이 동작해서 클래스가 로딩될 때 생성
Stack 영역 : 컴파일 타임 시 할당
Heap 영역 : 런타임시 할당
💡클래스와 객체에 대해 설명해주세요.
클래스는 객체를 생성하는데 사용하고, 객체는 클래스 기반으로 생성 됩니다.
💡생성자(Constructor)에 대해 설명해주세요.
생성자는 클래스와 같은 이름의 메소트로 객체가 생성될 때 호출되는 메소드입니다.
💡 Wrapper Class란 무엇이며, Boxing과 UnBoxing은 무엇인지 설명해주세요.
기본 자료형(Primitive data type)에 대한 객체 표현을 Wrapper class라고 합니다.
기본 자료형 → Wrapper class로 변환하는 것을 Boxing이라 하며,
Wrapper class → 기본 자료형으로 변환하는 것을 UnBoxing이라 합니다.
💡Synchronized에 대해 아는 대로 말해주세요.
여러 개의 쓰레드가 한개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 쓰레드를 제외하고 나머지 쓰레드들은 데이터에 접근할 수 없게 막는 개념입니다.
멀티쓰레드 환경에서 쓰레드간 동기화를 시켜 데이터의 thread-safe를 보장합니다.
그러나 자주 사용하면 오히려 프로그램의 성능저하를 일으킬 수 있습니다.
💡new String()과 리터럴("")의 차이에 대해 설명해주세요.
new String()은 new 키워드로 새로운 객체를 생성하기 때문에 Heap 메모리 영역에 저장되고,
리터럴("")는 Heap 안에 있는 String Constant Pool 영역에 저장됩니다.
💡String, StringBuffer, StringBuilder의 차이를 설명해주세요.
String은 불변의 속성을 가지며, StringBuffer와 StringBuilder는 가변의 속성을 가집니다.
StringBuffer는 동기화를 지원하여 멀티 쓰레드 환경에서 주로 사용하며,
StringBuilder는 동기화를 지원하지 않아 싱글 쓰레드 환경에서 주로 사용합니다.
💡String 객체가 불변인 이유에 대해 아는대로 설명해주세요.
1. 특정 문자열 값을 재사용하는 빈도가 높을 수록 상당한 성능 향상을 기대할 수 있습니다.
2. 여러 쓰레드에서 동시에 특정 String 객체를 참조하더라도 안전합니다.
3. 해당 참조에 대한 문자열 값을 바꾸는 것이 불가능하기 때문에 보안에 유리하다.
💡 접근 제한자(Access Modifier)에 대해 설명해주세요.
변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 Java의 예약어를 의미하며,
public, protected, (default), private 가 존재합니다.
public - 접근 제한이 없다. (같은 프로젝트 내 어디서든 사용 가능)
protected - 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능하다.
(default) - 해당 패키지 내에서만 접근 가능
private - 해당 클래스에서만 접근 가능
💡클래스 멤버 변수 초기화 순서에 대해 설명해주세요.
먼저 static 변수 선언부는 클래스가 로드 될 때 제일 먼저 초기화 되고, 필드 변수 선언부는 객체가 생성될 때 생성자 block보다 앞서 초기화 됩니다.
마지막으로 생성자 블록은 객체가 생성될 때 jvm이 내부정으로 locking 합니다.
💡 static에 대해 설명해주세요.
static 키워드를 사용한 변수나 메소드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로 사용할 수 있습니다. 즉, 인스턴스(객체) 생성 없이 바로 사용 가능합니다.
모든 객체가 메모리를 공유한다는 특징이 있고, GC 관리 영역 밖에 있기 때문에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재하게 됩니다.
💡static을 사용하는 이유에 대해 설명해주세요.
자주 변하지 않는 값이나 공용자원에 대한 접근에 있어서 매번 로딩하거나 값을 읽어들이는 것보다 전역변수와 같은 개념을 통해 접근하는 것이 비용도 줄이고 효율을 높일수 있기 때문입니다.
💡Inner Class(내부 클래스)의 장점에 대해 설명해주세요
1.내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있다.
2.서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 캡슐화를 증가시키고, 코드의 복잡성을 낮출 수 있다.
3. 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 보안성을 높일 수 있다.
💡⭐리플렉션(Reflection)이란 무엇인지 설명해주세요.
구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API입니다. 코드 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야하는 경우 사용됩니다.
intelliJ의 자동완성 기능, 스프링의 어노테이션이 리플렉션을 이용한 기능
💡⭐Error와 Exception의 차이를 설명해주세요.
Error는 실행 중 일어날 수 있는 치명적 오류를 말합니다.
컴파일 시점에 체크할 수 없고, 오류가 발생하면 프로그램은 비정상 종료되지만,
Exception은 Error보다 비교적 경미한 오류이며, try-catch를 이용해 프로그램의 비정상 종료를 막을 수 있습니다.
💡CheckedException과 UnCheckedException의 차이를 설명해주세요.
CheckedException은 실행하기 전에 예측 가능한 예외를 말하고, 반드시 예외 처리를 해야 합니다. 대표적으로 IOException이 있습니다.
UncheckedException은 실행하고 난 후에 알 수 있는 예외를 말하고, 따로 예외처리를 하지 않아도 됩니다. 대표적으로 NullPointerException이 있습니다.
💡Optional API에 대해 설명해주세요.
NullPointerException을 피하려면 null여부 검사를 반드시 하게 되는데 java8부터는 Optional api 를 이용하여 null로 인한 예외가 발생하지 않도록하고 optional 클래스의 메소드를 통해 null을 컨트롤 할 수 있습니다.
💡⭐Collection Framework에 대해 설명해주세요.
다수의 데이터를 쉽고 효과적으로 관리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다. 자바 컬렉션에는 list, set, map, stack, quere가 존재 합니다.
💡⭐List, Set, Map, Stack, Queue의 특징에 대해 설명해주세요.
1.list는 순서가 있는 데이터의 집합이며, 데이터의 중복을 허용합니다.
2.set은 순서가 없는 데이터의 집합이며, 데이터의 중복을 허용하지 않습니다.
만약 순서를 보장하고 싶다면, linkedhashset을 사용합니다.
3.map은 키와 값이 한쌍을 이뤄져 있고, 키를 기준으로 중복을 허용하지 않으며, 순서가 없습니다.
만약 순서를 보장하고 싶다면, linkedhashmap를 사용합니다.
또한 key를 기준으로 정렬을 하고 싶다면, treemap를 사용합니다.
4.stack은 선형 자료 구조이며, FILO, LIFO이다.
5.queue는 선형 자료 구조이며, FIFO이다.
💡Array와 ArrayList의 차이점에 대해 설명하세요.
Array는 인덱스(Index)로 접근하고, ArrayList는 메서드를 통해 접근한다.
Array는 Object 뿐만 아니라 원시 타입(int, long, double 등)도 담을 수 있지만, ArrayList는 Object만 담을 수 있다.
그래서 정수를 ArrayList에 넣을 경우 Integer형은 가능하지만 int 형은 불가능하다.
💡⭐HashMap와 Hashtable의 차이점에 대해 설명하세요.
가장 큰 차이점은 동기화의 지원 여부입니다.
HashMap은 동기화를 지원하지 않으며, 단일 쓰레드 환경에서 사용하기 좋은 자료구조이고,
HashTable은 동기화를 지원하며, 멀티 쓰레드 환경에서 사용하기 좋은 자료구조이다.
HashMap은 null을 허용하지만 HashTable은 null을 허용하지 않는다.
속도는 멀티 쓰레드 환경이 아니라면 HashTable이 HashMap보다 느리다.
다른 스레드가 block되고 unblock되는 대기 시간을 기다리기 때문
💡Java는 멀티 스레드(Multi Thread) 환경인데 멀티 스레드에 대해 설명하세요.
하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미합니다.
💡멀티 스레드를 사용하는 이유가 무엇인가요?
각 쓰레드가 자신이 속한 프로세스의 메모리를 공유하므로, 시스템 자원의 낭비가 적습니다.
또한 하나의 쓰레드가 작업을 할 때 다른 쓰레드가 별도의 작업을 할 수 있어 사용자와의 응답성도 좋아집니다.
💡⭐Set과 Map의 타입이 Wrapper Class가 아닌 Object를 받을 때 중복 검사는 어떻게 할건지 설명해주세요.
hashCode()메소드를 오버라이팅하여 리턴된 해시코드값이 같은지 보고 해시코드 값이 다르다면 다른 객체로 판단하며, 값이 같으면 equals()메소드를 오버라이딩하여 다시 비교한다. 이 두 개 값이 모두 맞다면 중복 객체입니다.
💡Vector와 List의 차이를 설명해주세요.
벡터는 데이터 삽입시 원소를 밀어내지만 리스트는 노드를 연결만 하기 때문에, 삽입 삭제 부분에서 리스트가 시간복잡도의 우위를 가집니다.
벡터는 랜덤부분접근이 가능하지만 리스트는 더블링크드리스트(노드가 양쪽으로 연결)로 되어있기 때문에 랜덤 접근이 되지 않습니다. 검색적인 측면에서는 벡터가 우위에 있습니다.
💡⭐제네릭에 대해 설명해주시고, 왜 쓰는지 알려주세요.
제네릭은 데이터 타입을 하나로 지정하지 않고 사용할때마다 범용적이고 포괄적으로 지정한다는 의미입니다. 이를 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있어 에러를 사전에 방지할 수 있습니다.
💡final / finally / finalize 의 차이를 설명해주세요.
1.final은 클래스, 메소드, 변수, 인자를 선언할 때 사용할 수 있으며, 한 번만 할당하고 싶을 때 사용합니다.
2.finally는 try-catch와 함께 사용되며, try-catch가 종료될 때 finally block이 항상 수행되기 때문에 마무리 해줘야 하는 작업이 존재하는 경우에 해당하는 코드를 작성해주는 코드 블록입니다.
3.finalize는 Object클래스에 정의되어 있는 메소드이며, GC에 의해 호출되는 메소드로 절대 호출해서는 안되는 메소드입니다.
💡직렬화(Serialize)와 역직렬화에 대해 설명해주세요.
직렬화는 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 시스템에서도 사용할 수 있도록 바이트형태로 데이터 변환하는 기술입니다.
역직렬화는 직렬화된 바이트(Byte) 형태의 데이터를 다시 객체로 변환하는 과정입니다.
직렬화: JVM의 메모리에 상주(힙 or 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
💡SerialVersionUID를 선언해야 하는 이유에 대해 설명해주세요.
JVM은 직렬화와 역직렬화를 하는 시점의 클래스에 대한 버전 번호를 부여하는데, 만약 그 시점에 클래스의 정의가 바뀌어 있다면 새로운 버전 번호를 할당하게 됩니다.
그래서 직렬화할 때의 버전 번호와 역직렬화를 할 때의 버전 번호가 다르면 역직렬화가 불가능하게 될 수 있기 때문에 이런 문제를 해결하기 위해 SerialVersionUID를 사용합니다.
참고 자료 1) 신입 개발자 기술면접 질문 정리 - 자바
참고 자료 2) 신입 백엔드 개발자 기술 면접 핵심 정리 - Java