WIL - 2주차 OOP, JVM … 22.05.22

BYEONGMIN CHOI·2022년 5월 22일
0

WIL(Week I Learned)

목록 보기
6/8
post-thumbnail

OOP (Object Oriented Programming)

프로그래밍을 할때 모든 것을 객체단위로 구성하여 코드의 재사용성, 유지보수가 쉽다.

  • 서술의 편의상 객체지향을 Java 위주로 소개하고 있고 class나 public 같은 용어를 사용했다. 이 경우만 객체지향에 해당하는 것으로 오해하지 않게 주의해야 한다. 모든 언어가 class나 접근 제한자(public이나 private)를 사용하지는 않는다. 대표적인 예로 JavaScript는 프로토타입 객체지향을 사용하고 있고 Python에는 접근제한자가 없다. 객체지향은 특정 언어가 아니라 개념이다. "클래스는 객체이며 구조체는 객체가 아닌 데이터의 집합"이라는 설명 역시 틀렸고, 특정 언어가 객체지향 언어라는 말도 완전히 틀린 표현이다. 나무위키

OOP의 요소

  • 캡슐화 encapsulation
    • 변수와 함수를 하나의 클래스로 묶는것
    • 정보은닉 ( Information hiding) ( '캡슐화 = 정보 은닉' 은 틀린말 python의 경우 접근제한자 없이 캡슐화가 가능하다.)
      • 프로그램의 세부 구현을 외부로 드러나지 않도록 특정 모듈 내부로 감추는 것
      • 외부로의 노출을 최소화하여 모듈 간의 결합도를 떨어뜨려 유연함과 유지보수성을 높이는 개념
      • 접근 제한자 public, protected, private 통해 외부에서 클래스 내의 접근을 제한한다.
  • 상속 Inheritance
    • 상속은 자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려받는 것
    • 기능의 일부분을 변경해야 할 경우 자식 클래스에서 상속받은 그 기능만을 수정해서 다시 정의하게 되는데, 이러한 작업을 '오버라이딩(overriding)'이라고 한다. 상속은 캡슐화를 유지하면서도 클래스의 재사용이 용이하도록 해준다.
  • 다형성 Polymophism
    하나의 변수, 또는 함수가 상황에 따라 다른 의미로 해석될 수 있는 것을 말한다.

    • 기초 클래스 또는 어떠한 인터페이스를 구현하는 상위 클래스를 생성하고, 해당 클래스를 상속받는 다수의 하위 클래스들을 만들어 상위 클래스의 포인터나 참조변수 등이 하위 클래스의 객체를 참조하게 하는 것이다. 이 때 각각의 하위 클래스는 상위 클래스의 메소드 위에 자신의 메소드를 덮어쓰는 메소드 오버라이딩(method overriding)을 수행하며, 상위 클래스의 참조변수가 어떤 하위 클래스의 객체를 참조하느냐에 따라 호출되는 메소드가 달라진다.[5] Java, C++, C#, Python, Ruby 등의 객체 지향 언어들은 기본적으로 지원하는 개념.

참고 https://www.youtube.com/watch?v=IeLWSKq0xIQ


JVM Java Virtual Machine

JVM 구성요소

OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터

Java 소스코드, *.java파일을 CPU가 인식하지 못하므로 기계어로 컴파일이 필요하다.
Java에서는 JVM이라는 가상머신을 거쳐 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 바로 컴파일 되는 것이 아니라 JVM이 인식할 수 있는 Java bytecode(*.class)로 변환된다.

Java complier 가 .java \rightarrow .class 라는 Java bytecode로 변환한다.

여기서 Java compiler는 JDK를 설치하면 bin 에 존재하는 javac.exe를 말한다. (즉, JDK에 Java compiler가 포함)
javac 명령어를 통해 .java를 .class로 컴파일 할 수 있다.

변환된 bytecode는 기계어가 아니기 때문에 OS에서 바로 실행되지 않고 JVM이 OS가 bytecode를 이해할 수 있도록 해석해준다. 따라서 bytecode는 JVM 위에서 OS관계없이 실행될 수 있는것이다.

OS에 종속적이지 않고 Java파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행이 가능한 이유이다.

bytecode 란 무엇?

가상 컴퓨터(VM)에서 돌아가는 실행 프로그램을 위한 이진 표현법

Java bytecode 는 JVM이 이해할 수 있는 언어로 변환된 자바 소스코들를 의미한다.
자바 컴파일러에 의해 변환된 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불린다.

바이트 코드는 다시 실시간 번역기 또는 JIT 컴파일러에 의해 바이너리 코드로 변환된다.

JIT 컴파일러란 ?

JIT 컴파일(just-in-time compliation) 또는 동적 번역(dynamic translation)
JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러이다.

인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 해당 코드를 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식

기계어(컴파일된 코드)는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 빠르게 수행하게 된다.
물론 JIT 컴파일러가 컴파일하는 과정은 바이트 코드를 인터프리팅하는 것보다 훨씬 오래걸리므로 한 번만 실행되는 코드라면 컴파일 하지 않고 인터프리팅하는 것이 유리하다.
따라서 JIT 컴파일러를 사용하는 JVM들은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고 일정 정도를 넣을때에만 컴파일을 수행한다.

profile
스스로 성장하는 개발자가 되겠습니다.

0개의 댓글