ch1 자바, JVM

김민지·2022년 11월 6일
0

자바의정석

목록 보기
1/8

자바언어의 특징

1. 운영체제의 독립적

  • 자바파일은 컴파일러에 의해 바이트코드로 변환된다.(.java -> .class)
    jvm은 .class를읽어서 운영체제에 맞게 잘 번역해준다
    그래서 어떤 운영체제든 간에 상관없이 JAVA를 실행시킬 수 있다
  • 운영체제에 따라 실행을 위한 프로그램 변경 불필요
  • Program이 실행되면 Process가 생성이 되고 Memory에 그 process의 Address Space가 할당되게 됩니다. 그리고 그 Address Space안은 위 그림과 같이 Code, Data, Stack 부분으로 이루어져 있습니다.

2. 객체지향언어

  • 절차지향이 아닌 객체지향이다

절차지향 vs 객체지향

  • 절차지향: 순차적인 처리를 지향하여 프로그램 전체가 유기적으로 연결되도록 하는 프로그래밍 기법
  • 객체지향: 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍기법
  • 순차적처리 vs 객체간의 관계를 중심으로 처리
  • 데이터보다는 해당 프로그램이 하고자하는 목적을 중심으로 설계된것이 객체지향프로그래밍
  • 절차지향은 데이터를 중심으로 함수를 구현합니다. 이에 반해 객체지향은 기능을 중심으로 메서드를 구현
    -> 객체지향은 최대한 데이터를 주고받지 않고 무엇을 해달라 라고 요청하는 식으로 상호작용을 한다는얘기

절차지향 예시 코드

function 빵만들기(){
let ingredient = 'flour';
// 절차 1. 밀가루를 준비해볼까요?
function bake(el){
el + ' bake';

return el
}
//절차 2. 재료를 받으면 구워버립시다!

let progress = bake(ingredient);

//절차 3. 밀가루를 구워볼까요?

if(progress === 'flour bake'){
return 'bread'
//절차 4. 잘 구워졌다면 빵 완성!
}
}

객체지향 예시 코드

class 빵만들자{
constructor(value) {
    this.ingredient = value;
    this.bread = null;
  }
  bake(){
  this.bread = this.ingredient + ' bake';
  if(this.bread === 'flour bake'){
  this.bread = 'bread';
  return this.bread
  }
}
// class 만들기

dobbyKitchen = new 빵만들자('flour');

dobbyKitchen.bake();  ----> 'bread'

절차지향의 단점

  • 유지보수가 어려움
    ㄴ모든 구성요소가 긴밀하게 연결되어있기때문에 하나가 고장나면 전체가 쓸수없게된다.

절차지향의 장점

  • 빠르다

객체지향의 장점

  • 높은 재사용성
  • 유지보수 용이 (고장난 부품만 고치면 되기때문)
  • 자연스러운 모델링(객체는 세상에 존재하는 모든 것이기때문에 모델링이 자연스럽다)

객체지향의 단점

  • 개발속도가 느리다
  • 개발하기 어렵다
  • 실행속도도 느리다

객체지향

https://jongminfire.dev/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80
https://velog.io/@flre_fly/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5

3. 가비지 컬렉터를 이용한 자동 메모리 관리

4. 네트워크 분산처리 지원

  • 물리적으로 떨어져있는 컴퓨터들이 작업을 처리하고 그 결과를 서로 교환하는것?
  • 풍부하고 다양한 네트워크 프로그래밍 라이브러리(Java API)를 통해 비교적 짧은 시간에 네트워크 관련 프로그램을 쉽게 개발 할 수 있도록 지원

5. 멀티쓰레드 지원

  • 멀티스레드: 하나의 프로세스에서 다수의 스레드가 돌 수 있는 것
  • 응용프로그램: 워드, 엑셀 등 우리가 현재 사용하는 프로그램을 의미한다.
  • 프로그램: 아직실행되지 않은 상태, 운영체제에 의해 메모리공간할당안받은 상태
  • 프로세스: 프로그램이 운영체제에 의해 메모리를 할당받은상태(=실행된상태)가 프로세스
    실행x - 프로그램
    실행o - 프로세스
  • 스레드: 프로세스 내에서 실행되는 여러 흐름의 단위
  • 스레드의 역할: 프로그램 코드를 한줄씩 실행하는것

멀티스레드 vs 싱글스레드

  • 예를들어 두개의 작업이 있다고 가정해보자.
    이 두개의 작업을 처리하기 위해서는 싱글쓰레드의 경우에는 첫번째 작업을 시작하고 끝낸 후다음 두번째 작업을 시작한다.
    멀티쓰레드의 경우에는 두개의 쓰레드가 두개의 작업을 짧은시간동안 번갈아가며 수행하기 때문에
    두개의 작업이 동시에 처리되는것으로 보인다.
    즉, 멀티태스킹(multitasking)이 된다는 소리이다.
    멀티태스킹(multitasking) : 두가지 이상의 일을 동시에 처리하는 것
    실제 작업시간은 싱글쓰레드와 멀티쓰레드의 큰 차이는 없는 편이다.
    다만 멀티쓰레드는 추가로 작업전환(context switching)이라는 작업이 들어가기때문에
    조금 더 오래걸린다고 볼 수 있다.
  • 쉬운 예를 들면 p2p사이트에서 2개의 파일을 다운로드한다고 해보자.
    싱글쓰레드라면 첫번째파일을 모두 다운로드를 완료한 후 두번째 파일을 다운로드시작할것이다.
    하지만 멀티쓰레드에선 첫번째파일과 두번째파일의 다운로드가 동시에 수행된다.
    (동시에 수행된다기 보다는 첫번째 파일과 두번째 파일을 번갈아가면서 다운로드 하기 때문에 동시에 다운로드
    되는것으로 보인다)
    이러한 차이점이 있다고 생각하면 편하다

6. 동적로딩지원

동적 로딩

프로그램을 실행할 때, 필요할 때마다 동적으로 메모리를 생성하고, 필요없는 메모리는 자동으로 메모리에서 소멸시킨다.
필요한 기능만 메모리에 불러와 사용하기 때문에, 큰 프로그램도 작은 메모리에서 실행이 가능하다.
프로그램의 실행 속도가 느려질 수 있다.

정적 로딩

프로그램을 실행할 때, 모든 실행파일이 메모리에 로드된다.
모든 기능이 메모리에 존재하므로, CPU가 필요로하는 기능을 빠르게 메모리에서 가져와 사용할 수 있다.
메모리를 많이 차지한다.

동적로딩의 장점

  • 자바에서 참조하는 라이브러리들은 실행파일에 영향을끼치지 않고 자유롭게 새로운 기능들을 추가할 수 있다.
  • 기존의 c나c++은 라이브러리 내부 소스코드가 변경되면 소스파일들을 다시 컴파일하고 링크해서 새로운실행파일을 생성해야했지만 자바는 필요한 라이브러리를 필요할때 불러와서 적재할 수 있기때문에 실행할때 변경된 라이브러리가 자동적으로 참조됩니다

빌드, 컴파일의 차이

컴파일: 소스코드->바이너리파일 과정
빌드: 소스코드->SW산출물 과정
링크: a라는 소스코드에서 b라는소스코드를 사용할때가 있다. 각각을 컴파일하면 a와 b는 서로를 찾지 못한다. 서로를 찾게 도와주는 과정이 링크이다.
빌드안에 컴파일이 속해있다.
빌드툴EX) Maven, Gradle...

JVM이란

  • 자바를 실행하기위한 가상컴퓨터
  • 자바와 OS사이의 중개자 역할
  • 가상기계: 소프트웨어로 구현된 하드웨어를 뜻하는 넓은 의미의 용어
  • 일반애플리케이션: app->os-> 하드웨어
    자바애플리케이션: app->jvm->os->하드웨어
  • jvm을 거침 + 하드웨어에 맞게 컴파일한 다음에 실행시키는게 아니라 실행시에 해석됨(인터프리터방식)
    -> 속도가 느림
  • jit컴파일러 + 최적화기술 -> 속도격차줄임
  • 그렇다고 jvm이 없으면? -> os에 종속적
  • 내 애플리케이션을 다른 os에서 실행시키려면 애플리케이션을 os에 맞게 변경하는일이 필요.
  • 바이트코드: 가상 컴퓨터(Virtual Machine)에서 돌아가는 실행 프로그램을 위한 이진 표현법
  • 인터프리터와 jit컴파일러를 통해 바이트코드-> 기계어로 번역

JVM의 구조

Class Loader(클래스 로더)

자바 컴파일러를 사용해서 .java 파일을 .class(바이트코드) 파일로 컴파일함. 이후, Class Loader를 통해 JVM에 .class 파일을
로드하고, 링크를 통해 배치하는 작업을 수행한다.

  • 링크:
    프로젝트 내 여러 개의 소스파일이 생성되고 A라는 소스파일에서 B라는 소스파일에 존재하는 함수(메서드)를 호출하는 경우가 존재하는데 이때 A와 B 소스파일 각각을 컴파일만 하면 A가 B에 존재하는 함수를 찾질 못하기 때문에 호출할 수가 없다.
    A와 B를 연결해주는 작업을 링크라고 합니다. 즉, 여러 개로 분리된 소스파일들을 컴파일한 결과물에서 최종 실행 가능한 파일을 만들기 위해 필요한 부분을 찾아서 연결해주는 작업을 링크라고 한다.

Execution Engine(실행 엔진)

.class 파일을 실행시키는 역할이다. 클래스 로더가 JVM 내의 Runtime Data Area에 .class(바이트코드) 를 배치하고, 이를 실행 엔진에 의해 실행된다.

  • 실행엔진에는 인터프리터와 JIT컴파일러가 있다

인터프리터와 컴파일러의 차이

  • 미리 번역을 해놓고 실행하면 컴파일
    그때그때 번역하고 실행하면 인터프리터
  • 반복되는 코드는 JIT컴파일러로 보낸다(매번 번역->실행 하는것보단 미리 번역해두는게 반복코드입장에선 효율적일테니)

자바의 특징

  • 자바에서 모든 코드는 반드시 클래스 안에 존재해야 하며, 서로 관련된 코드들은 그룹으로 나누어 별도의 클래스를 구성하게 된다.
    그리고 이 클래스들이 모여 하나의 Java 애플리케이션을 이룬다.
  • 소스파일의 이름은 public class의 이름과 일치해야 한다.
  • 소스파일(.java)과 달리 클래스파일(.class)은 클래스마다 하나씩 만들어지므로 위의 Hello2.java를 컴파일하면 Hello2.class와 Hello3.class 모두 두개의 클래스 파일이 생성된다.

JVM의 메모리구조

Method: 모든스레드가 공유, 클래스,인터페이스,static변수 등의 바이트코드를 저장
Heap: 모든스레드가 공유, new키워드로 만들어진것들이 보관됨, gc의 관리를 받는 공간
Stack: 각스레드별로 존재, 스택프레임(메서드를 위한 공간)으로 구성됨
pc register: 각스레드별로 존재, 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지
native method stack: 자바 언어외로 된 코드들이 저장되는 공간


출처
https://beingdesigner.tistory.com/2
https://luv-n-interest.tistory.com/1009
https://blog.naver.com/drogba02/221632424858
https://string.tistory.com/67?category=966562
https://catsbi.oopy.io/df0df290-9188-45c1-b056-b8fe032d88ca
https://velog.io/@hi_potato/Java%EC%9D%98-%EC%A0%95%EC%84%9D-%EC%9E%90%EB%B0%94%EB%A1%9C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0-class
https://steady-coding.tistory.com/305
https://brownbears.tistory.com/407
https://hot-dobby.tistory.com/6

profile
안녕하세요!

0개의 댓글