면접 준비
[면접 준비] 신입 개발자 기술면접 질문 정리 (자바)
펭귄코기
2023. 1. 18. 23:37
Q. 자바의 특징을 설명해보세요
- 자바는 객체지향 프로그래밍 언어이며 기본 자료형을 제외한 모든 요소들이 객체로 표현되고 객체 지향 개념의 특징인 캡슐화, 추상화, 상속, 다형성이 잘 적용된 언어입니다
- 장점으로는 JVM 위에서 동작해 운영체제에 독립적이며 가비지 컬렉션을 통해 메모리를 자동으로 관리합니다
- 단점으로는 JVM 위에서 동작하기에 실행 속도가 다른 언어에 비해 상대적으로 느리고 다중 상속이나 타입에 엄격해 제약이 많이 따릅니다
Q. JVM의 역할은 무엇인가요?
- JVM은 스택기반으로 동작하며 자바 바이트 코드를 OS에 맞게 해석해주는 역할을 하며 가비지 컬렉션을 통해 자동적으로 메모리를 관리해 줍니다
- 한마디로 정의해보자면 OS에 종속받지 않고 CPU가 자바를 인식하고 실행할 수 있게 해주는 가상 컴퓨터입니다
한번 쓴 것은 어디서든지 읽혀야한다 라는 철학으로 만들어진 자바이다 컴파일된 뒤 바이트코드로 변형된 자바를 어느 OS든 사용할 수 있게 하기 위해 JVM이 필요하다고 생각합니다
일반 프로그램들은 OS에 종속되어있어 OS가 바뀌면 그 OS에 적용하기 위해 많은 노력이 필요한데
자바 프로그램은 JVM이라는 가상 컴퓨터를 중간에 끼워 사용하기에 JVM만 OS에 맞춰 바꿔주면 자바 소스코드를 컴파일러가 JVM이 인식할 수 있는 자바 바이트 코드로 변환해서 넘겨주고 이를 JVM에서 바이너리 코드로 바꿔 OS가 이해할 수 있게 해석해줍니다
Q. 자바에서 컴파일 하는 과정을 설명해주세요
1. 개발자가 .java 파일을 생성해낸다
2. 빌드를 한다
3. 자바 컴파일러가 javac의 명령어를 통해 바이트 코드를 생성해 낸다 (.class)
4. 클래스 로더를 통해 JVM 메모리 내에 로드한다
5. 실행엔진을 통해 컴퓨터가 알아듣는 기계어로 해석된다
Q. 자바에서 제공하는 기본 타입은 무엇인가요?
-정수형으로 byte, short, int, long 상수형으로 float, double 문자형 char 논리형 boolean이 있습니다
- 각각 바이트는 정수형 1, 2, 4, 8 상수형 4, 8 문자형 2, 논리형 1 바이트 입니다
Q. 오버라이딩과 오버로딩에 대해 설명해주세요
- 오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의 해서 사용하는 기술입니다
- 오버로딩은 같은 이름의 메서드를 매개변수의 유형과 개수를 다르게 해서 여러개 가지는 기술입니다
Q. 어노테이션이란 무엇이고 구체적으로 어떤 것이 있는지 말해주세요
- 사전적 의미로는 주석을 뜻 합니다 즉 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있습니다
예를 들어 컴파일러에게 문법상 에러를 체크 하도록 정보를 제공하고 특정 역할을 수행하게 지정할 수 있습니다
대표적으로는 @override 어노테이션을 들 수 있습니다
Q. JVM의 스택과 힙메모리 영역에 대해 아는만큼 설명해주세요
- 스택은 자바 프로그램이 컴파일 되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역입니다 각종 형태의 변수나 스레드나 메서드의 정보를 저장합니다
힙메모리는 객체를 저장하는 공간으로서 new 연산자로 생성되는 객체와 배열을 저장합니다
Q. JVM의 구조를 설명해주세요
- JVM의 구조는 클래스 로더(Class Loader), 실행 엔진(Execution engine), 실행 데이터 영역(Runtime Data Area), 가비지 컬렉터 (Garbage Collector)등으로 이루어져 있습니다
- 클래스로더는 동적으로 클래스를 로딩해주는 역할을 하는데 class파일을 묶어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재합니다
- 실행엔진은 클래스 로더에 의해 실행 데이터 영역의 Method Area에 배치됩니다 그리고 배치된 바이트코드를 실행하는 역할을 합니다
- 가비지컬렉터는 더는 사용하지 않는 메모리를 자동으로 회수해줍니다 heap메모리 영역에 생성된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거하는 역할을 하며 해당 역할을 하는 시간은 정확히 언제인지 모릅니다
가비지컬렉터 역할을 하는 스레드를 제외한 나머지 모든 스레드들은 일시정지 상태가 됩니다
- 실행 데이터 영역은 메서드영역, 힙영역, 스태경역, 네이티브메서드 스택영역으로 구성되어있습니다
Q. 클래스와 인스턴스의 차이에 대해 설명 해주세요
- 클래스는 변수와 메서드의 집합인 일종의 설계도와 같다고 볼 수 있습니다
- 인스턴스는 이런 클래스를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체라고 볼 수 있습니다
Q. 가비지 컬렉터의 역할과 원리를 설명해주세요
- 가비지 컬렉터는 JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리를 주기적으로 삭제하는 프로세스를 말합니다
이는 순회를 통해 메모리가 어떤 객체를 참조하고 있는지 마킹하고, 참조하고 있지 않은 메모리들을 제거하는 방식을 진행됩니다
이러한 과정을 Mark And Sweep 알고리즘이라고 부릅니다
Q. 객체지향 프로그램이란 무엇인가요?
- 프로그래밍에서 필요한 데이터를 추상화 시켜 (클래스로)
상태(변수) 와 행위(메서드)를 가진 객체(인스턴스 화)를 만들고
그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다
Q. 객체지향이 지향하는 바는 무엇인가요?
- 쉽게 정의하면 객체지향은 의존성 관리라고 말할 수 있습니다
객체지향으로 의존성을 관리함으로써 변경 영향을 최소화하고 객체마다 독립적인 개발이 가능해집니다
이로인해 유지보수성과 확장성을 가질 수 있습니다
Q. 객체지향 프로그램의 장점과 단점은 무엇인가요?
- 장점
코드 재사용이 용이하다 (상속을 통해 확장하거나 클래스 이용)
유지보수가 좋다 (클래스 내부의 변수, 메서드를 수정하면되기에)
대형 프로젝트에 적합하다 (API별로 나눠서 업무 분담이 쉽기 때문에)
- 단점
처리 속도가 상대적으로 느리다
설계시 많은 시간과 노력이 필요하다
객체가 많으면 용량이 커질 수 있다
Q. 객체 지향 프로그래밍 4대 특징은 무엇인가요?
- 캡슐화
데이터와 코드의 형태를 외부로부터 알 수 없게 하고 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 것이다
- 추상화
공통의 속성이나 기능을 묶어 이름을 붙이는 것이다
객체지향 관점에서 클래스를 정의하는 것이다
- 상속화
부모 클래스에 정의된 변수 및 메서드를 자식 클래스에서 상속받아 사용하는 것이다
- 다형성
다양한 형태로 표현이 가능한 구조를 말한다
오버로딩, 오버라이딩을 예로 들 수 있다
Q. 객체지향 프로그래밍 5대 원칙은 무엇인가요?
1) 단일 책임 원칙
한 클래스는 하나의 책임만 가져야한다
ex) 사람 클래스는 사람의 역할만 충실히 한다
2) 개방 폐쇄 원칙
확장에는 열려있고 변경에는 닫혀 있어야 한다
ex) 기능을 더 추가는 할 수 있어도 바꾸는건 함부로 못한다
3) 리스코프 치환 원칙
상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 작동해야 한다
ex) 어떤 메서드에 Item 이라는 상위 타입으로 받고 있는데 apple 이라는 하위 타입으로 바뀌어 넘어와도 동작해야한다
4) 인터페이스 분리 원칙
인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야한다
ex) 3명의 클라이언트가 하나의 인터페이스를 상속받기보다 각 클라이언트 별로 인터페이스를 분리해야한다
5) 의존 역전 원칙
추상화에 의존해야 하고 구체화에 의존하면 안된다
ex) 자동차가 스노우 타이어(구체화)에 의존하는게 아니라 타이어(추상화)에 의존해야하는 것이다
Q. getter와 setter를 사용하는 이유는 무엇인가요?
- 객체의 무결성을 보장하기 위해 사용합니다
무결성은 데이터의 정확성과 일관성을 유지하고 보증하는 것입니다
정확성은 중복이나 누락이 없는 상태이고 일관성은 원인과 결과의 의미가 연속적으로 보장되어 변하지 않는 상태입니다
getter는 필드의 값을 숨긴채 값을 꺼낼 수있고 setter는 필드를 private로 만들어 외부 접근을 제한하고
setter로 값을 받아 가공해 넣을 수 있습니다
그러나 무분별한 setter는 무결성을 해칠 수 있기에 사용하지 말아야합니다
builder 패턴이나 개방폐쇄원칙으로 처리해야합니다
Q. Error와 Exception의 차이를 설명하세요
- Error는 실행 중 일어날 수 있는 치명적 오류를 말합니다
컴파일 시점에 체크할 수 없고 오류가 발생하면 프로그램은 비정상 종료되며 예측 불가능한 UncheckedException에 속합니다
반면, Exception은 Error보다 비교적 경미한 오류이며, try-catch를 이용해 프로그램의 비정상 종료를 막을 수 있습니다
Q. HashMap과 HashTable의 차이를 설명하세요
- 두가지 모두 key - value 형태이고 key는 중복될 수 없고, value는 중복될 수 있다는 특징이 있습니다
HashMap은 동기화를 지원하지 않아 싱글스레드에 적합하고
HashTable은 동기화를 지원해 멀티스레드에 적합 합니다
하지만 HashTable은 컬렉션프레임워크가 나오기 이전부터 존재한 구형 버전이라
HashMap에 비해 느리기에 멀티쓰레드에는 ConcurrentHashMap을 사용하는 것이 더 좋은 방법이라 알고있습니다
이외의 차이로는 HashMap은 key에 null을 허용하지만 HashTable의 경우 key에 null을 허용하지 않습니다
Q. String, StringBuffer, StringBuilder의 차이를 설명하세요
- String은 불변의 속성을 가지며, StringBuffer와 StringBuilder는 가변의 속성을 가집니다
StringBuffer는 동기화를 지원하여 멀티 쓰레드 환경에서 주로 사용하며
StringBuilder는 동기화를 지원하지 않아 싱글 쓰레드 환경에서 주로 사용합니다
Q. 쓰레드 동기화(synchronize)란 무엇인가요?
- 쓰레드 동기화란 여러 쓰레드가 동일한 리소스를 공유하여 사용하게 되면 서로의 결과에 영향을 주기 때문에 방지하는 기법입니다
즉 여러 개의 쓰레드가 한 개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 쓰레드를 제외하고 나머지 쓰레드들은 데이터에 접근할 수 없게 막는 개념입니다
동기화 기법으로는 아래와 같이 있습니다
임계영역 : 공유 리소스에 대해 오직 하나의 스레드 접근만 허용한다 (한 프로세스에 속한 스레드에만 사용 가능)
뮤텍스 : 공유 리소스에 대해 오직 하나의 스레드 접근만 허용 (서로 다른 프로세스에 속한 스레드에도 사용 가능))
이벤트 : 특정 사건 발생을 다른 스레드에게 알림
세마포어 : 한정된 개수의 자원을 여러 스레드가 사용하려고 할 때 접근을 제한한다
대기 가능 타이머 : 특정 시간이 되면 대기 중인 스레드를 깨운다
Q. 제네릭이란 무엇인가요?
- 제네릭은 데이터의 타입을 하나로 지정하지 않고 사용할 때마다 범용적이고 포괄적으로 지정한다는 의미입니다
제네릭 타입을 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있어 에러를 사전에 방지할 수 있습니다
Q. 람다는 무엇인가요?
- 간단히 말해 메소드를 하나의 식으로 표현한 것입니다
메소드의 이름이 필요 없기 때문에, 람다식은 익명 함수(Anonymous Function)의 한 종류라고 볼 수 있습니다
불필요한 코드를 줄이고, 가독성을 높이기 위함으로 말씀드릴 수 있습니다
Q. 접근제한자는 무엇인가요?
- 변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 Java의 예약어를 의미하며, 총 4 가지 종류가 있습니다
public - 접근 제한이 없다. (같은 프로젝트 내 어디서든 사용 가능)
protected - 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능하다
(default) - 해당 패키지 내에서만 접근 가능
private - 해당 클래스에서만 접근 가능
Q. 불변 객체가 무엇인가요? 자바의 예시를 들어주세요
- 불변 객체란 객체 생성 이후 내부의 상태가 변하지 않는 객체입니다
자바에서는 final을 사용해서 만들 수 있습니다
Q. 싱글톤 패턴에 대해 설명해주세요
- 싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴입니다
인스턴스가 1개만 존재해야 한다는 것을 보장하고 싶을때와
동일한 인스턴스를 자주 생성해야 하는 경우에 주로 사용합니다
이로인해 메모리의 낭비를 방지하게 됩니다
Q. 싱글톤 패턴의 대표적인 예시를 설명해주세요
- 대표적으로 스프링의 Bean입니다
스프링의 빈 등록 방식이 기본적으로 싱글톤 입니다
스프링 컨테이너는 모든 빈들을 싱글톤으로 관리합니다
Q. 자바의 메모리 영역에 대해 설명해주세요
- 자바의 메모리 공간은 크게 Method 영역, Stack 영역, Heap 영역으로 구분되고, 데이터 타입에 따라 할당됩니다
- 메소드(Method) 영역 : 전역변수와 static변수를 저장하며, Method영역은 프로그램의 시작부터 종료까지 메모리에 남아있습니다
- 스택(Stack) 영역 : 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다. LIFO(Last In First Out) 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다
- 힙(Heap) 영역 : new 키워드로 생성되는 객체(인스턴스), 배열 등이 Heap 영역에 저장되며, 가비지 컬렉션에 의해 메모리가 관리되어 진다
Q. 각 메모리 영역이 할당되는 시점은 언제인가요?
- Method 영역 : JVM이 동작해서 클래스가 로딩될 때 생성
- Stack 영역 : 컴파일 타임 시 할당
- Heap 영역 : 런타임시 할당
컴파일 타임 : 소스코드가 기계어로 변환되어 실행가능한 프로그램이 되는 과정
런타임 : 컴파일 타임 이후 프로그램이 실행되는 때
Q. 생성자(Constructor)에 대해 설명해주세요
- 생성자는 클래스와 같은 이름의 메소드로, 객체가 생성될 때 호출되는 메소드입니다
- 명시적으로 생성자를 만들지 않아도 default로 만들어지며, 생성자는 파라미터를 다르게하여 오버로딩할 수 있습니다
Q. wrapper class란 무엇인가요?
- 기본자료형에 대한 객체표현을 래퍼클래스 라고 합니다
- 기본 자료형 -> 래퍼클래스로 변환하는 것을 boxing이라고 하며
- 래퍼클래스 -> 기본 자료형 으로 변환하는 것을 unboxing이라고 합니다
Q. new String()과 리터럴 "" 의 차이에 대해 설명해주세요
- new String()은 new 키워드로 새로운 객체를 생성하기 때문에 Heap 메모리 영역에 저장되고
- ""는 Heap 안에 있는 String Constant Pool 영역에 저장됩니다
Q. static에 대해 설명해주세요
- static 키워드를 사용한 변수나 메소드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로 사용할 수 있습니다. 즉, 인스턴스(객체) 생성 없이 바로 사용 가능합니다
- 모든 객체가 메모리를 공유한다는 특징이 있고, GC 관리 영역 밖에 있기 때문에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재하게 됩니다
Q. static을 사용하는 이유는 무엇인가요?
- static은 자주 변하지 않는 값이나 공통으로 사용되는 값 같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어들이는 것보다 일종의 '전역변수'와 같은 개념을 통해 접근하는 것이 비용도 줄이고 효율을 높일 수 있습니다
- 인스턴스 생성 없이 바로 사용 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용합니다
Q. CheckedException과 UnCheckedException의 차이를 설명해주세요
- CheckedException은 실행하기 전에 예측 가능한 예외를 말하고, 반드시 예외 처리를 해야 합니다
- UncheckedException은 실행하고 난 후에 알 수 있는 예외를 말하고, 따로 예외처리를 하지 않아도 됩니다
Q. 컬렉션 프레임워크에대해 설명해주세요
- 다수의 데이터를 쉽고 효과적으로 관리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다
Q. final / finally / finalize의 차이를 설명해주세요
- final은 클래스, 메소드, 변수, 인자를 선언할 때 사용할 수 있으며, 한 번만 할당하고 싶을 때 사용합니다
- finally는 try-catch와 함께 사용되며, try-catch가 종료될 때 finally block이 항상 수행되기 때문에 마무리 해줘야 하는 작업이 존재하는 경우에 해당하는 코드를 작성해주는 코드 블록입니다
- finalize는 Object 클래스에 정의되어 있는 메소드이며, GC에 의해 호출되는 메소드로 절대 호출해서는 안되는 메소드입니다