객체지향 프로그래밍과 JVM

임소윤·2022년 8월 15일
0

WIL

목록 보기
2/5

객체지향 프로그래밍(OOP: Object-oriented Language)

컴퓨터 프로그래밍의 한가지 기법으로 객체를 만들고 객체를 사용하는 프로그래밍 방법


객체지향 언어의 특징 : 캡슐화, 상속, 다형성, 추상화

1. 캡슐화(Encapsulation)
하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메소드를 하나로 묶는 것.

  • 데이터와 코드의 형태를 외부로부터 알 수없게 한다.(정보은닉)
  • 보호된 변수는 getter나 setter 등의 메서드를 통해서만 간접적으로 접근이 가능하다.

2. 상속(Inheritance)
상위 클래스의 내용을 하위 클래스가 모두 이어 받는다.

3. 다형성(Polymorphism)
상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해준다.(같은 형태 다른의미)

다형성의 대표적인 예 : 자바의 오버로드, 오버라이딩

  • 오버로딩(Overloading) : 메서드의 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것.
  • 오버라이딩(Overriding) : 상속 받은 하위 클래스가 메서드의 내용만 변경(재정의) 하는 것.

4. 추상화(abstraction)
객체의 공통적인 속성과 기능을 추출하여 정의하는 것.

  • 공통적인 특성을 파악해서 필요 없는 특성을 제거하는 과정.

객체지향 언어의 장단점

장점

  • 재사용성
    상속을 통해 프로그래밍시 코드의 재사용을 높일 수 있음.

  • 생산성 향상
    잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상할 수 있음.

  • 유지보수 용이
    프로그램 수정 시 추가, 수정을 하더라도 캡슐화를 통해 주변 영향이 적기 때문에 유지보수가 쉬워서 매우 경제적이라 할 수 있음.

단점

  • 느린 개발 속도
    모든 객체의 역할과 기능을 이해해야 하기 때문에 프로그래밍에 많은 시간이 소요된다.

  • 느린 실행 속도
    객체지향언어의 처리 속도는 절차지향언어보다 느리다.

  • 높은 난이도
    객체지향언어는 대체로 난이도가 높다.




JVM(Java Virtual Machine)

Java Virtual Machine 즉, 자바를 실행하기 위한 가상 기계

가상기계란? - 소프트웨어로 구현된 하드웨어를 뜻하는 넓은 의미의 용어

자바와 운영체제 사이에서 중개자 역할을 수행하며, 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 돕는다. 또한, 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며, 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택 기반으로 동작한다.


JVM 메모리 구조

  1. Class Loader
  2. Execution Engine
  3. Garbage Collector
  4. Runtime Data Area
    • Method Area
    • Heap Area
    • Stack Area
    • PC Register
    • Native Method Stack

1. Class Loader
JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈입니다. 런타임 시에 동적으로 클래스를 로드합니다.

2. Execution Engine
클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명렁어 단위로 읽어서 실행합니다. 최초 JVM이 나왔을 당시에는 인터프리터 방식이었기때문에 속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 통해 이 점을 보완하였습니다. JIT는 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿈으로써 실행이 빠르지만 역시 변환하는데 비용이 발생하였습니다. 이 같은 이유로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행합니다.

3. Garbage Collector
Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 합니다. 이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없습니다.

4. Runtime Data Area
JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다.

1. Method Area :
모든 쓰레드가 공유하는 메모리 영역입니다. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관합니다.
2. Heap Area :
모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역입니다. 또한, 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역입니다.
3. Stack Area :
메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성합니다. 그리고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장합니다. 마지막으로, 메서드 수행이 끝나면 프레임별로 삭제합니다.
4. PC Register :
쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재합니다. 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖습니다.
5. Native Method Stack :
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다.


<참고자료>
https://lxxyeon.tistory.com/86
https://steady-coding.tistory.com/305

0개의 댓글