Java 애플리케이션 실행 과정

Question) "Java 애플리케이션 실행 과정에 대해 설명해 주세요."

먼저, 컴파일러.java 형태의 자바 소스 코드
.class 형태의 바이트 코드로 변환 합니다.

이후, Class Loader바이트 코드
런타임 데이터 영역 (Runtime Data Area)에 로딩 시킵니다.

로딩된 바이트 코드실행 엔진 (Execution Engine)에 의해 실행 됩니다.


※ Java의 바이트 코드

  • .class 확장자
  • JVM이 읽을 수 있는 코드
  • 주의) 바이트 코드 라고 해서 0100111 형태가 아님




Java 메모리 구조

1) Tread 공통

① Method Area

  • 각 클래스 별로 전역 변수, 정적 변수, 메소드 정보

② Heap Area

  • 동적 할당 메모리

2) Thread 별

① PC Register

  • 현재 수행 중인 JVM 명령어

② JVM Stack (Stack Area)

  • 메소드의 매개변수, 지역 변수, 리턴 정보

③ Native Method Stack

  • Java 외의 다른 언어로 작성된 코드

Question) "Java 메모리 구조에 대해 설명해 주세요."

자바 메모리 구조는 크게 5가지 영역으로 구분 됩니다.
우선, 쓰레드 공통으로 Method Area, Heap Area가 존재 합니다.
쓰레드 별로는 PC Register, JVM Stack, Native Method Stack이 존재 합니다.

  • Method Area는 클래스 별로 전역 변수, 정적 변수, 메소드 정보들이 저장되는 영역 입니다.
  • Heap Area는 런타임 중, 생성되는 객체들이 동적으로 할당되는 영역 입니다.
  • PC Register는 현재 수행중인 JVM 명령어가 저장되는 영역 입니다.
  • JVM Stack은 호출된 메소드의 매개변수, 지역 변수, 리턴 정보들이 저장되는 영역 입니다.
  • Native Method Stack은 자바 외의 다른 언어인
    C나 C++로 작성된 코드를 수행하기 위한 영역 입니다.




가비지 컬렉션 (GC, Garbage Collection)

  • JVM에서 메모리를 관리해주는 모듈

  • Heap 메모리를 재활용

  • Mark and Swip 동작
    : 실행을 잠시 멈추고, 더 이상 참조되지 않는 객체들을 찾고 메모리에서 제거


Question) "GC (가비지 컬렉션)에 대해 설명해 주세요."

GCJVM에서 메모리를 관리해주는 모듈 입니다.
Heap 메모리를 재활용 하기 위해서, 더 이상 참조되지 않는 객체들을 메모리에서 제거 합니다.

개발자가 직접 메모리를 직접 정리하지 않아도 되므로,
개발 편의성 및 개발 속도가 향상되는 장점이 있습니다.

Mark and Swip 동작에서 참조되지 않는 객체를 찾는 과정이 있는데,
이때 쓰레드가 잠시 중단되어 성능이 떨어진다는 단점이 있습니다.




객체지향 프로그래밍
(OOP, Object Oriented Programming)

  • 현실 세계의 사물같은 객체를 만들고,
    객체에서 필요한 속성을 뽑아 프로그래밍 수행



1) 추상화 (Abstraction)

  • 객체들의 공통 속성, 기능을 묶어내는 것

2) 캡슐화 (Encapsulation)

  • 속성기능을 모아서 캡슐화
  • 외부로부터 숨겨야하는 정보는 숨김 (정보 은닉)

3) 상속 (Inheritance)

  • 부모 클래스속성메소드를 그대로 이어받아 사용하는 것

4) 다형성 (Polymorphism)

  • 하나의 변수명, 메소드명 등이 상황에 따라 다른 의미로 해석될 수 있는 것

    • 오버라이딩 (Overridng): 부모 클래스의 메소드를 재정의

    • 오버로딩 (Overloading): 같은 이름의 메소드를 매개변수 등을 다르게 하여 여러개 정의


Question) "OOP (객체지향 프로그래밍)에 대해 설명해 주세요."

현실 세계의 사물과 같은 객체를 만들고,
객체에서 필요한 속성을 뽑아 프로그래밍을 하는 것 입니다.

객체지향 프로그래밍은 크게 4가지 특징이 있습니다.

  • 추상화는 객체들의 공통 속성, 기능을 묶어내는 것 입니다.
  • 캡슐화는 속성과 기능을 모아서 캡슐화하며,
    외부로부터 숨겨야하는 정보를 숨기고 접근을 제한하는 것 입니다.
  • 상속은 부모 클래스의 속성과 메소드를 그대로 이어받아 사용하는 것 입니다.
  • 다형성은 하나의 변수명, 메소드명 등이 상황에 따라 다른 의미로 해석될 수 있는 것 입니다.
    부모 클래스의 메소드를 재정의하는 오버라이딩,
    같은 이름의 메소드를 매개변수 등을 다르게 하여 여러개 정의하는 오버로딩이 있습니다.

Question) "현재 방에 있는 사물들에 객체지향 프로그래밍을 적용 한다면,
객체들의 속성, 메소드들을 어떻게 정의 할지 예시를 들어 설명 해주세요."

  • 먼저, 전등을 나타내는 Light 클래스를 정의 할 것 같습니다.
    Light 클래스의 속성으로는 전등이 켜진 상태를 나타내는 boolean isLightOn 을 정의 합니다.
    메소드로는 전등을 켜고 끄는 lightOn(), lightOff() 메소드를 정의 합니다.

  • 이후, 전등을 조작하는 Switch 클래스를 정의 할 것 같습니다.
    Switch 클래스의 속성으로는 연결된 전등을 나타내는 Light light 객체를 정의 합니다.
    메소드로는 스위치를 누르는 switchOn(), switchOff() 메소드를 정의 합니다.
    switchOn(), switchOff() 메소드는 내부에서 light 객체 속성에 접근하여,
    Light 클래스의 lightOn(), lightOff() 메소드를 호출하는 방식으로 구현 합니다.

  • 최종적으로 사용자가 Switch 객체의 메소드를 호출하여,
    Light 객체를 조작
    하도록 제공 할 것 같습니다.




추상 클래스 vs 인터페이스

1) 추상 클래스

  • abstract 지시자로 정의하며, 추상 메소드가 하나 이상 포함
  • 상속 목적: 부모 클래스의 속성과 기능을 상속 받아서 재활용

2) 인터페이스

  • interface 지시자로 정의하며, 모든 메소드가 추상 메소드로 정의됨
  • 보장 목적: 인터페이스에 정의된 메소드를 구현하도록 강제함

Question) "추상 클래스와 인터페이스에 대해 설명해 주세요."

추상 클래스abstract 지시자로 정의되며, 추상 메소드가 하나 이상 포함 됩니다.
인터페이스interfacew 지시자로 정의되며, 모든 메소드가 추상 메소드로 정의 됩니다.

추상 클래스인터페이스의 차이는 존재의 목적에 있습니다.
추상 클래스상속을 받아서, 그 기능을 재활용하고 확장 시키는 데 목적이 있습니다.
인터페이스메소드 구현을 강제하여,
인터페이스를 구현한 클래스에서 같은 기능을 보장하는 데 목적이 있습니다.




profile
Silver Star

0개의 댓글