본문 바로가기

2주차 회고

  # - **WIL** (Weekly I Learn) 2주차 **회고** -

## "OOP" 객체지향 프로그래밍?  
<br>
 
> 객체지향 프로그래밍(Object-Oriented Programming)=OOP
> >프로그램을 설계하는 개념이자, 방법론이며, 단어의 뜻 그대로 프로그램(실세계)를 객체(사물)라는 기본 단위로<br>
   나누고 이 객체들간의 상호작용을 기본 개념으로 한다.  
   <br>  
     
   <br>  
   
   <br>  

   ### **객체지향의 4 특징**  
   1.  **추상화(Abstraction)**   -abstract, interface-  
     - 목적과 관련이 없는 것을 제거하고 필수적인 요소만을 표현해 둔 것으로 <br>  
     용도에 맞는 필수적인 요소들을 강제적으로 포함시키기 위함이다.<br>  
     <br>  

   2. **캡슐화(Encapsulation)**  -public, private, protected-  
      - 연관있는 변수와 메소드를 묶어주는 것을 말하고, 접근제어자를 통해 외부로부터의 접근을 제한하여 객체 내에서만<br>  접근이 가능하도록 해주며, 정보은닉이라고도 한다.<br>  
      외부의 클래스 혹은 모듈에 의존적인 프로그램의 경우 변경이나 오류에 취약해 정보은닉을 통해서<br>  
      결합도를 낮추며 응집도를 높여준다.
   3. **상속(Inheritance)**  
      - 상속을 통해 부모클래스의 속성과 기능을 상속받아 사용하는 것을 말한다. <br>  
      중복되는 속성과 기능이 발생되는데 상속을 통해 중복되는 기능의 반복을 줄일 수 있다.  
      - 자식은 부모의 클래스로 상속받는다.  
      - 다형을 통해 변경이 필요한 부분을 변경하여 사용할 수 있다.
   4. **다형성(Polymorphism)**   -Overriding, Overloading-
      - 부모, 자식 상속 관계에 있는 클래스에서 상위 클래스가 동일한 메시지로 <br>  
        하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리.  
        - Overriding :  
         부모클래스를 상속받은 자식 클래스에서 부모 클래스의(추상) 메소드를 같은 이름, 반환값, 인자로<br>  
          메소드 내의 로직들을 새롭게 정의함.<br>  
          즉, 부모 클래스를 상솓받는 자식클래스들이 같은 이름으로 다른 기능을 사용할 수 있는데, 입맛대로 재정의 함.  
        - Overloading :  
          하나의 클래스에서 같은 이름의 메서드들을 여러개 가질 수 있지만 메서드 인자들은 달라야 함(반환값은 제외).<br>  
          인자들의 타입이나 개수가 다르면 메서드 이름이 같더라도 어떤 메서드를 호출할지 컴파일러는 안다.<br>  
          같은 클래스 내에서 메서드명을 같게 해주는 이유는 따로 따로 만들면 효율성이 떨어지기 때문이다.  
<br>

<br>

<br>

<br>
 
<br>  

<br>  
 

  # **JVM?**
<br>  
 Java Virtual Machine 가상 머신의 약어.<br>  
 가상머신이란? 프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것.<br>  
 JVM 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여, 자바 API와 실행한다.<br>  
 또한 JAVA와 OS사이에서 중개자 역할로 재사용 가능하게 한다. 메모리 관리, Garbage collection을 수행한다.<br>  
 ARM 아키텍처같은 하드웨어는 레지스터 기반으로 동작하는데 비해 스택기반으로 동작하는 가상머신이다.<br>  

 <br>  
 
 <br>  

 <br>  

 ### **JVM을 왜..알야야 됨.? 필요한 것인가...입문자에겐 질문이다**  
 최고의 성능을 내되 한정된 메모리를 효율적으로 사용하기 위해서?... <br>  

 메모리 효율성을 위해 메모를 구조를 알아야 하기 때문이고,, 동일한 기능의 프로그램이어도 메모리 관리에 따라 <br>  
 성능은 달라지듯..! 메모리 관리가 되지 않은 경우 속도저하나, 튕김이 발생할 수 있다. 그래서 알아야 하는구나...!!!
 <br>  

 <br>  

 <br>  

 <br>  


### **JVM 구성**  
 <br>  

 1. Class Loader  
    - JVM내로 클래스(.class)를 로드하고, 링크를 통해 배치하는 모듈이다. Runtime시에 동적으로 클래스를 로드한다. <br>  
    jar 파일 내 저장된 클래스들을 JVM 위에 탑재하고 사용하지 않는 클래스들은 메모리에서 삭제한다. <br>  

    자바는 동적코드, 컴파일 타임이 아니라 Runtime에 참조한다. 즉, 클래스를 처음으로 참조할 때,  <br>  

    해당 클래스를 로드하고 링크하고, 그 역할을 클래스 로더가 수행한다. <br>  

     <br>  

 2. Execution Engine  
    - 클래스를 실행시키는 역할로 클래스 로더가 JVM내에 Runtime 데이터 영역에 바이트 코드를 배치시키고, <br>  

      실행엔진에 의해 실행된다. java 바이트코드는 기계가 바로 수행할 수 있는 언어보단 사람이 보기 편한 형태로 <br>  

      기술됬고, 실행엔진은 이와 같은 바이트코드를 실제 JVM내부에서 기계가 실행할 수 있는 형태로 변경한다. <br>  

      이 때 두가지 방법을 사용하게 된다. <br>  

       <br>  

 3. Interpreter  
    - 실행 엔진은 java 바이트코드를 명령어 단위로 읽어서 실행하고 이 방식은 인터프리터 언어의 단점을 그대로 갖고 있다. <br>  

    한 줄씩 수행하기 때문에 느리다. <br>  

     <br>  

 4. JIT  
    - 인터프리터의 단점을 보완하기 위해서 도임된 컴파일러 JIT. 인터프리터 방식으로 실행하닥 적절한 시점에 <br>  

      바이트코드 전체를 컴파일 해 네이티브 코드로 변경하고, 이후에 더 인터프리팅하지 않고, 직접 실행하는 방식이다. <br>  

      네이티브 코드는 캐시에 보관하기 때문에 컴파일 된 코드는 빠르게 수행한다. JIT컴파일러의 컴파일 과정은 <br>  

      바이트코드를 인터프리팅하는 것보다 오래걸리므로 한번만 실행되는 코드라면 컴파일하지 않고 인터프리팅 하는 것이 유리하다.<br>  

      JIT 컴파일러를 사용하는 JVM들은 내부적으로 해당하는 메서드의 빈도수 체크하고, 일정 정도를 넘을 때 컴파일 수행한다<br>  

<br>  

 5. Garbage collerctor  
    - GC를 수행하는 모듈(스레드)가 있다.