항해 2주차 WIL

백승한·2022년 7월 3일
0
post-thumbnail
  • 이번주 배운것
    알고리즘, 자료구조
  • 느낀것
    이번 알고리즘 주차에서 테스트를 볼 때 했던 '유튜브에 문제풀이 영상올리기'를 하루 한 문제라도 지속해서 하겠다는 것이다. (만약 내가 할 수 있다면...)
    비로소 코드 설명할 수 있을 때 체화단계에 다다른다.

📂 객체지향 프로그래밍이란?

객체 지향 프로그래밍이란 프로그램을 설계하는 개념이자 방법론입니다. 철자를 줄여서 OOP라고 부르며 객체라는 기본 단위로 나누고 이 객체들간의 상호작용을 기본개념으로 합니다.

객체지향 프로그래밍은 프로그램을 유연하고 변경하기 쉽게 만들기 때문에 재사용성이 용이하여 대규모 프로젝트에서 많이 사용되는 방법론 입니다.

⚔ 객체지향 장점과 단점

  • 장점

    1. 코드 재상용이 용이
    남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있다.
    2. 유지보수가 쉽다.
    절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 된다.
    3. 대형 프로젝트에 적합.
    클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 프로젝트를 개발할 때 업무 분담하기 쉽다

  • 단점

    1. 처리속도가 상대적으로 느림
    2. 객체가 많으면 용량이 커질 수 있다.
    3. 설계시 많은 시간과 노력이 필요.

🖊 객체지향 키워드

  • 추상화
    공통의 속성이나 기능을 묶어 이름을 붙이는 것이고, 객체 지향적 관점에서 클래스를 정의하는 것을 바로 추상화라고 정의 내릴 수 있습니다.
    좀 더 살펴보면 물고기, 사자, 토끼, 뱀이 있을 때 우리는 이것들을 각각의 객체라 하며 이 객체들을 하나로 묶으려 할 때, 만약 동물 또는 생물이라는 어떤 추상적인 객체로 크게 정의한다고 하면 이때 동물 또는 생물이라고 묶는 것을 추상화라고 합니다.

  • 캡슐화
    캡슐화는 일반적으로 변수와 함수를 클래스로 묶는 작업을 말합니다. 캡슐화를 할 때에는 무작위로 클래스를 지정하는 것이 아니라 연관된 목적을 가지고 있는 변수와 함수별로 작업을 해야 합니다.
    또한, 캡슐화는 외부의 잘못된 접근으로 값이 변하는 것을 막기 위해 클래스 내의 변수나 함수를 감추거나 드러내는 은닉성을 지니고 있습니다. 이러한 은닉성은 자바에서 접근제어자를 통해 실현시킬 수 있습니다.

  • 상속성
    상속성이란 상위 개념의 특징을 하위 개념이 물려받는 것입니다.
    객체지향의 하이라이트 부분이라고 칭합니다. 상속이란 개념이 없으면 객체지향이나 절차지향이나 도진개진이죠.
    기존의 클래스에 새로운 기능을 추가해 새로운 클래스를 만들 수도 있습니다.
    이때 기존에 있던 클래스는 부모클래스(parent class), 슈퍼클래스(super class),
    새로 만들어진 클래스는 자식클래스(child class), 서브클래스(sub class)입니다.

  • 다형성(Polymorphism)
    - 부모클레스에서 물려받은 가상 함수를 자식 클래스 내에서 오버라이딩 되어 사용되는 것
    - 간단히 예를 들자면,  군대에서 나는 K2 소총을 잡았고 동기는 K1 소총을 잡았다. 사격 훈련이 있을 때 중대장이 '준비된 사수부터 발사!'라고 외치면  나와 내친구는 명령을 받고 앞의 사로를 향해 총을 쏜다. 이때 중대장은 추상적 객체를 상속받은 모든 객체들에게 명령을 내린것이고  그 병사가 총이 뭐든간에 그냥 발사를 하라는 명령을 한것이다.  즉, 다형성이 없다면 K1 소총을 든 병사 발사, K2 소총을 든 병사 발사 라며 명령을 하나하나 내려야 할 것이다

  • 다형성을 사용함으로써 갖는 장점은?!
    같은 기능의 자료형만 다른 메서드를 서로 다른 이름으로 기억하지 않아도 되고 부모 클래스의 정의된 메소드가 자식 클래스에 맞지 않는 경우, 부모 클래스의 메소드를 수정하지 않고 자식 클래스에 특정한 구현을 제공할 수 있습니다.

💻 JVM이란?

JVM은 Java Virtual Machine의 약자로, 자바 가상 머신이라고 부릅니다. 그리고 자바와 운영체제 사이에서 중개자 역할을 수행하며, 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와줍니다. 또한, 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며, 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택 기반으로 동작합니다.

아래는 자바 프로그램의 실행 단계입니다.

먼저, 자바 컴파일러에 의해 자바 소스 파일은 바이트 코드로 변환됩니다. 그리고 이러한 바이트 코드를 JVM에서 읽어 들인 다음에, 이것저것 복잡한 과정을 거쳐서 어떤 운영체제든간에 프로그램을 실행할 수 있도록 만드는 것입니다.

만약, 자바 소스 파일은 리눅스에서 만들었고 윈도우에서 이 파일을 실행하고 싶다면, 윈도우용 JVM을 설치만 하면 됩니다. 여기서 JVM은 운영체제에 종속적이라는 특징을 알 수 있습니다.

JVM 메모리 구조

위에서 자바 프로그램의 실행 단계를 아주 간략하게 소개하였는데, JVM의 구체적인 수행 과정은 언급하지 않았습니다. 이제부터는 JVM이 정확히 어떻게 동작을 하고 구조가 어떤지 알아 봅시다.

아래는 자바 프로그램의 실행 단계입니다. 분량상 운영체제 도형은 생략하였습니다. JVM의 구조는 크게 보면, Garbage Collector, Execution Engine, Class Loader, Runtime Data Area로, 4가지로 나눌 수 있습니다.

위에서 설명하였듯이, 자바 소스 파일은 자바 컴파일러에 의해서 바이트 코드 형태인 클래스 파일이 됩니다. 그리고 이 클래스 파일은 클래스 로더가 읽어들이면서 JVM이 수행됩니다.

(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의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다. 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있습니다.

1. Method area

모든 쓰레드가 공유하는 메모리 영역입니다. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관합니다.

2. Heap area

모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역입니다. 또한, 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역입니다.

3. Stack area

메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성합니다. 그리고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장합니다. 마지막으로, 메서드 수행이 끝나면 프레임별로 삭제합니다.


4. PC Register

쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재합니다. 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖습니다.

5. Native method stack

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다.

자료출처-1
자료출처-2

profile
방문해주셔서 감사합니다🙂

0개의 댓글