면접준비[프론트,백,데이터,CS]/InterView 준비 [ 백엔드 ]

[ 백엔드 면접준비 : Java&Kotlin + SpringBoot ] Java 면접 질문 정리_01

안다미로 : Web3 & D.S 2024. 12. 20. 00:22

 

 

[ 백엔드 면접준비 : Java&Kotlin + SpringBoot ] Java 면접 질문 정리_01

 


 

 

Ⅰ. 'JVM' 이 뭔가요?


   "JVM [ Java Virtual Machine ] " 은  JRE { Java Runtime Environment } 의 일부로서,

         Java 바이트 코드를 실행하기 위한 런타임 환경을 제공합니다.

 

   ◇ 하드웨어 및 운영 체제의 독립성을 책임지는 Java 기술의 구성 요소로,

          Java의 "한 번 작성하면 어디서나 실행" 이라는 핵심 기능을 가능하게 합니다.

 

   ◇ JVM은 다음과 같은 주요 작업을 수행함으로써 작동합니다.

 

                ● 코드 로드 : 컴파일 된 바이트코드를 메모리에 로드합니다.

                ● 코드 검증:  로드된 Java 바이트코드의 정확성을 보장합니다.

                ● 코드 실행 : JVM은 기반  하드웨어에 따라서 바이트코드를 기계 언어로 해석하여 실행합니다.

 

 


Ⅱ. 'JDK', 'JRE' 및 'JVM'의 차이점은??


 

JVM (Java Virtual Machine)

JVM은 Java 프로그램이 실행되는 가상 머신입니다.

 

Java 코드는 플랫폼 독립적인 바이트코드로 컴파일되며,

JVM은 이 바이트코드를 해석하고 실행하는 역할을 합니다.

 

JVM은 메모리 관리, 가비지 컬렉션, 스레드 관리 등과 같은 런타임 환경을 제공하여,

Java 애플리케이션이 다양한 플랫폼에서 일관되게 실행될 수 있도록 합니다.

 

 

JRE (Java Runtime Environment)


JRE는 Java 프로그램을 실행하기 위한 환경을 제공합니다.

 

JRE는 JVM을 포함하고 있으며,

Java 애플리케이션이 실행되는 데 필요한 표준 라이브러리와 리소스를 제공합니다.

 

즉, JRE는 Java 프로그램을 실행하기 위한 필수 구성 요소를 갖춘 패키지로,

개발자는 JRE만 설치하면 Java 애플리케이션을 실행할 수 있습니다. 그러나 JRE는 Java 애플리케이션을 개발하는 데 필요한 도구는 포함하고 있지 않습니다.

 

 

 

JDK (Java Development Kit)


JDK는 Java 애플리케이션을 개발하기 위한 종합적인 도구 모음입니다.

 

JDK는 JRE를 포함하고 있으며,

추가적으로 Java 컴파일러, 디버거, 문서화 도구 등 다양한 개발 도구를 제공합니다.

 

개발자는 JDK를 사용하여 Java 소스 코드를 작성하고,

이를 컴파일하여 실행 가능한 프로그램으로 변환할 수 있습니다.

 

따라서 JDK는 Java 개발에 필요한 모든 도구를 제공하는 핵심 패키지입니다.

 

 

 

 

 


 

Ⅲ.  자바의 주요 특징은??


 

     1. 객체 지향 프로그래밍 {OOP}

             

절차 vs 객체

        ● Java는 모든 것을 객체로 다루며, 이는 코드의 재사용성과 유지 보수성을 높입니다.

           객체 지향 개념인 {캡슐화, 상속, 다형성}을 지원하여, 복잡한 SW 시스템을 보다 쉽게 설계하고 관리할 수 있습니다.

 

 

                  @ 객체 지향적 특성.

 

                           1. 캡슐화

                                   - 데이터와 메소드를 하나의 단위(클래스)로 묶음

                                   - 접근 제어자( public, private 등) 를 통해 데이터를 보호.

 

                           2. 상속

                                   - 'extends' 키둬드를 통해 클래스 간 자원 공유.

                                   - 코드 재사용성과 확장성 제공.

 

                           3. 다형성

                                   - 같은 메소드명으로,  다른 동작을 구현 가능.

                                   - 접근 제어자( public, private 등) 를 통해 데이터를 보호.

 

 

        ● 물론 절차 지향적인 개발도 부분적으로 가능{static 메소드 사용, main메소드 중심 순차적 코딩} 하긴 하지만,

              Java의 설계 철학과 구조는 객체 지향에 최적화되어있습니다.

 


     2. 플랫폼 독립성

           - 자바는   "한 번 작성, 어디서나 실행" [ Write Once, Run Anywhere ] 이라는 원칙을 따릅니다.

           - 자바 코드는 JVM{Java Virtual Machine}에서 실행되므로, 

                 JVM이 설치된 모든 플랫폼에서 동일한 코드를 실행 가능합니다.

                  { 다양한 운영 체제에 맞춰서 코드를 수정할 필요가 없습니다 } 

 


     3. 강타입 언어.

             - 자바는 강타입 언어로, 변수의 타입을 명시적으로 선택해야 합니다.

                    이는 코드의 가독성을 높이고, 타입 관련 오류를 컴파일 타임에 발견할 수 있게 해줍니다.

                   결과적으로 프로그램의 안전성과 보안성을 향상시킵니다.

 


     4. 멀티 스레드 지원.

               - 자바는 멀티스레드 프로그래밍을 지원하여, 여러 스레드를 동시에 실행할 수 있습니다.

                      이를 통해 CPU 자원을 효율적으로 활용하고, 사용자 경험을 개선 가능합니다.

 


     5. 가비지 컬렉션.

             - 자바는 자동 메로리 관리 기능인 가비지 컬렉션을 제공합니다.

             - 개발자는 객체를 생성할 때 '메모리'를 수동으로 관리할 필요가 없으며,

                  사용되지 않는 객체는 자동으로 메모리에서 해제됩니다.

                      => 메모리 누수를 방지하고, 개발자가 메모리 관리에 대한 부담을 덜 수 있습니다.

 

 


 

 

Ⅳ.  Java의 "WORA(Write Once, Run Anywhere)


 

-  "한 번 작성, 어디서나 실행" [ Write Once, Run Anywhere ] 이라는 원칙

 

       -> Java의 WORA는 Java 앱을 어떤 장치에서든 작성하여, 바이트코드로 컴파일하고,

              JVM이 설치된 어떤 장치에서든 실행할 수 있다는 것을 의미하는데  

           이 기능은 하드웨어와 운영 체제의 세부 사항을 추상화하는 JVM 덕분에 가능합니다.

 

 

 


Ⅴ.  Java에서는 예외를 어떻게 처리할까


 

   ◆ Java에서는 [ try, catch, finally, throw ] 키워드를 사용하여서 예외를 처리합니다.

 

 

            ▼ try { 예외 탐지와 격리}

                   : 예외가 발생할 수 있는 코드를,  try 블록 안에 래핑해서 에러를 탐지합니다.

                   : 예외가 발생하면, 즉시 해당 지점에서 코드실행을 중단하고 catch 블록으로 제어권을 이전합니다.

 

 

            ▼ catch {예외 처리 메커니즘 }

                   : 특정 예외 유형을 잡아내고 처리하는 블록

                   : 여러 개의 catch 블록을 통해 다양한 예외 유형별 처리 가능.

                   : catch 블록으로 예외 종류별로 핸들링이 가능합니다.

                  : 예외 객체를 통해서 상세한 예외 정보 확인이 가능.

 

 

            ▼ finally {무조건 실행되는 코드 블록 }

                  : try 및 catch 블록 이후에 항상 실행되는 코드를 포함하며 예외와 상관없이 실행됨.

                  : 예외 발생 여부와 관계없이 항상 실행.

                  : 주로 리소스 해제, 연결 종료 등 마무리 작업에 사용.

                  : try-catch 블록의 마지막에 위치.

 

 

            ▼ throw {수동 예외 발생}

                  : 예외를 수동으로 발생시키는데 throw 키워드를 사용합니다.  

                  : 'throw new 예외 클래스()' 형태로 사용합니다.

                  : 특정 조건에서 의도적인 예외 생성 가능합니다.

 

 

 

            ▼ throws {예외 전파}

                   : 메서드가 예외를 발생시킬 수 있다는 것을 메소드 정의부분에 명시해서, 

                     예외를 자신이 아닌 호출한 곳으로 넘길 수 있습니다. 

                   : 메서드 선언부에 사용하여, 해당 메서드가 특정 예외를 던질 수 있음을 명시.

                   : 예외 처리의 책임을 호출자에게 위임.

 

public void exampleMethod() throws MyException {
    try {
        // 예외 발생 가능한 코드
        if (someCondition) {
            throw new MyException("Custom exception");
        }
    } catch (MyException e) {
        // 특정 예외 처리
        System.out.println(e.getMessage());
    } finally {
        // 항상 실행되는 코드
        closeResources();
    }
}