본문 바로가기
Programming/Test

[Java] 실무 면접 예상 질문 리스트 정리

by 돌방로그 2023. 4. 19.


질문 리스트

Q. Java 특징

Java는 OOP(Object Oriented Programming)의 약자로 객체 지향 프로그래밍 언어입니다.

객체 지향 프로그래밍이란 객체에 명령과 관계를 설정하여 상호 작용을 통해 동작하도록 구현하는 방식입니다.

이러한 특성으로 절차 지향 언어보다 가독성이 좋고 유지보수성이 높다는 특징이 있습니다.

 

Q. 객체지향 언어의 4가지 특성 (확인 필요)

OOP, 객체지향 언어의 4가지 특성으로 추상화, 캡슐화, 상속, 다형성이 있습니다.

추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 의미합니다. 대표적인 예시로 추상클래스와 인터페이스가 있습니다. 추상화를 통해 보다 유연하고 변경이 자유로운 프로그래밍을 할 수 있다는 특징이 있습니다.

캡슐화는 서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것을 의미합니다. 캡슐화를 위해 접근 제어 지시자를 사용합니다. 

상속은 기존의 구현한 클래스를 재활용하여 새로운 클래스를 구현하는 것을 의미합니다. 재사용을 하기 때문에 반복적인 코드 사용을 줄일 수 있습니다.

다형성은 어떤 객체의 속성이나 기능이 상황에 따라서 여러가지 형태를 띄우는 성질을 의미합니다. 다형성을 통해 결합도를 낮출 수 있다는 특징이 있습니다.

 

Q. 추상클래스(Abstract Class)와 인터페이스(Interface) (확인 필요)

추상 클래스와 인터페이스는 객체지향 언어의 특성 중 추상화와 밀접한 관련이 있는 예시 중 하나입니다.

우선 추상 클래스와 인터페이스는 추상 메소드가 하나 이상있고, 인스턴스화 할 수 없다는 공통점이 있습니다.

이와 반면에 추상 클래스와 인터페이스의 차이는 다음과 같습니다.

추상 클래스는 기능을 확장하는 의미로 부모 클래스에 대해 자식 클래스에서 기능을 구체화하는 개념입니다.

예를 들어 Animal 객체를 추상 클래스로 사용하고 Tiger, Cat 객체에서 기능을 구체화하는 것과 같은 개념입니다.

인터페이스는 인터페이스에 정의한 메소드를 각 클래스에 목적에 맞춰 구현하는 개념입니다.

예를 들어 Tiger와 Cat 객체에서 각 객체의 목적에 맞춰 Eatable이라는 인터페이스 메소드를 구현하는 것을 의미합니다.

 

Q. 오버라이딩과 오버로딩

오버라이딩과 오버로딩은 객체지향 언어의 특성 중 다형성과 밀접한 관련이 있는 예시 중 하나입니다.

오버라이딩은 상속 관계에 있는 부모와 자식 클래스에서 부모 클래스에 정의된 함수를 자식 클래스에 재정의하는 것을 의미합니다. 

오버로딩은 동일한 함수명으로 매개변수의 종류와 갯수를 달리하여 구현하는 방식을 의미합니다..

 

Q. Java 메모리 영역

Java의 메모리 영역은 Stack 영역, Heap 영역, Static 영역으로 크게 3가지로 분류됩니다.

Stack 영역에서는 임시 변수나 동적 할당된 변수의 주소를 저장하는 영역으로 메소드가 종료되면 저장된 정보도 pop()된다는 특성이 있습니다.

Heap 영역에서는 동적 할당된 변수가 저장되며, Garbage Collection을 통해 메모리가 자동으로 관리됩니다.

Static 영역은 Method 영역이라고도 불리며, 메소드 혹은 클래스, 전역 변수, Static 변수 등이 저장되는 곳입니다. 

JVM이 종료될 때까지 해당 정보들은 유효합니다.

 

Q. JVM 특징

 JVM은 Java Virtual Machine의 약어로 자바로 구현된 프로그램을 OS에 관계없이 구동할 수 있도록 한다는 점이 가장 대표적인 특징입니다. 이 외에도 GC(Garbage Collection)을 통해 메모리를 자동으로 관리한다는 특징도 지니고 있습니다.

JVM에서 Java로 구현된 파일을 OS에 관계없이 동작시키는 방법은 Java 파일을 컴파일하여 bytecode 형태의 class 파일로 만듭니다. 해당 파일을 JVM에서 기계어로 번역하여 OS에 관계없이 구동할 수 있도록 합니다.

 

Q. JDBC

JDBC는 Java DB Connection으로 자바 언어로 DB와 연결, 사용하기 위해 제공되는 API를 의미합니다.

 

Q. 불변 객체(Immutable Object)

Immutable Object란 객체가 정의 및 생성되고 난 후 상태가 변하지 않는 객체입니다.

원시 타입의 변수인 경우 final 키워드를 통해 불변 객체로 정의할 수 있습니다.

 

Q. Boxing / Unboxing

Boxing이란 Java에서 원시 타입의 자료형을 Wrapper Class의 자료형으로 변환하는 작업을 의미합니다.

예를 들어 int를 Integer로 변환하는 것이 Boxing을 의미하는 과정입니다.

Unboxing이란 Boxing과는 반대로 Wrapper Class를 원시 타입의 자료형으로 변환하는 작업을 의미합니다.

 

Q. GC(Garbage Collection)

Garbage Collection이란 전체 시스템에서 동적 할당된 메모리에 한해 현재 사용되지 않고 있는 것을 재사용하기 위해 회수하는 것을 의미합니다.

 

Q. 직렬화 / 역직렬화 (확인 필요)

직렬화란 Java에서 구현한 객체를 출력 데이터로 사용하기 위해 객체를 stream을 통해 byte 형태로 변환하는 것을 의미합니다.

역직렬화란 직렬화와 반대로 입력 데이터를 객체로 변환하는 것을 의미합니다. 

 

Q. SerialVersionUID (확인 필요)

직렬화와 역직렬화를 하면서 동일한 클래스로 매핑하기 위해 관리되어야 하는 Version Unique ID입니다.

 

Q. String, StringBuffer, StringBuilder 차이

우선 String은 불변이고 그 외 StringBuffer, StringBuilder는 가변이라는 것이 가장 큰 차이점입니다.

String은 불변이기 때문에 Thread-Safe하다는 특징이 있습니다.

StringBuffer 또한 가변이지만 Thread-Safe하다는 특징이 있는데, 메소드 별로 Synchronized 키워드를 사용하고 있기 때문에 동기화가 보장되기 때문에 Thread-Safe할 수 있습니다.

StringBuilder는 가변이면서 Thread-Safe하지 않기 때문에 Thread-Safe를 고려하지 않는 상황에서 사용할 때는 String과 StringBuffer에 비해서 성능이 매우 좋다는 것이 장점입니다.

 

Q. 싱글톤 패턴

싱글톤 패턴은 전체 시스템에서 하나의 클래스당 하나의 인스턴스만 지니도록 하는 개발 방법입니다.

그렇기 때문에 멀티 쓰레드 환경에서 Thread-Safe하게 관리하도록 구현하는 것이 필수적이며 Thread-Safe하게 구현하는 방법은 크게 3가지가 있습니다.

첫 째, Synchronized 키워드를 사용합니다.

둘 째, static 변수 선언시 생성까지 함께 진행합니다.

셋 째, DCL(Double Check Locking)로 첫 째 방법에서 나아가 한 번 더 검증하여 생성하는 방법입니다.

 

Q. 데드락 정의 및 해결 방법

데드락이란 프로세스가 자원이 없어서 다음 절차를 진행하지 못하고 교착 상태, 무한 대기 상태에 빠진 것을 말합니다.

이러한 데드락을 해결 및 예방하기 위해서는 크게 2가지 방법을 사용합니다.

첫 째, 우선순위를 선정하여 자원을 선점할 수 있도록 합니다.

둘 째, 공유 불가능한 상호 배제 조건, 원칙을 제거하여 예방합니다.

 

Q. 해쉬 충돌 해결 방법

해쉬는 해쉬 함수와 해쉬 테이블/맵으로 이루어져 있으며 입력은 무한하지만 출력은 유한하다는 특성이 있습니다.

그렇기 때문에 해쉬 기능을 사용하는 경우 해쉬 충돌은 피할 수 없기 때문에 미리 예방 및 해결 방법을 알고 있는 것이 중요합니다.

해쉬 충돌을 해결하기 위해서는 크게 2가지 방법이 있습니다.

첫 째, 체이닝 기법을 사용합니다.

체이닝 기법이란 충돌된 해쉬 테이블의 키에 대해서 링크드 리스트로 연결하여 데이터를 저장하도록 하는 방식입니다.

해당 방식을 사용하는 경우 추가적인 저장 공간을 요구할 수 있지만 복잡한 수식 연산을 할 필요가 없어 편리합니다.

둘 째, 오픈 어드레싱 기법을 사용합니다.

오픈 어드레싱 기법에는 크게 2가지가 있는데, 가장 간편한 방법으로는 이중 해쉬 함수를 적용하는 것입니다.

그 외 방법으로는 탐색 기법이라 하여 충돌된 키의 1번째, N번째 전/후 비어있는 키에 할당하는 방식을 의미합니다.

 

(추가중)

 


References

 

댓글