IT 기초지식/CS 스터디

[CS스터디] JAVA 1.

예린_dev 2022. 6. 6. 21:23
  • JVM의 구조와 Java의 실행방식을 설명해주세요.
    • JVM(Java Virtual Machine)
      • Java는 OS에 종속적이지 않다는 특징을 가지고 있다. OS에 종속받지 않고 실행되기 위해선 OS 위에서 Java를 실행시킬 무언가가 필요하다. 그것이 JVM이다. 즉, OS에 종속받지 않고 CPU가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터이다.
      • JVM은 크게 Class Loader, Execution Engine, Garbage Collector, Runtime Data Area이 있다.
        • Class Loader: JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈(시스템에 대한 독립된 하위 단위)이다. 런타임 시에 동적으로 클래스를 로드합니다.
        • Execution Engine: 클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행한다.
        • Garbage Collector: 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할이다.
        • Runtime Data Area: JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다. 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있다.
          • Method Area: 모든 쓰레드가 공유하는 메모리 영역이다. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관한다.
          • Heap Area: 모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역이다. 또한, 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.
          • Stack Area: 메소드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성된다. 그리고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다. 마지막으로, 메서드 수행이 끝나면 프레임별로 삭제한다.
          • PC Register: 쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재한다. 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖는다.
          • Native method Stack: 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.
    • Java 실행방식
      • 먼저, 자바 컴파일러에 의해 자바 소스 파일은 바이트 코드로 변환된다.
      • 그리고 이러한 바이트 코드를 JVM에서 읽어 들인 다음에 어떤 운영체제이든 프로그램을 실행할 수 있도록 만든다.
  • GC(Garbage Collector)가 무엇인지, 필요한 이유는 무엇인지, 동작방식에 대해 설명해주세요.
    • Garbage Collector은 더 이상 사용하지 않는 메모리를 자동으로 정리하는 기능이다. (힙 메모리 영역)
    • 가령 C언어는 프로그래머가 메모리를 할당한 뒤 수동으로 해제까지 직접 해 줘야 한다. 그래서 메모리를 할당해놓고 필요없어진 뒤에도 해제를 하지 않으면 메모리 누수가 생기거나 거꾸로 해제했던 메모리를 다시 사용하는 실수 등에 버그가 양산된다. 이러한 문제를 해결하기 위해 GC가 필요하다.
    • GC의 동작방식
      • Stop The World: 가비지 컬렉션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업
      • Mark and Sweep
        • Mark: 사용되는 메모리와 사용되지 않은 메모리를 식별하는 작업
        • Sweep: Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업
  • 제네릭에 대해서 설명해주세요.
    • 데이터 타입을 일반화하는 것을 의미, 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다.
    • 장점
      • 클래스나 메소드 내부에서 사용되는 개체의 타입 안정성을 높일 수 있다.
      • 반환 값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.
  • 애노테이션에 대해서 설명해주세요.
    • 사전적 의미: 주석
    • 코드 사이에 주석처럼 쓰여서 특별한 의미, 기능을 수행하도록 하는 기술이다. 즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있다.
    • 용도
      • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
      • 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공
      • 실행시(런타임시) 특정 기능을 실행하도록 정보를 제공
        • 컴파일 vs 런타임:
          • 프로그램을 생성하기 위해 개발자는 첫째로 소스코드를 작성하고 컴파일이라는 과정을 통해 기계어코드로 변환되어 실행 가능한 프로그램이 되며, 이러한 편집과정을 컴파일타임이라고 부른다.
          • 컴파일과정을 마친 프로그램은 사용자에 의해 실행되어 지며, 이러한 응용프로그램이 동작되어지는 때를 런타임이라고 부른다.
  • 오버라이딩과 오버로딩이 무엇이며 어떤 차이가 있을까요?
    • 오버라이딩: 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것 (오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 한다.)
      • 조건
        • 자식 클래스에서 오버라이딩하는 메소드의 접근 제어자는 부모 클래스보다 더 좁게 설정할 수 없다.
        • 예외는 부모 클래스의 메소드보다 많이 선언할 수 없다.
        • static 메소드를 인스턴스의 메소드로 또는 그 반대로 바꿀 수 없다.
    • 오버로딩: 자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다. (매개변수의 차이로만 구현)
      • 사용하는 이유
        • 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다.
        • 메소드의 이름을 절약할 수 있다.
반응형