상위 100+ Core Java 인터뷰 질문

자바 기반 인터뷰를 준비하는 데 도움이 되는 코어 자바 인터뷰 질문입니다. 신입 또는 고도로 경험한 전문가이든 상관없이 코어 자바는 모든 자바/JEE 인터뷰에서 중요한 역할을 합니다.

코어 자바는 대부분의 인터뷰에서 인기 있는 영역이며, 인터뷰 결과를 결정하는 데 중요한 역할을 합니다.

이 게시물은 제 14년 이상의 자바 프로그래밍 및 많은 인터뷰 경험에서 직접 나온 것입니다. 최근 자바 16이 출시되었으며, 최신 릴리스에서 일부 질문을 포함하여 게시물을 업데이트했습니다.

코어 자바 인터뷰 질문과 답변

I have already written a lot about java interview questions for specific topics such as String, Collections, and Multithreading.

  1. 자바 문자열 인터뷰 질문
  2. 자바 스레드 인터뷰 질문
  3. 자바 컬렉션 인터뷰 질문
  4. 자바 예외 인터뷰 질문

여기 몇 가지 중요한 핵심 자바 인터뷰 질문과 답변을 제공하고 있습니다. 인터뷰를 가기 전에 지식을 되짚을 수 있도록 이 게시물을 책갈피에 추가할 수 있습니다.

1. 자바 14 릴리스의 중요한 기능 중 일부를 말해보세요?

Java 14는 2020년 3월 17일에 출시되었습니다. 이것은 Non-LTS 버전입니다. 몇 가지 개발자 특화된 자바 14 기능은 다음과 같습니다:Java 14 Features 중 일부는 다음과 같습니다:

  1. Switch Expressions – JEP 361
  2. instanceof 연산자의 패턴 매칭 개선 – 미리보기 기능, JEP 305
  3. 도움이 되는 NullPointerException 메시지 – JEP 358
  4. Text Blocks – 두 번째 미리보기, JEP 368
  5. Records – 데이터 클래스, 미리보기 기능, JEP 359.

2. 자바 13 릴리스의 중요한 기능 중 일부를 말해보세요?

Java 13는 2019년 9월 17일에 출시되었습니다. 이것은 Non-LTS 버전입니다. 몇 가지 개발자 특화된 Java 13 기능 은 다음과 같습니다:

  1. Text Blocks – 미리보기 기능, JEP 355
  2. 스위치 표현식 – 미리보기 기능, JEP 354
  3. Java 소켓 API 재구현 – JEP 353
  4. 동적 CDS 아카이브 – JEP 350
  5. FileSystems.newFileSystem() 메서드
  6. 네임스페이스 지원을 갖춘 DOM 및 SAX 팩토리
  7. Unicode 12.1 지원
  8. 사용되지 않는 메모리 반환을 위한 ZGC 개선 – JEP 351

3. Java 12 릴리스의 중요한 기능을 몇 가지 말해주세요?

Java 12는 2019년 3월 19일에 출시되었습니다. LTS가 아닌 버전입니다. 일부 Java 12 기능은 다음과 같습니다:

  1. JVM 변경 사항 – JEP 189, JEP 346, JEP 344 및 JEP 230
  2. 스위치 표현식
  3. 파일 불일치() 메서드
  4. 컴팩트한 숫자 포맷
  5. 스트림 API에서 티잉 수집기
  6. 문자열 클래스의 새로운 메서드
  7. JEP 334: JVM 상수 API
  8. JEP 305: instanceof를 위한 패턴 매칭
  9. JDK 12에서 Raw String Literals가 제거되었습니다.

자바 11 릴리스의 중요한 기능은 무엇인가요?

자바 11은 자바 8 이후 두 번째 LTS 릴리스입니다. 라이선싱 및 지원 모델이 변경되었으며, 이는 Java 11 Oracle JDK를 다운로드하면 상업적 사용에 대해 유료로 지불해야 함을 의미합니다. 무료 버전을 사용하려면 OpenJDK 웹사이트에서 다운로드할 수 있습니다.

자바 11의 중요한 기능 중 일부는 다음과 같습니다:

  • 우리는 java 명령을 통해 직접 자바 프로그램을 실행할 수 있습니다. 소스 파일은 암시적으로 컴파일되고 실행됩니다. 이것은 JEP 330 기능 구현의 일부입니다.
  • String 클래스에 6개의 새로운 메서드가 추가되었습니다 – isBlank(), lines(), strip(), stripLeading(), stripTrailing(), 그리고 repeat(). 이에 대한 자세한 내용은 Java String 클래스에서 확인할 수 있습니다.
  • Files 클래스에는 문자열 데이터를 읽고 쓰기 위한 두 개의 새로운 메서드가 추가되었습니다 – readString() 및 writeString().
  • 람다 표현식에서도 “var”를 사용할 수 있습니다. 이것은 JEP 323 구현의 일부입니다.
  • Epsilon: 테스트 환경용 No-Op Garbage Collector입니다. 실험적인 기능으로, JEP 318의 일부입니다.
  • Java EE 및 CORBA 모듈이 표준 JDK 빌드에서 제거되었습니다. Nashorn JavaScript Engine도 더 이상 사용되지 않습니다.
  • 새로운 HTTP 클라이언트 (JEP 321) 및 Flight Recorder (JEP 328)

전체적인 개요는 읽어보세요 Java 11 기능.

5. Java 10 릴리스의 중요한 기능은 무엇입니까?

Java 10은 오라클 코퍼레이션의 매 여섯 개월마다 출시되는 첫 번째 버전이므로, 이전 버전들처럼 주요 릴리스는 아닙니다. 그러나 Java 10의 중요한 기능 중 일부는 다음과 같습니다:

  • 지역 변수 유형 추론
  • java.util.Locale 및 관련 API를 개선하여 BCP 47 언어 태그의 추가 Unicode 확장을 구현합니다.
  • HotSpot VM을 통해 사용자가 지정한 NV-DIMM과 같은 대체 메모리 장치에 Java 객체 힙을 할당할 수 있도록 합니다.
  • JDK에 기본 루트 인증 기관 (CA) 인증서 세트를 제공합니다.

Java 10은 대부분 유지 관리 릴리스이지만, 저는 실제로 지역 변수 유형 추론 기능을 좋아합니다. Java 10의 자세한 개요는 Java 10 기능을 참조하십시오.

6. Java 9 릴리스의 중요한 기능은 무엇입니까?

Java 9는 주요 릴리스로, 많은 기능을 가져왔습니다. 중요한 기능 중 일부는 다음과 같습니다:

  • Java 9 REPL (JShell)
  • Java 9 모듈 시스템
  • 불변 List, Set, Map 및 Map.Entry를 위한 팩터리 메서드
  • 인터페이스 내의 개인 메서드
  • 반응형 스트림
  • GC (Garbage Collector) 개선

자세한 내용은 다음에서 확인할 수 있습니다: Java 9 Features.

7. Java 8 릴리스의 중요한 기능은 무엇입니까?

Java 8는 2014년 3월에 출시되었으므로, 자바 인터뷰 질문 중 핫한 주제 중 하나입니다. 이 질문에 명확하게 답하면 최신 기술에 대해 스스로를 최신 상태로 유지하고 있다는 것을 보여줍니다.

Java 8는 자바 5 주석 및 제네릭 이후 가장 큰 릴리스 중 하나였습니다. Java 8의 중요한 기능 중 일부는:

  1. 인터페이스 변경 및 기본 및 정적 메서드
  2. 함수형 인터페이스 및 람다 표현식
  3. Java 컬렉션 클래스용 스트림 API
  4. Java 날짜 및 시간 API

I strongly recommend to go through above links to get proper understanding of each one of them, also read Java 8 Features.

8. Java에서 몇 가지 OOPS 개념을 언급하십시오?

Java는 객체 지향 프로그래밍 개념에 기반을 두고 있으며, 다음은 Java 프로그래밍에서 구현된 몇 가지 OOPS 개념입니다.

  • 추상화
  • 캡슐화
  • 다형성
  • 상속
  • 연관
  • 집합
  • 구성

더 많은 정보는 다음 위치에서 확인하십시오 Java에서의 OOPS 개념.

자바의 플랫폼 독립성이란 무엇을 의미합니까?

플랫폼 독립성이란 동일한 자바 프로그램을 모든 운영 체제에서 실행할 수 있다는 것을 의미합니다. 예를 들어, 윈도우에서 자바 프로그램을 작성하고 맥 OS에서 실행할 수 있습니다.

10. JVM이란 무엇이며 플랫폼 독립적입니까?

자바 가상 머신(JVM)은 자바 프로그래밍 언어의 핵심입니다. JVM은 바이트 코드를 기계에서 읽을 수 있는 코드로 변환하는 역할을 담당합니다. JVM은 플랫폼 독립적이 아닙니다. 따라서 각 운영 체제에 대해 다른 JVM이 있습니다. 최소 및 최대 메모리를 JVM에 할당하는 자바 옵션과 같이 JVM을 사용자 정의할 수 있습니다. 이것을 가상이라고 부르는 이유는 기본 운영 체제에 의존하지 않는 인터페이스를 제공하기 때문입니다.

11. JDK와 JVM의 차이는 무엇입니까?

자바 개발 키트(JDK)는 개발 목적으로, JVM은 자바 프로그램을 실행하기 위한 그 중 하나입니다.

JDK는 Java 프로그램을 컴파일, 디버그 및 실행하는 데 필요한 모든 도구, 실행 파일 및 이진 파일을 제공합니다. 실행 부분은 기계 독립성을 제공하기 위해 JVM이 처리합니다.

12. JVM과 JRE의 차이점은 무엇입니까?

Java Runtime Environment (JRE)는 JVM의 구현체입니다. JRE에는 JVM 및 Java 이진 파일 및 기타 클래스가 포함되어 있어 모든 프로그램을 성공적으로 실행할 수 있습니다. JRE에는 Java 컴파일러, 디버거 등과 같은 개발 도구가 포함되어 있지 않습니다. Java 프로그램을 실행하려면 JRE가 설치되어 있어야 합니다.

13. 모든 클래스의 수퍼클래스는 무엇입니까?

java.lang.Object 는 모든 Java 클래스의 루트 클래스이며 이를 확장할 필요가 없습니다.

14. Java가 다중 상속을 지원하지 않는 이유는 무엇입니까?

자바는 “다이아몬드 문제” 때문에 클래스에서 다중 상속을 지원하지 않습니다. 예제와 함께 다이아몬드 문제에 대해 더 알고 싶다면 자바에서 다중 상속을 읽어보십시오.

그러나 인터페이스에서는 다중 상속이 지원됩니다. 인터페이스는 메서드를 선언하기만 하고, 구현은 구현하는 클래스에 있기 때문에 다이아몬드 문제가 발생하지 않습니다.

15. 자바가 완전한 객체 지향 언어가 아닌 이유는 무엇인가요?

자바는 int, byte, short, long 등과 같은 기본 타입을 지원하기 때문에 완전한 객체 지향이라고 말하지 않습니다. 이는 코드를 작성하는 동안 언어를 단순하게 만들어 준다고 생각합니다. 자바는 기본 타입에 대한 래퍼 객체를 가질 수 있지만, 그저 표현을 위한 것일 뿐이며 어떠한 이점도 제공하지 않을 것입니다.

우리가 알다시피, 모든 기본 타입에는 Integer, Long 등과 같은 래퍼 클래스가 있어 추가적인 메서드를 제공합니다.

16. 경로(path)와 클래스패스(classpath) 변수의 차이는 무엇인가요?

PATH는 운영 체제에서 실행 파일을 찾기 위해 사용되는 환경 변수입니다. 그래서 우리가 자바를 설치하거나 운영 체제에서 실행 파일을 찾기를 원할 때, 해당 디렉토리 위치를 PATH 변수에 추가해야 합니다. Windows 운영 체제에서 작업하는 경우, Windows에서 PATH 변수를 설정하는 방법을 읽어보세요.

Classpath는 자바에 특화되어 있으며 자바 실행 파일이 클래스 파일을 찾는 데 사용됩니다. 자바 애플리케이션을 실행하는 동안 클래스 경로 위치를 제공할 수 있으며 디렉토리, ZIP 파일, JAR 파일 등이 될 수 있습니다.

17. Java에서 main 메서드의 중요성은 무엇인가요?

main() 메서드는 모든 독립형 자바 애플리케이션의 진입점입니다. main 메서드의 구문은 public static void main(String args[])입니다.

자바의 main 메서드는 public이고 static이므로 자바 런타임이 클래스를 초기화하지 않고도 액세스할 수 있습니다. 입력 매개변수는 런타임 인수를 자바 프로그램으로 전달할 수 있는 문자열 배열입니다. 자바 프로그램을 컴파일하고 실행하는 방법을 알아보려면 자바 프로그램을 컴파일하고 실행하는 방법을 확인하세요.

18. 자바에서 오버로딩과 오버라이딩은 무엇인가요?

하나의 클래스 내에 같은 이름을 가진 메서드가 여러 개 있지만 인수가 다른 경우에는 메서드 오버로딩이라고 합니다.

오버라이딩 개념은 상속 시에 두 개의 메서드가 동일한 시그니처를 갖는 경우에 사용됩니다. 하나는 부모 클래스에 있고 다른 하나는 자식 클래스에 있습니다. 자식 클래스의 재정의된 메서드에는 @Override 주석을 사용하여 부모 클래스의 메서드가 변경되면 자식 클래스도 변경되도록 할 수 있습니다.

19. main() 메서드를 오버로딩할 수 있나요?

예, 하나의 클래스에 이름이 “main”인 여러 메서드를 가질 수 있습니다. 그러나 클래스를 실행하면 자바 런타임 환경이 문법이 public static void main(String args[])인 main 메서드를 찾습니다.

20. 자바 소스 파일에 여러 개의 public 클래스를 가질 수 있습니까?

하나의 자바 소스 파일에는 둘 이상의 public 클래스를 가질 수 없습니다. 하나의 소스 파일에는 public이 아닌 여러 클래스를 가질 수 있습니다.

21. Java 패키지는 무엇이며 기본적으로 어떤 패키지가 가져와집니까?

Java 패키지는 java 클래스를 그룹화하는 메커니즘입니다. 그룹화 로직은 기능이나 모듈을 기반으로 할 수 있습니다. 자바 클래스의 완전히 분류된 이름에는 패키지와 클래스 이름이 포함됩니다. 예를 들어, java.lang.Object는 java.lang 패키지의 일부인 Object 클래스의 완전히 분류된 이름입니다.

java.lang 패키지는 기본적으로 가져오며 이 패키지에서 어떤 클래스도 명시적으로 가져올 필요가 없습니다.

22. Java에서의 접근 제어자란?

자바는 public, private 및 protected 접근 수정자 키워드를 통한 접근 제어를 제공합니다. 이러한 것 중 하나도 사용되지 않으면 기본 접근 수정자라고 합니다.

A java class can only have public or default access modifier. Read Java Access Modifiers to learn more about these in detail.

23. final 키워드란?

final 키워드는 클래스와 함께 사용되어 다른 클래스가 해당 클래스를 확장할 수 없도록 합니다. 예를 들어, String 클래스는 final이며 확장할 수 없습니다.

메서드와 함께 final 키워드를 사용하여 하위 클래스가 재정의할 수 없도록 할 수 있습니다.

자바의 final 키워드는 변수와 함께 사용되어 변수가 한 번만 할당될 수 있도록 보장합니다. 그러나 변수의 상태는 변경될 수 있습니다. 예를 들어, final 변수를 객체에 한 번만 할당할 수 있지만 나중에 객체 변수를 변경할 수 있습니다.

자바 인터페이스 변수는 기본적으로 final 및 static입니다.

24. static 키워드란?

static 키워드는 클래스 레벨 변수와 함께 사용되어 모든 객체가 동일한 변수를 공유하도록 만들 수 있습니다.

메서드와 함께 static 키워드를 사용할 수도 있습니다. 정적 메서드는 클래스의 정적 변수만 액세스하고 클래스의 정적 메서드만 호출할 수 있습니다.

자세한 내용은 자바 정적 키워드에서 더 읽어보세요.

25. 자바에서 finally와 finalize란 무엇인가요?

finally 블록은 try-catch와 함께 사용되어 예외가 발생해도 항상 실행되길 원하는 코드를 넣는 데 사용됩니다. finally 블록은 주로 try 블록에서 생성된 리소스를 해제하는 데 사용됩니다.

finalize()는 Object 클래스의 특수한 메서드로, 우리 클래스에서 재정의할 수 있습니다. 이 메서드는 객체가 가비지 수집될 때 가비지 수집기에 의해 호출됩니다. 이 메서드는 주로 객체가 가비지 수집될 때 시스템 리소스를 해제하기 위해 재정의됩니다.

26. 클래스를 static으로 선언할 수 있나요?

최상위 클래스를 static으로 선언할 수는 없지만 내부 클래스는 static으로 선언할 수 있습니다. 내부 클래스가 static으로 선언되면 static 중첩 클래스라고 합니다.

정적 중첩 클래스는 다른 최상위 클래스와 동일하며, 패키징 편의를 위해 중첩된 것 뿐입니다.

내부 클래스에 대해 더 읽어보려면 자바 내부 클래스를 참조하세요.

27. 정적 임포트란?

다른 클래스에서 정적 변수나 메서드를 사용해야 할 때 일반적으로 클래스를 가져와서 그 클래스 이름과 함께 메서드/변수를 사용합니다.

import java.lang.Math;

//클래스 내부
double test = Math.PI * 5;

정적 메서드나 변수만 가져와서 해당 클래스에 속하는 것처럼 클래스 내에서 사용할 수 있습니다.

import static java.lang.Math.PI;

//이제 클래스를 참조할 필요가 없음
double test = PI * 5;

정적 임포트의 사용은 혼란을 줄 수 있으므로 피하는 것이 좋습니다. 정적 임포트의 과용은 프로그램을 해석하기 어렵고 유지보수하기 어렵게 만들 수 있습니다.

28. 자바에서의 try-with-resources란?

Java 7의 기능 중 하나는 자동 리소스 관리를 위한 try-with-resources 문입니다. Java 7 이전에는 자동 리소스 관리가 없었으며 리소스를 명시적으로 닫아야 했습니다. 일반적으로는 try-catch 문의 finally 블록에서 이를 수행했습니다. 이 접근 방식은 리소스를 닫는 것을 잊었을 때 메모리 누수를 발생시켰습니다.

Java 7부터는 try 블록 내에서 리소스를 생성하고 사용할 수 있습니다. Java는 try-catch 블록이 완료되면 즉시 닫습니다. 자세한 내용은 Java 자동 리소스 관리에서 확인할 수 있습니다.

29. 자바의 다중 catch 블록이란?

자바 7의 개선 사항 중 하나는 다중 catch 블록입니다. 여러 예외를 단일 catch 블록에서 처리할 수 있습니다. 이렇게 하면 모든 catch 블록에 유사한 코드가 있는 경우 코드가 더 짧고 깔끔해집니다.

catch 블록이 여러 예외를 처리하는 경우 파이프 (|)로 분리할 수 있으며 이 경우 예외 매개변수 (ex)는 final이므로 변경할 수 없습니다.

자세한 내용은 Java 다중 catch 블록에서 확인할 수 있습니다.

30. 정적 블록이란?

Java 정적 블록은 Java 클래스로더에 의해 메모리로 로드될 때 실행되는 문 그룹입니다. 이것은 클래스의 정적 변수를 초기화하는 데 사용됩니다. 대부분은 클래스가 로드될 때 정적 리소스를 생성하는 데 사용됩니다.

31. 인터페이스란?

인터페이스는 자바 프로그래밍 언어의 핵심 개념으로 JDK뿐만 아니라 자바 디자인 패턴, 대부분의 프레임워크 및 도구에서도 많이 사용됩니다. 인터페이스는 자바에서 추상화를 달성하기 위한 방법을 제공하며 하위 클래스가 구현해야 하는 계약을 정의하는 데 사용됩니다.

인터페이스는 코드에서 유형을 정의하고 최상위 계층을 만드는 시작점으로 좋습니다. 자바 클래스가 여러 인터페이스를 구현할 수 있기 때문에 대부분의 경우 인터페이스를 슈퍼 클래스로 사용하는 것이 좋습니다. 더 많은 정보는 자바 인터페이스에서 확인할 수 있습니다.

32. 추상 클래스란?

추상 클래스는 하위 클래스를 위한 일부 기본 메서드 구현이 있는 클래스를 만드는 데 사용됩니다. 추상 클래스는 본문이 없는 추상 메서드를 가질 수 있으며 구현이 있는 메서드도 가질 수 있습니다.

추상 키워드는 추상 클래스를 만드는 데 사용됩니다. 추상 클래스는 인스턴스화될 수 없으며 주로 서브 클래스가 추상 메서드를 확장하고 구현하거나 추상 클래스의 구현된 메서드를 재정의하거나 사용할 수 있도록 기본을 제공하는 데 사용됩니다. 추상 클래스에 대한 중요한 포인트를 읽어보세요. 자바 추상 클래스.

33. 추상 클래스와 인터페이스의 차이는 무엇입니까?

  • 추상 키워드는 추상 클래스를 만드는 데 사용되고 인터페이스는 인터페이스의 키워드입니다.
  • 추상 클래스는 메서드 구현을 가질 수 있지만 인터페이스는 그렇지 않습니다.
  • A class can extend only one abstract class but it can implement multiple interfaces.
  • 추상 클래스에 main() 메서드가 있으면 실행할 수 있지만 인터페이스는 실행할 수 없습니다.

추상 클래스와 인터페이스 간의 몇 가지 더 다양한 차이점은 추상 클래스와 인터페이스의 차이에서 확인할 수 있습니다.

34. 인터페이스가 다른 인터페이스를 구현하거나 확장할 수 있습니까?

인터페이스는 다른 인터페이스를 구현하지 않고 확장합니다. 인터페이스는 메서드 구현을 가질 수 없으므로 다이아몬드 문제가 발생하지 않습니다. 이것이 인터페이스에서 다중 상속을 가질 수 있는 이유입니다. 즉, 인터페이스는 여러 인터페이스를 확장할 수 있습니다.

자바 8부터 인터페이스에 기본 메서드 구현이 가능합니다. 따라서 여러 인터페이스에 공통 기본 메서드가 있는 경우 다이아몬드 문제를 처리하기 위해 해당 메서드의 구현을 제공하는 것이 필수적입니다. 자세한 내용과 예제는 Java 8 인터페이스 변경 사항을 읽어보세요.

35. 마커 인터페이스란?

A marker interface is an empty interface without any method but used to force some functionality in implementing classes by Java. Some of the well known marker interfaces are Serializable and Cloneable.

36. 래퍼 클래스란?

자바 래퍼 클래스는 자바의 여덟 가지 기본 유형의 객체 표현입니다. 자바의 모든 래퍼 클래스는 변경할 수 없고 final입니다. 자바 5 자동 포장(boxing) 및 언박싱(unboxing)을 통해 기본 유형과 해당 래퍼 클래스 간의 쉬운 변환을 허용합니다.

자세한 내용은 자바의 래퍼 클래스에서 확인하십시오.

37. 자바에서 Enum이란 무엇인가요?

Enum은 자바 1.5에서 새로운 유형으로 도입되었으며 그 필드는 고정된 일련의 상수로 구성됩니다. 예를 들어, 자바에서는 방향을 EAST, WEST, NORTH, SOUTH와 같은 고정 필드로하는 Enum으로 만들 수 있습니다.

Enum은 Enum 유형을 생성하기 위한 키워드이며 클래스와 유사합니다. Enum 상수는 암시적으로 static 및 final입니다. 자세한 내용은 java enum에서 자세히 읽어보세요.

38. 자바 어노테이션은 무엇인가요?

자바 주석은 코드에 대한 정보를 제공하며 주석이 달린 코드에는 직접적인 영향을 미치지 않습니다. 주석은 자바 5에서 소개되었습니다. 주석은 프로그램 내에 포함된 프로그램에 대한 메타데이터입니다. 주석 파싱 도구나 컴파일러에서 구문 분석될 수 있습니다. 또한 주석의 사용 가능성을 컴파일 시간까지 또는 런타임까지 지정할 수도 있습니다. 자바 내장 주석은 @Override, @Deprecated, @SuppressWarnings입니다. 더 읽어보기: 자바 주석.

39. 자바 리플렉션 API란 무엇이며 왜 중요한가요?

자바 리플렉션 API는 자바 애플리케이션의 런타임 동작을 검사하고 수정하는 기능을 제공합니다. 우리는 자바 클래스, 인터페이스, 열거형을 검사하고 그들의 메서드와 필드 세부 정보를 얻을 수 있습니다. 리플렉션 API는 고급 주제이며 일반 프로그래밍에서는 피해야 합니다. 리플렉션 API 사용은 싱글톤 패턴과 같은 디자인 패턴을 깨뜨릴 수 있으며, private 생성자를 호출하여 접근 제어자 규칙을 위반할 수 있습니다.

일반 프로그래밍에서는 Reflection API를 사용하지 않지만, 그것은 매우 중요합니다. Reflection API 없이는 Spring, Hibernate와 같은 프레임워크나 Tomcat, JBoss와 같은 서버를 사용할 수 없습니다. Reflection API를 통해 적절한 메서드를 호출하고 클래스를 인스턴스화하며, 다른 처리에도 자주 사용됩니다.

Java Reflection Tutorial를 읽어서 Reflection API에 대한 심층적인 지식을 습득하세요.

40. 자바에서 합성(Composition)이란?

합성은 클래스에서 has-a 관계를 구현하는 설계 기술입니다. 우리는 코드 재사용을 위해 객체 합성을 사용할 수 있습니다.

자바의 합성은 다른 객체를 참조하는 인스턴스 변수를 사용하여 달성됩니다. 합성을 사용하는 이점은 클라이언트 클래스에 다른 객체의 가시성을 제어하고 필요한 것만 재사용할 수 있다는 것입니다. 예제와 함께 더 읽어보세요: Java Composition 예제.

41. 상속 대신 합성을 사용하는 이점은 무엇인가요?

Java 프로그래밍의 최상의 관행 중 하나는 “상속 대신 구성을 선호하는 것”입니다. 일부 가능한 이유는 다음과 같습니다:

  • 슈퍼클래스의 변경이 서브클래스에 영향을 줄 수 있습니다. 심지어 우리가 슈퍼클래스 메서드를 사용하지 않더라도입니다. 예를 들어, 서브클래스에 메서드 test()가 있다면 누군가가 갑자기 슈퍼클래스에 test() 메서드를 도입하면 서브클래스에서 컴파일 오류가 발생합니다. 구성은 필요한 메서드만 사용하기 때문에 이 문제가 발생하지 않습니다.
  • 상속은 모든 슈퍼클래스 메서드와 변수를 클라이언트에 노출시키며, 만약 우리가 슈퍼클래스를 설계하는 데 제어권이 없다면 보안 취약점을 유발할 수 있습니다. 구성을 통해 메서드에 제한된 액세스를 제공할 수 있으므로 더 안전합니다.
  • 상속은 컴파일 시간에 클래스를 바인딩하고, 구성은 런타임 바인딩을 얻을 수 있습니다. 따라서 구성은 메서드 호출의 유연성을 제공합니다.

상속 대신 구성의 위젯을 더 자세히 읽어보려면 자바 구성 vs 상속을 참조하세요.

42. Java에서 사용자 정의 객체의 컬렉션을 정렬하는 방법은?

우리는 컬렉션 내의 사용자 지정 객체를 정렬하기 위해 Comparable 인터페이스를 구현해야 합니다. Comparable 인터페이스에는 정렬 메서드에 의해 사용되는 compareTo(T obj) 메서드가 있으며, 이 메서드 구현을 제공함으로써 사용자 지정 객체 컬렉션을 기본적으로 정렬할 수 있습니다.

그러나 급여나 나이와 같은 다른 기준에 따라 정렬하려면 Comparator 인스턴스를 생성하고 정렬 방법으로 전달할 수 있습니다. 자세한 내용은 Java Comparable and Comparator를 읽어보세요.

43. 자바에서 내부 클래스란?

클래스 내부에 클래스를 정의할 수 있으며, 이를 중첩 클래스라고 합니다. 정적이 아닌 중첩 클래스는 내부 클래스라고 합니다. 내부 클래스는 클래스의 객체와 관련이 있으며 외부 클래스의 모든 변수와 메서드에 액세스할 수 있습니다. 내부 클래스는 인스턴스와 연관되어 있으므로 그 안에는 정적 변수가 없습니다.

클래스 내부에는 로컬 내부 클래스나 익명 내부 클래스를 가질 수 있습니다. 자세한 내용은 java inner class를 읽어보세요.

44. 익명 내부 클래스란 무엇인가요?

A local inner class without a name is known as an anonymous inner class. An anonymous class is defined and instantiated in a single statement. Anonymous inner class always extend a class or implement an interface.

익명 클래스는 이름이 없기 때문에 익명 클래스에 대한 생성자를 정의할 수 없습니다. 익명 내부 클래스는 정의된 지점에서만 접근할 수 있습니다.

45. Java에서 Classloader란 무엇인가요?

Java Classloader는 클래스에 액세스하려고 할 때 바이트 코드 프로그램을 메모리로 로드하는 프로그램입니다. 우리는 ClassLoader 클래스를 확장하고 loadClass(String name) 메서드를 오버라이드하여 자체 클래스로더를 만들 수 있습니다. 더 알아보려면 java classloader를 참조하십시오.

46. 클래스로더의 다양한 유형은 무엇인가요?

Java에는 세 가지 유형의 내장 클래스 로더가 있습니다.

  1. Bootstrap ClassLoader – JDK 내부 클래스를 로드하며 일반적으로 rt.jar 및 기타 핵심 클래스를 로드합니다.
  2. 확장 클래스 로더 – JDK 확장 디렉터리에서 클래스를 로드합니다. 일반적으로 $JAVA_HOME/lib/ext 디렉터리입니다.
  3. 시스템 클래스 로더 – 현재 클래스 경로에서 클래스를 로드합니다. 이는 -cp 또는 -classpath 명령행 옵션을 사용하여 프로그램을 호출하는 동안 설정할 수 있습니다.

47. 자바에서 삼항 연산자란?

자바의 삼항 연산자는 세 개의 피연산자를 사용하는 유일한 조건 연산자입니다. 이는 if-then-else 문의 한 줄짜리 대체로 자주 사용되며 자바 프로그래밍에서 많이 사용됩니다. 우리는 삼항 연산자를 if-else 조건이나 중첩된 삼항 연산자를 사용하여 스위치 조건으로 사용할 수 있습니다. 예제는 자바 삼항 연산자에서 찾을 수 있습니다.

48. super 키워드는 무엇을 하는가?

super 키워드는 자식 클래스에서 메소드를 재정의한 경우 슈퍼 클래스 메소드에 접근하는 데 사용할 수 있습니다.

우리는 super 키워드를 사용하여 자식 클래스 생성자에서 슈퍼 클래스 생성자를 호출할 수 있지만 이 경우에는 생성자 메소드에서 첫 번째 문장이어야 합니다.

package com.journaldev.access;

public class SuperClass {

	public SuperClass(){
	}
	
	public SuperClass(int i){}
	
	public void test(){
		System.out.println("super class test method");
	}
}

super 키워드의 사용법은 아래 자식 클래스 구현에서 볼 수 있습니다.

package com.journaldev.access;

public class ChildClass extends SuperClass {

	public ChildClass(String str){
		//super 키워드를 사용하여 상위 클래스 생성자에 액세스
		super();
		
		//하위 클래스 메서드에 액세스
		test();
		
		//super를 사용하여 상위 클래스 메서드에 액세스
		super.test();
	}
	
	@Override
	public void test(){
		System.out.println("child class test method");
	}
}

49. break와 continue 문은 무엇입니까?

break 문은 for, while 또는 do-while 루프를 종료하는 데 사용할 수 있습니다. switch 문에서 break 문을 사용하여 switch 케이스를 종료할 수 있습니다. break 문의 예제는 자바 break에서 볼 수 있습니다. 중첩된 루프를 종료하기 위해 레이블과 함께 break를 사용할 수 있습니다.

continue 문은 for, while 또는 do-while 루프의 현재 반복을 건너뛰는 데 사용됩니다. continue 문을 레이블과 함께 사용하여 최외곽 루프의 현재 반복을 건너뛸 수 있습니다.

50. Java에서 this 키워드는 무엇을 의미합니까?

this 키워드는 현재 객체에 대한 참조를 제공하며 주로 객체 변수가 사용되고 동일한 이름을 가진 로컬 변수가 아닌지 확인하는 데 사용됩니다.

//생성자
public Point(int x, int y) {
    this.x = x;
    this.y = y;
}

우리는 또한 이 키워드를 사용하여 생성자에서 다른 생성자를 호출할 수 있습니다.

public Rectangle() {
    this(0, 0, 0, 0);
}
public Rectangle(int width, int height) {
    this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
}

51. 기본 생성자란?

클래스의 매개변수 없는 생성자를 기본 생성자라고합니다. 클래스에 대한 생성자를 정의하지 않으면 자바 컴파일러가 클래스에 대한 기본 매개변수 없는 생성자를 자동으로 생성합니다. 다른 생성자가 정의된 경우 컴파일러는 우리를 위해 기본 생성자를 생성하지 않습니다.

52. catch 블록없이 try를 사용할 수 있습니까?

예, 우리는 try-finally 문을 사용할 수 있으며 이렇게하여 catch 블록을 피할 수 있습니다.

53. 가비지 컬렉션이란?

가비지 컬렉션은 힙 메모리를 살펴보고 사용 중인 객체와 사용되지 않는 객체를 식별하여 사용되지 않는 객체를 삭제하는 프로세스입니다. 자바에서 메모리 할당 해제 프로세스는 가비지 수집기에 의해 자동으로 처리됩니다.

우리는 코드 Runtime.getRuntime().gc()를 사용하여 가비지 수집기를 실행하거나 유틸리티 메서드 System.gc()를 사용할 수 있습니다. 힙 메모리 및 가비지 수집에 대한 자세한 분석은 자바 가비지 수집을 읽어주십시오.

54. 직렬화와 역직렬화란 무엇입니까?

우리는 자바 객체를 스트림으로 변환할 수 있습니다. 이를 직렬화라고 합니다. 한 번 객체가 스트림으로 변환되면 파일에 저장하거나 네트워크로 전송하거나 소켓 연결에서 사용할 수 있습니다.

객체는 Serializable 인터페이스를 구현해야 하며 java.io.ObjectOutputStream을 사용하여 객체를 파일에 쓰거나 OutputStream 객체에 쓸 수 있습니다. 더 자세한 내용은 자바 직렬화를 참조하십시오.

직렬화를 통해 생성된 스트림 데이터를 객체로 변환하는 프로세스를 역직렬화라고 합니다. 더 자세한 내용은 자바 역직렬화를 참조하십시오.

JAR 파일을 명령 프롬프트를 통해 실행하는 방법은 무엇인가요?

우리는 java 명령을 사용하여 jar 파일을 실행할 수 있지만, 이는 jar 매니페스트 파일에 Main-Class 항목이 필요합니다. Main-Class는 jar의 진입점이며, java 명령이 클래스를 실행하는 데 사용됩니다. 자세한 내용은 java jar 파일에서 확인할 수 있습니다.

시스템 클래스의 용도는 무엇인가요?

Java 시스템 클래스는 핵심 클래스 중 하나입니다. 디버깅을 위해 정보를 로깅하는 가장 쉬운 방법 중 하나는 System.out.print() 메서드를 사용하는 것입니다.

시스템 클래스는 최종 클래스이므로 상속을 통해 동작을 재정의할 수 없습니다. 시스템 클래스는 공개 생성자를 제공하지 않으므로 이 클래스를 인스턴스화할 수 없으며, 따라서 모든 메서드가 정적입니다.

시스템 클래스의 일부 유틸리티 메서드는 배열 복사, 현재 시간 가져오기, 환경 변수 읽기 등입니다. 자세한 내용은 Java 시스템 클래스에서 확인할 수 있습니다.

57. instanceof 키워드란 무엇인가요?

우리는 instanceof 키워드를 사용하여 객체가 특정 클래스에 속하는지 여부를 확인할 수 있습니다. 가능한 한 사용을 피해야합니다. 샘플 사용법은 다음과 같습니다:

public static void main(String args[]){
	Object str = new String("abc");
		
	if(str instanceof String){
		System.out.println("String value:"+str);
	}
		
	if(str instanceof Integer){
		System.out.println("Integer value:"+str);
	}
}

str이 런타임 시에 String 타입이므로 첫 번째 if 문은 참으로 평가되고 두 번째는 거짓으로 평가됩니다.

58. switch case에서 String을 사용할 수 있나요?

Java 7의 기능 중 하나는 switch case에서 문자열을 허용하도록 개선되었습니다. 따라서 Java 7 이상 버전을 사용하는 경우 switch-case 문에서 String을 사용할 수 있습니다. 더 자세한 내용은 Java switch-case String 예제에서 확인하십시오.

59. Java는 값을 전달(pass by value)하는 것인가요, 아니면 참조를 전달하는(pass by reference) 것인가요?

이 질문은 매우 혼란스러운 것 같습니다. 우리는 객체 변수가 힙 공간에 있는 객체에 대한 참조를 포함한다는 것을 알고 있습니다. 어떤 메서드를 호출하면 이러한 변수의 복사본이 전달되어 메서드의 스택 메모리에 저장됩니다. 우리는 어떤 언어든간에 단순한 제네릭 스왑 메서드를 통해 참조 전달인지 값 전달인지를 테스트할 수 있습니다. 자세한 내용은 Java는 값으로 전달되고 참조로 전달되지 않습니다를 읽어보세요.

60. 힙 메모리와 스택 메모리의 차이점은 무엇인가요?

힙 메모리와 스택 메모리의 주요 차이점은 다음과 같습니다:

  • 힙 메모리는 애플리케이션의 모든 부분에서 사용되는 반면, 스택 메모리는 실행 스레드의 하나만 사용합니다.
  • 객체가 생성될 때마다 항상 힙 공간에 저장되며, 스택 메모리에는 그에 대한 참조가 포함됩니다. 스택 메모리에는 로컬 기본 변수와 힙 공간에 있는 객체에 대한 참조 변수만 포함됩니다.
  • 스택의 메모리 관리는 LIFO 방식으로 이루어지지만 힙 메모리는 전역적으로 사용되기 때문에 더 복잡합니다.

샘플 프로그램과 자세한 설명은 Java 힙 vs 스택 메모리를 읽어보세요.

61. Java 컴파일러는 JDK, JRE 또는 JVM에 저장되어 있습니까?

자바 컴파일러의 역할은 자바 프로그램을 바이트코드로 변환하는 것입니다. 이를 위해 javac 실행 파일이 필요합니다. 그러므로 이는 JDK에 저장되어 있어야 하며, JRE에는 필요하지 않으며 JVM은 단순히 명세입니다.

62. 다음 프로그램의 출력물은 무엇입니까?

맥락: 클래스 내의 정적 메서드

package com.journaldev.util;

public class Test {

	public static String toString(){
		System.out.println("Test toString called");
		return "";
	}
	
	public static void main(String args[]){
		System.out.println(toString());
	}
}

답변: 이 코드는 컴파일되지 않습니다. 왜냐하면 우리는 정적 키워드와 함께 Object 클래스 메서드를 가질 수 없기 때문입니다. Object 클래스에는 toString() 메서드가 있습니다. “이 정적 메서드는 Object의 인스턴스 메서드를 숨길 수 없습니다”라는 컴파일 시간 오류가 발생합니다. 그 이유는 정적 메서드가 클래스에 속하고 모든 클래스의 기본이 Object이기 때문에 우리는 인스턴스와 클래스에 동일한 메서드를 가질 수 없습니다. 상위 클래스 Object에 없는 다른 이름으로 메서드 이름을 변경하면 이 오류가 발생하지 않습니다.

맥락: 정적 메서드 호출

package com.journaldev.util;

public class Test {

	public static String foo(){
		System.out.println("Test foo called");
		return "";
	}
	
	public static void main(String args[]){
		Test obj = null;
		System.out.println(obj.foo());
	}
}

답변: 이것은 이상한 상황입니다. 우리는 모두 객체가 NULL 인 경우 NullPointerException을 본 적이 있습니다. 그러나 여기서는 이 프로그램이 작동하여 “Test foo called”를 출력합니다.

이것의 이유는 자바 컴파일러의 코드 최적화입니다. 자바 코드가 바이트 코드로 컴파일될 때, 컴파일러는 foo()가 정적 메서드이고 클래스를 통해 호출되어야 한다는 것을 파악합니다. 그래서 메서드 호출 obj.foo()가 Test.foo()로 변경되어 NullPointerException이 발생하지 않습니다.

I must admit that it’s a very tricky question and if you are interviewing someone, this will blow his mind off. ?

이것이 핵심 자바 인터뷰 질문과 답변입니다. 더 많은 질문을 계속 추가할 것이며, 중요한 질문을 놓친 것으로 생각되면 댓글을 통해 알려주시기 바랍니다.

Source:
https://www.digitalocean.com/community/tutorials/core-java-interview-questions-and-answers