[Interview] 면접준비 - Java

Kim Hyen Su·2024년 10월 25일

면접질문

목록 보기
13/27
post-thumbnail

자바

참고 포스팅 : https://dev-coco.tistory.com/153

💡 자바의 특징을 설명해주세요

  • Java는 객체지향언어 이다.
    • 기본 자료형을 제외한 모든 요소들이 객체로 표현되어 있다.
    • 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어이다.
  • 장점
    • JVM 위에서 실행되기 때문에 플랫폼 독립적이다.
    • GarbageCollector에 의해서 메모리가 자동으로 관리된다.
  • 단점
    • 한번의 컴파일 과정을 더 거치기 때문에 실행 속도가 상대적으로 느리다.

💡 JDK, JRE, JVM에 대해서 설명해주세요

  • JVM은 컴파일 된 바이트 코드를 기계어로 변환 및 실행시켜주는 역할을 하는 가상 머신이다.
  • JRE는 자바 실행 환경으로, Java 프로그램 실행 시 필요한 라이브러리를 제공한다.
  • JDK는 자바 개발 도구로써, 자바 프로그램 개발에 필요한 도구들을 제공한다. 예를 들면, 컴파일러나 디버거 등을 제공한다.

💡 Java 컴파일 과정에 대해서 설명해주세요

  • 개발자가 Java 프로그램을 개발한다.
  • Java 소스 코드를 빌드한다.
  • Java 컴파일러가 Java 소스 코드를 javac 명령어를 통해 컴파일하여 바이트코드를 생성한다.
  • Class Loader를 통해 JVM 메모리 안으로 로드된다.
  • 실행엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석되어 실행된다.

💡 Java 원시타입이 뭔지 설명해주세요

  • 자바 원시타입은 차지할 메모리 크기가 정해져 있는 자료형을 의미한다.
  • 정수형 byte,short,int,long, 실수형 float,double, boolean형 boolean, 문자형으로 char이 있다.
  • 각 크기는 정수형은 1byte, 2byte, 4byte, 8byte이고, 실수형은 4byte,8byte이다. boolean 형은 1byte이고, 문자형은 2byte이다.

💡 오버라이딩과 오버로딩의 대해 설명해주세요.

  • 오버라이딩과 오버로딩은 객체지향의 특징 중 다형성을 나타내기 위한 메커니즘이다.
  • 오버라이딩은 상속을 통해 상위 클래스에 정의한 메서드를 하위 클래스에서 재정의하는 것을 의미한다.
  • 오버로딩은 메서드 시그니처를 다르게하여 동일한 메서드명에 다양한 기능을 사용하는 것을 의미한다.

💡 객체지향프로그래밍(OOP)이란 무엇인지 설명해주세요.

  • 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 이를 이용하여 어떠한 기능을 동작하도록 하는 프로그래밍 기법을 의미한다.
  • 즉, 객체가 중심이며, 객체의 책임과 객체 간의 협력이 핵심이다.

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

  • try-catch-finally 구조의 단점을 보완하기 위한 문법이다.
  • try 문 내에서 사용되는 자원들을 해제해주는 기능을 자동으로 해주어 훨씬 더 간편하고, 인적 오류를 방지해주는 역할을 한다.

💡 final 키워드의 장점에 대해서 설명해주세요.

  • final 키워드는 불변성을 띄우는 예약어이다.
  • 장점으로는 Thread Safe하게 관리가 가능하다.

💡 추상 클래스와 인터페이스에 대해서 설명해주세요.

  • 추상 클래스는abstract로 정의된 클래스를 말하며, 추상 메서드를 갖을 수 있다.
  • 인터페이스는 모든 메소드가 추상 메소드로만 이루어져 있는 것을 말한다.
  • 공통점
    • 객체 생성이 불가능하다.
    • 상속/구현할 하위 객체는 추상 메서드 재정의/구현이 필수이다.
  • 차이점
    • 추상클래스는 상속 관계에 집중하여, 공통적인 로직을 추상화 시키는 것을 위해 사용한다.
    • 인터페이스는 상속 관계와 상관없이 자유로운 기능 구현의 관계 형성 시에 사용한다.

💡 싱글톤 패턴이란 무엇인지 설명해주세요.

  • 단 하나의 인스턴스만 생성하여 사용하는 디자인 패턴이다.
  • 일반적으로 메모리 낭비 방지를 위해 사용한다.
  • 대표적인 예시로 Spirng Bean이 있다.

💡 가비지 컬렉션에 대해서 설명해주세요.

  • JVM의 메모리 관리 기법 중 하나로 시스템에서 동적으로 할당했던 메모리 영역 내 필요없어진 영역을 회수 및 관리해주는 기법을 말한다.
  • GC의 작업을 수행하기 위해 JVM이 어플리케이션의 실행을 잠시 멈추고, GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업을 중단 후 (Stop The World 과정) 사용하지 않는 메모리를 제거(Mark and Sweep 과정)하고 작업이 재개된다.

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

  • SRP_단일책임원칙 : 하나의 클래스는 단일 책임을 가져야 한다.
    이는 해당 클래스를 수정해야 하는 이유가 동일한 이유를 가져야 함을 의미한다. 클래스를 수정해야 하는 이유가 여러 개일 경우 SRP는 지켜지지 않는다. 즉, 수정할 대상이 명확해지면, 이는 SRP가 정확히 지켜지고 있다고 생각하면 된다.

  • OCP_개방폐쇄원칙 : 확장에 대해서는 열려있고, 수정에 대해서는 닫혀있어야 한다.
    요구사항이 변경되었을 때 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있어야 하고, 기존의 코드를 수정하지 않고 새로운 동작을 추가할 수 있어야 한다. 이를 지키기 위해서는 추상화에 의존하여 변하지 않을 부분만 남겨놔야 이를 구체화 하는 기능을 다양하게 정의할 수 있고, 변경도 쉽다. 일반적으로 우리가 Interface - ServiceImpl을 사용하는 것이 이러한 원칙을 지키는 방법 중 하나이다.

  • LSP_리스코프치환원칙 : 하위 타입은 상위 타입을 대체할 수 있어야 한다. 객체를 사용하는 클라이언트는 상위 타입이 하위 타입으로 변경되어도 차이점을 인식하지 못한 채 상위 타입의 퍼블릭 인터페이스를 통해 서브 클래스를 사용할 수 있어야 한다. 여기서 자식 클래스가 부모 클래스를 대체하기 위해서는 부모 클래스에 대한 클라이언트의 가정을 준수해야 한다는 것을 강조한다.

  • ISP_인터페이스분리원칙 : 목적과 관심이 각기 다른 클라이언트가 있다면 인터페이스를 통해 적절하게 분리해줘야 한다. 즉, 특정 용도를 필요로 하는 인터페이스에서 여러 용도로 사용되도록 하면 안된다는 것이다.

  • DIP_의존관계역전원칙 : 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되며, 저수준 모듈이 고수준 모듈에 의존해야 한다는 것이다.

    • 고수준 모듈 : 입력과 출력에 멀리 떨어진 추상화된 모듈
    • 저수준 모듈 : 입력과 출력으로부터 가까운 구현 모듈
    • 즉, 비지니스와 관련된 부분이 세부 사항에는 의존하지 않도록 하는 설계 원칙이다.
    • 이는 OCP와 밀접한 연관이 있으며, 의존관계 역전 원칙이 위배 시 OCP 또한 위배될 가능성이 높다.
    • 의존 역전 원칙에서 의존성이 역전되는 시점은 컴파일 시점이라는 것이다. 런타임 시점에는 구현체에 의존하지만, 컴파일 시점 또는 소스 코드 단계에서의 의존성이 역전되는 것을 의미하며, 코드에서는 UserService가 PasswordEncoder라는 인터페이스에 의존하게 된다.

    💡 JVM 메모리 영역에 대해서 설명해주세요.

  • JVM 메모리 영역은 크게 Method, Stack, Heap 영역으로 구분된다.

  • Method 영역 : 모든 스레드가 공유하는 메모리 영역이며, 클래스, 인터페이스, 메소드, 필드, static 변수 등의 바이트 코드를 보관한다. 프로그램의 시작부터 종료까지 메모리에 남아있다.

  • 스택 영역 : 지역 변수와 매개변수 등의 값이 저장되는 공간이며, 메소드 호출 시 생성되어 메소드 종료 시 메모리가 해제된다.

  • 힙 영역 : new 키워드로 생성되는 객체, 배열 등이 저장되는 동적 메모리 영역으로, GC에 의해 메모리 관리가 수행된다. 영역의 생명주기도 GC에 의해 결정된다.

💡 객체와 클래스에 대해서 설명해주세요.

  • 클래스는 어떠한 목적을 위한 객체의 상태와 행동을 프로그래밍 언어로 정의한 것을 말한다.
  • 객체는 보통 인스턴스라고 부르는데, 이는 클래스를 통해 생성한 고유한 객체의 복사본을 의미한다. 모든 복사본은 고유하다.

💡 생성자에 대해서 설명해주세요.

  • 클래스를 통해 객체를 생성할 때, 객체의 기본 상태값을 초기화 해주기 위한 메소드를 말한다.

💡 Wrapper 클래스란 무엇이고 Boxing과 UnBoxing에 대해서 설명해주세요.

  • 원시 타입을 객체로 다루기 위해 사용하는 클래스들을 의미한다. 대신에 해당 클래스는 원시타입에 확장된 기능을 제공한다.
  • Boxing은 원시타입 변수에서 래퍼 클래스 객체로 자동 변환되는 것을 말한다.
  • UnBoxing은 래퍼 클래스 객체에서 원시타입으로 자동 변환되는 것을 말한다.

💡 Synchronized에 대해서 설명해주세요.

  • 여러 개의 쓰레드가 공유 자원에 접근 시, 이를 동기로 처리하기 위해서 사용하는 예약어이다.
  • 데이터의 thread-safe를 보장하기 위해서 사용된다.
  • 필요한 경우, 신중하게 사용해야 할 필요가 있으며, 남용할 경우 성능 저하의 원인이 될 수 있다.

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

  • new String() 은 말 그대로 new 연산자를 통해서 실제 힙 메모리에 공간을 할당하는 것을 의미한다.
  • 리터럴은 String Constant pool에 있는 값을 복사해 오는 것을 의미한다.

💡 String, StringBuffer, StringBuilder 간의 차이점에 대해서 설명해주세요.

  • String은 불변성을 갖으며, 모든 String의 실제 값은 변하지 않는다.대신에 이로 인해 thread-safe하다는 특징이 있다.
  • StringBuffer는 가변성을 갖으면서, 멀티 스레드 환경에서 동기화가 가능하여, thread-safe 하다는 특징을 갖는다.
  • StringBuilder는 가변성을 갖으면서, thread-safe하지 않다는 특징을 갖으므로, 싱글 스레드 환경에서만 사용된다.

💡 접근 제한자가 무엇인지 설명해주세요.

  • Public : 전역에서 접근 가능
  • Default : 동일 패키지 내에서만 접근 가능
  • Protected : 동일 패키지 내에서만 사용 가능하지만, 상속관계의 경우 접근이 가능.
  • Private : 클래스 내에서만 접근 가능

💡 static에 대해서 설명해주세요.

  • static 요소는 클래스가 로더에 의해 메모리 위에 올라갈 때, 초기화 되는 자원으로, 인스턴스 생성 없이 바로 사용 가능하다.
  • 따라서, 사용 시 클래스명에 닷을 붙혀서 호출한다.
  • 모든 객체에서 메모리를 공유한다는 특징이 있고, 힙 영역 밖에 있으므로, 프로그램 시작과 끝을 함께한다.

💡 Inner 클래스의 장점에 대해서 설명해주세요.

  • 관련 있는 클래스 간에 캡슐화를 통해 코드의 복잡성을 줄일 수 있다.
  • 주의해야할 점은 내부 클래스 사용 시, 외부 클래스에 대한 참조를 가지고 있어, GC로 부터 삭제 대상으로 안잡힐 수도 있어, 메모리 비용을 증가시킬 수 있다. 따라서, 이를 위해서 일반적으로 내부 클래스를 static 자원으로 정의하여 사용한다.

💡 리플렉션이란 무엇인지 설명해주세요.

  • 동적으로 자바 클래스의 정보에 접근할 수 있는 자바에서 제공하는 기능을 말한다.
  • 접근 제한자를 무시하고 접근이 가능하며, 성능 저하의 원인이 될 수 있어서 이 점을 고려하여 사용해야 한다.

💡 CheckedException과 UnCheckedException의 차이점에 대해서 설명해주세요.

  • CheckedException은 컴파일 시점에 확인이 가능한 예외를 의미한다. UnCheckedException은 런타임 시점에 확인되는 예외를 말한다.

💡 Optional에 대해서 설명해주세요.

  • Java8 부터 사용하는 기술로 Optional를 제공하여 null로 인해 발생하는 예외가 일어나지 않도록, 도와주고 Optional 클래스의 메소드를 통해 null을 컨트롤 할 수 있다.
profile
백엔드 서버 엔지니어

0개의 댓글