1. Reflection이란?
    1. 객체를 통해 클래스의 정보를 분석하는 방법. introspection (자기 관찰)의 속성을 띤다
    2. 이를 통해 실행중인 프로그램의 내부를 검사하고 속성을 수정하는 등의 행위를 할 수 있다
  2. 접근 제어자 종류 특성 설명
    1. private : 같은 클래스 내에서만 접근
    2. default : 같은 패키지 내애서만 접근
    3. protected : 같은 패키지 내, 또는 자식 클래스에서 접근
    4. public : 접근 제한 없음
  3. Static이란?
    1. 클래스가 로딩될 때, 메모리 공간을 할당하는데 처음 설정된 메모리 공간이 변하지 않음을 의미
  4. 자바의 메모리 영역
    1. 메서드 영역 : static 변수, 전역변수, 코드에서 사용되는 Class 정보 등이 올라간다. 코드에서 사용되는 class들은 로더로 읽어 클래스별로 런타임 필드데이터, 메서드 데이터 등을 분류해 저장한다.
    2. 스택(Stack) : 지역변수, 함수(메서드) 등이 할당되는 LIFO(Last In First Out) 방식의 메모리
    3. 힙(Heap) : new 연산자를 통한 동적 할당된 객체들이 저장되며, Garbage 컬렉션에 의해 메모리가 관리되어 진다.
  5. JVM 구동 순서
    1. 바이트 코드 ( .class ) 로 컴파일
    2. 클래스 로더를 통해 JVM 내부로 인입
    3. 바이트 코드 검증 및 재 해석
    4. 바이너리 코드로 변경
    5. static 변수 및 블록 초기화
    6. 인스턴스 블록 수행
    7. 생성자 호출
    8. main 함수 호출
  6. 제네릭이란?
    1. 타입 매개 변수. 타입을 매개변수(Parameter)로 사용할 수 있게 한다.
    2. 클래스에서 사용할 타입을 클래스 외부에서 설정하는 것.
    3. Java는 참조 자료형(클래스, 인터페이스)만 가능하다
    4. 기본 자료형을 사용하기 위해선 wrapper 클래스를 이용해야 함.
  7. 자바의 GC는 어떻게 동작하나요?
    1. GC 방식
      1. 힙 영역에서 사용하지 않는 객체를 제거하는 작업
      2. Minor gc는 young 영역에서 작업되며, Major는 Old 영역에서 일어납니다
      3. Minor gc의 영역은 eden에서 Survivor 1, 2로 이동되며 이는 다시 Old 영역으로 이동됩니다.
      4. Survivor 1 또는 2 영역 중 한 영역은 반드시 비어 있어야 합니다.
        1. 2개인 이유는 gc 당시 단편화를 막기 위함
        2. 각 영역은 minor gc 때마다 역할을 교체합니다.
    2. GC 종류
      1. SerialGc, Mark-Sweep-Compact, Concurrent Mark Sweep, Parallel GC, G1, Zgc, 셰넌도어
  8. hashCode() 값이 모두 같다면 어떤 일이 벌어지나요?
    1. null이 아닌 경우 모든 ==는 true이다
  9. jvm 메모리 구조를 설명해 주세요.
    1. PC Register: 현재 수행 중인 JVM 명령의 주소를 가진다
    2. Stack Area: 지역변수, 파라미터의 생성 영역. 객체 레퍼런스도 여기 저장된다
    3. Heap Area: 동적으로 생성된 객체, 배열이 저장되며 GC 대상
    4. Method Area: 상수, 맴버 변수, 메서드 정보, Type 정보 등이 저장됩니다.
  10. 람다 함수의 실제 실행 시점
    1. 런타임에 객체를 생성 할 수 있도록 레시피만을 컴파일 타임에 생성해 둔다
    2. 객체이기 때문에 this가 SimpleLambda 이다
    3. 익명 클래스와는 다르게 항상 새로운 객체를 생성하지는 않는다
  11. 람다와 함수형 인터페이스와의 관계
    1. 추상 메서드가 한 개만 존재하는 인터페이스를 간결하게 표현한 것이 람다이다
    2. JVM의 한계로 인해 내부 복잡도를 올리는 대신 기존 명세를 이용하기 위해 사용되었다
    3. 런타임에 동적으로 클래스를 정의하고 인스턴스를 생성하여 반환하도록 구현되어있다.
  12. 매니페스트 파일이란?
    1. jar 파일에서 실행하기 위한 기반 동작등을 설정하는 파일. 어플리케이션의 정보 즉, 일종의 메타정보