22.07.24 WIL

강지영·2022년 7월 24일
0

WIL

목록 보기
2/3

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

객체지향프로그래밍(OPP)이란?

문제를 여러 개의 객체 단위로 나눠서 작업하는 방식
클래스를 이용해 연관있는 함수(처리)와 변수(데이터)를 하나로 묶어 객체(인스턴스)를 생성해 사용한다.
대표적으로 JAVA, C# 등이 있다.

객체지향 프로그래밍의 장점

  • 대형 프로젝트
    - 프로젝트를 독립적인 객체 단위로 분리해서 작업하므로 여러 개발자와 협업해 규모가 큰 프로젝트 진행 가능
  • 코드 재사용
    - 다른 사람이 만든 클래스를 가져와 사용할 수 있으며 상속을 이용해 확장해서 사용할 수 있음
  • 유지보수
    - 수정해야 할 부분이 클래스 내부의 멤버 변수 혹은 메서드로 존재하기 때문에 해당 부분만 수정
  • 보안성
    - 캡슐화로 인해 실제로 구현되는 부분이 외부에 드러내지 않도록 하여 정보 은닉 가능

객체지향 프로그래밍의 단점

  • 느린 실행 속도
    - 캡슐와 격리구조로 인해 절차지향 프로그래밍과 비교하면 실행 속도가 느림
  • 필요한 메모리양 증가
    - 객체지향에서는 모든 것을 객체로 생각하므로 추가적인 포인터 크기와 메모리, 연산에 대한 비용이 들어감

객체지향 프로그래밍의 특징

  • 추상화(자료의 추상화)
    - 클래스를 설계하는 것
    - 공통의 속성이나 기능을 묶어 이름을 붙이는 것
  • 캡슐화
    - 기능과 특성을 한 곳에 모으고 분류하기 때문에 객체 재활용이 가능하다. 즉 캡슐화란 기능과 특성의 모음을 '클래스'라는 캡슐에 분류해서 넣는 것이다.
    - 객체가 외부에 노출하지 않아할 정보 혹은 기능을 접근제어자를 통해 제어 권한이 있는 객체에만 접근 할 수 있도록 하는 것이 가능하다.
  • 상속
    - 부모 클래스의 속성과 기능을 그대로 사용할 수 있게 하고 기능의 일부분을 변경할 경우 상속 받은 자식 클래스에서 해당 기능만 다시 정의해서 사용할 수 있다.
  • 다형성
    - 하나의 변수명, 함수명 등이 다른 의미로 해석이 가능하다. 즉 오버라이딩(Overriding), 오버로딩(Overloading)이 가능하다.
    - 오버라이딩 : 부모 클래스의 메서드와 같은 이름, 매개변수를 재정의하는 것
    - 오버로딩 : 같은 이름의 함수를 여러 개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있도록 하는 것

객체지향 프로그래밍에서 Getter / Setter 사용하는 이유

  • 메서드를 통해서 접근하므로 메서드 안에서 매개변수와 같이 어떠한 올바르지 않은 입력에 대해 사전에 처리할 수 있게 제한하거나 조절할 수 있기 때문이다

📚 JVM(Java Virtual Marchine)

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

  • JVM으로 바이트코드(.class 파일)를 OS에 특화된 코드로 변환하여 실행
    Java 소스코드, 즉 원시코드(*.java)는 CPU가 인식을 하지 못하므로 기계어로 컴파일을 해줘야한다
    하지만 Java는 이 JVM 이라는 가상머신을 거쳐서 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 바로 컴파일 되는게 아니라 JVM이 인식할 수 있는 Java bytecode(*.class)로 변환된다. Java compiler 가 .java 파일을 .class 라는 Java bytecode로 변환한다.

💡 Java compiler란?
JDK를 설치하면 bin 에 존재하는 javac.exe를 말한다. 즉, JDK에 Java compiler가 포함되어 있다는 뜻이다.
javac 명령어를 통해 .java.class로 컴파일 할 수 있다

JVM 구성요소

  • 클래스 로더(Class Loader)
    - JVM 내에 클래스 파일(*.class)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
    - 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크한는 역할

  • 실행 엔진(Execution Engine)
    - 클래스를 실행시키는 역할
    - 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경
    ▲ 인터프리터(Interpreter)
    실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행
    한 줄씩 수행하므로 속도가 느림
    ▲ JIT 컴파일러(Just-in-Time)
    인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일해 기계어로 변경하고, 그 이후에는 해당 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식
    ▲ 가비지 콜렉터(Garbage collector)
    더이상 사용하지않는 인스턴스를 찾아 메모리에서 삭제

  • 런타임 데이터 영역 (Runtime Data Area)
    프로그램을 실행하기 위해 OS에서 할당받은 메모리 공간

▲ PC Register
Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간
스레드마다 하나씩 존재하며 현재 수행 중인 JVM 명령의 주소를 가지고 있음

💡 스레드(thread)란?
스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체

▲ JVM 스택 영역
프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역
▲ Native method stack
자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
▲ Method Area (= Class Area = Static area)
클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
▲ Runtime Constant Pool
스태틱 영역에 존재하는 별도의 관리영역
상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행
▲ Heap
객체를 저장하는 가상메모리 공간
new연산자로 생성되는 객체와 배열을 저장
Class Area(Static Area)에 올라온 클래스들만 객체로 생성할 수 있음

JVM 컴파일 과정

*.java파일이 컴파일러를 통해 전달되어 소스코드를 Bytecode로 인코딩하여 소스파일에 포함된 각 클래스의 내용은 별도의 .class파일에 저장

  • 소스코드를 바이트 코드로 변환하는 동안의 컴파일러하는 과정
    Parse
    - *.java 소스파일을 읽은 뒤 결과 토큰을 AST(Abastract Syntax Tree) 노드에 매핑
    Enter
    - 정의된 심볼들을 심볼테이블(Symbol table) 에 저장
    Process annotations
    - 요청된 경우 지정된 컴파일 위치에서 찾은 애너테이션을 처리
    Attribute
    - 구문 트리에 속성을 부여하며, 이름 확인, 유형 검사 및 상수 정의가 포함
    Flow
    - 이전 단계의 트리에 대한 데이터 흐름을 분석
    - 여기에 할당 및 도달 가능성에 대한 검사도 포함됨
    Desugar
    - AST를 다시 작성하고 몇몇 syntactic sugar 들을 번역
    Generate
    - *.class파일을 생성
profile
Hello World!

0개의 댓글