Java 면접질문 공부

Java에 대해 설명해주세요.

Java는 객체지향 프로그래밍 언어이며, 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어입니다. JVM위에서 동작하기 때문에 운영체제에 독립적이며 GC를 통한 자동적인 메모리 관리가 가능합니다. 그러나, JVM 위에서 동작하기 때문에 상대적으로 실행속도가 느리며 다중상속이나 타입에 엄격하고 제약이 많다는 단점이 있습니다.

 

오버로딩과 오버 라이딩에 대하여 설명해주세요

오버라이딩(Overriding)은 상위 클래스에 있는 메소드를 하위 클래스에서 재정의하는 것을 말하고,

오버로딩(Overloading)은 매개변수의 개수나 타입을 다르게 하여 같은 이름의 메소드를 여러개 정의하는 것을 말합니다.

 

객체지향 프로그래밍이 뭔가요?

현실세계의 사물과 같은 객체를 만들고 그 객체에서 필요한 특징을 뽑아서 프로그래밍을 수행하는 것입니다.

객체지향 프로그래밍은 캡슐화,상속,추상화, 다형성 총 4가지 특성이 있습니다.

 

추상클래스와 인터페이스의 차이점이 뭐예요?

추상클래스는 abstract로 지시자로 정의되며 추상메소드가 하나이상 포함된 것이고

인터페이스는 interface로 지시자로 정의되며 모든 메소드가 추상메소드로 정의됩니다.

추상메소드와 인터페이스의 차이는 목적성에 있습니다.

추상클래스는 상속받아 기능을 재활용하고 확장시키는데 목적이 있고,

인터페이스는 함수의 구현을 강제해서 구현한 객체들이 같은 동작을 하는 것에 보장하는것에 목적이 있습니다.

 

JVM이 뭔가요?

JVM은 스택 기반으로 동작하며, Java Byte Code 를 OS에 맞게 해석 해주는 역할을 하고 가비지 컬렉션을 통해 자동적인 메모리 관리를 해줍니다.

 

가비지 컬렉션(G.C)이 뭐예요?

GC는 JVM에서 메모리를 관리해주는 모듈입니다. Heap 메모리를 재활용하기 위해서 더이상 참조되지 않는 객체들을 메모리에서 제거하는 모듈입니다.

개발자가 직접 메모리를 정리하지 않아도 되어서 개발 속도가 향상된다는 장점이 있지만, Mark and sweep 이라는 과정에서 참조되지 않는 객체를 찾는 과정이 있는데, 이때 스레드가 잠깐 중단되어 성능이 떨어지는것이 단점입니다.

 

가비지 컬렉션 과정에 대해 설명해주세요.

GC의 작업을 수행하기 위해 JVM이 어플리케이션의 실행을 잠시 멈추고, GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업을 중단 후 사용하지 않는 메모리를 제거하고 작업이 재개됩니다.

 

자바 어플리케이션 실행 과정을 설명해보세요.

컴파일러가 자바소스를 바이트코드로 변환 후 Class Loader가 바이트 코드 런타임 데이터 영역에 로드시킵니다.

그 후 로딩된 바이트 코드가 실행엔진에 의해서 실행되게 됩니다.

 

자바 메모리 구조가 어떻게 되나요?

자바 메모리 구조는 크게 5가지 영역으로 구분되며 스레드와 스레드 공통으로 나뉩니다.

스레드마다 PC Register, JVM stack, Native Method stack이 있으며, 스레드 공통으로는 Heap과 Method Area가 있습니다.

더보기
  • PC Register : 현재 수행중인 JVM 명령어가 저장
  • JVM stack : 호출된 메소드의 매개변수, 지역변수, 리턴정보들이 저장
  • Native Method stack : 자바 외의 언어인 C나 C++ 같은 것들을 수행하기 위한 영역
  • Method Area : 클래스별로 전역변수, 정적변수, 메소드 정보들이 저장
  • Heap : 런타임중 생성되는 객체들이 동적으로 할당되는 곳

 

Java에서 제공하는 원시 타입들에 무엇이 있고, 각각 몇 바이트를 차지하나요?

원시타입에는 정수형,실수형,문자형, 논리형으로 분류되어있으며

정수형에는 1바이트인 byte ,2바이트인 short, 4바이트인 int, 8바이트인 long이 있습니다.

그리고 실수형에는 4바이트인 float, 8바이트인 double이 있으며

문자형에는 2바이트인 char이 있습니다. 마지막으로, 논리형에는 1바이트인 boolean이 있습니다.

더보기

정수형 byte(1), short(2), int(4), long (8)

실수형 float(4), double(8)

문자형 char (2)

논리형 boolean(1)

try-with-resources에 대해 설명해주세요.

try-catch-finally의 문제점을 보완하기 위해 나온 개념으로, try(...)안에 자원 객체를 전달하면,

try 블록이 끝나고 자동으로 자원해제 해주는 기능을 말합니다. 따로 finally 구문이나 모든 catch 구문에 종료 처리를 하지 않아도 되는 장점이 있습니다.

 

불변 객체가 무엇인지 설명하고 대표적인 Java의 예시를 설명해주세요.

 불변 객체는 객체 생성 이후 내부의 상태가 변하지 않는 객체를 말합니다.

Java에서는 필드가 원시 타입인 경우 final 키워드를 사용해 불변 객체를 만들 수 있고, 참조타입일 경우엔 추가적인 작업이 필요합니다.

 

참조 타입일 경우 추가적인 작업은 어떤게 있는지 설명해주세요.

객체를 참조할 수도있고 배열이나 List 등을 참조할 수 있습니다.

 

불변 객체나 final을 굳이 사용해야 하는 이유가 있을까요?

Tread-Safe하여 병렬 프로그래밍에 유용하며, 동기화를 고려하지 않아도 되고, 실패원자적인 메소드를 만들 수 있습니다.

또한, 부수효과를 피해 오류를 최소화 할 수 있으며  메소드 호출 시 파라미터 값이 변하지 않는다는 것을 보장하고 가비지 컬렉션 성능을 높일 수 있습니다.

 

싱글톤 패턴에 대해 설명해주세요.

 싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴입니다.

인스턴스가 1개만 존재해야 한다는 것을 보장하고 싶은 경우와 동일한 인스턴스를 자주 생성해야 하는 경우에 주로 사용합니다. (메모리 낭비 방지)

 

접근 제한자(Access Modifier)에 대해 설명해주세요.

 변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 Java의 예약어를 의미하며, public,protected,default,private 총 4가지 종류가 있습니다.

더보기
  • public - 접근 제한이 없다. (같은 프로젝트 내 어디서든 사용 가능)
  • protected - 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능하다.
  • (default) - 해당 패키지 내에서만 접근 가능
  • private - 해당 클래스에서만 접근 가능

클래스 멤버 변수 초기화 순서에 대해 설명해주세요.

static 변수 선언부는 클래스가 로드 될 때 변수가 제일 먼저 초기화되며

필드 변수 선언부는 객체가 생성될 때 생성자 block 보다 앞서 초기화 됩니다.

생성자 block은 객체가 생성될 때 JVM이 내부적으로 locking(thread-safe영역)됩니다.

 

static에 대해 설명해주세요.

static 키워드를 사용한 변수나 메소드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로 사용할 수 있습니다. 즉, 인스턴스(객체)생성 없이 바로 사용 가능합니다.

모든 객체가 메모리를 공유한다는 특징이 있고, GC 관리 영역밖에 있기 때문에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재하게 됩니다.

 

static을 사용하는 이유에 대해 설명해주세요.

static은 자주 변하지 않는 값이나 공통으로 사용되는 값 같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어들이는 것보다 일종의 '전역변수'와 같은 개념을 통해 접근하는 것이 비용도 줄이고 효율을 높일 수 있습니다.

인스턴스 생성 없이 바로 사용가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용합니다.

 

Error와 Exception의 차이를 설명해주세요.

Error는 실행 중 일어날 수 있는 치명적 오류로, 컴파일 시점에 체크할 수 없고 오류가 발생하면 프로그램은 비정상 종료됩니다. 반면 Exception은 Error보다 비교적 경미한 오류이며, try-catch를 이용해 프로그램의 비정상 종료를 막을 수 있습니다.

List, Set, Map, Stack, Queue의 특징에 대해 설명해주세요.

List는 순서가 있는 데이터의 집합이며, 데이터의 중복을 허용합니다.

Set은 순서가 없는 데이터의 집합이며, 데이터의 중복을 허용하지 습니다.

Map은 키와 값이 한 쌍으로 이뤄져있고, 키를 기준으로 중복을 허용하지 않으며, 순서가 없습니다.

Stack 객체는 직접 new 키워드로 사용할 수 있으며 Queue인터페이스는 LinkedList에 new 키워드를 적용해 사용할 수 있습니다. 

 

제네릭에 대해 설명해주시고, 왜 쓰는지 알려주세요.

제네릭은 데이터의 타입을 하나로 지정하지 않고 사용할 때마다 범용적이고 포괄적으로 지정한다는 의미입니다.

제네릭 타입을 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있어 에러를 사전에 방지 할 수 있습니다.

 

final / finally / finalize 의 차이를 설명해주세요.

final은 클래스, 메소드, 변수, 인자를 선언할 때 사용할 수 있으며, 한번만 할당하고 싶을 때 사용합니다.

finally는 try-catch와 함께 사용되며, try- catch가 종료될 때 finally block이 항상 수행되기 때문에 마무리 해줘야 하는 작업이 존재하는 경우에 해당되는 코드를 작성해주는 코드블록입니다.

마지막으로, finalize는 Object 클래스에 정의되어있는 메소드이며, GC에 의해 호출되는 메소드로 절대 호출해서는 안되는 메소드입니다.

 

직렬화(Serialize)에 대해 설명해주세요.

시스템 내부에서 사용되는 객체 또는 데이터를 외부의 시스템에서도 사용할 수 있도록 바이트 형태로 데이터 변환하는 기술이며, 반대로 직렬화된 바이트 형태의 데이터를 다시 객체로 변환하는 과정을 '역직렬화'라고 합니다.

> JVM의 메모리에 상주되어있는 객체 데이터를 바이트 형태로 변환하는 기술

 

new String()과 리터럴("")의 차이에 대해 설명해주세요.

new String()은 new 키워드로 새로운 객체를 생성하기 때문에 Heap 메모리 영역에 저장되고,

""는 Heap 안에 있는 String Constant Pool 영역에 저장됩니다.

 

String 객체가 불변인 이유에 대해 아는대로 설명해주세요.

캐싱 기능에 의한 메모리 절약과 속도향상, thread-safe,보안기능 이 3가지로 알고있습니다.

 

객체지향의 설계원칙에 대해 설명해주세요.

SRP,OCP,LSP,ISP,DIP 총 5가지 설계원칙이 있으며,

더보기
  1. SRP - 단일 책임 원칙 : 한 클래스는 하나의 책임만 가져야 한다.
  2. OCP - 개방-폐쇄 원칙 : 확장에는 열려있고, 수정에는 닫혀있어야 한다.
  3. LSP - 리스코프 치환 원칙 : 상위 타입은 항상 하위 타입으로 대체할 수 있어야 한다.
  4. ISP - 인터페이스 분리 원칙 : 인터페이스 내에 메소드는 최소한 일수록 좋다. (하나의 일반적인 인터페이스보다 여러 개의 구체적인 인터페이스가 낫다.) SRP와 같은 문제에 대한 두 가지 다른 해결책이다.
  5. DIP - 의존관계 역전 원칙 : 구체적인 클래스보다 상위 클래스, 인터페이스, 추상클래스와 같이 변하지 않을 가능성이 높은 클래스와 관계를 맺어라. DIP 원칙을 따르는 가장 인기 있는 방법은 의존성 주입(DI)이다