맥과 윈도우같은 운영체제에서 자바가 미리 짜놨기 때문에 두 운영체제가 호환이 된다.
그러면 운영체제 별로 각각 짜놓을 필요가 없다!
이때 운영체제 위에서 우리가 짜놓은 소스코드를 컴파일 하여 돌리게 하는것은 JVM
JVM 이란?
Java Virtual Machine 약자이며 '자바 가상 머신'이라고 부른다.
Java 는 OS에 종속적이지 않다는 특징을 가지고 있다.
자바와 운영체제 사이에서 중개자 역할을 수행하여 OS(운영체제)에 종속받지 않고 실행되기 위해선
OS 위에서 Java 를 실행시킬 무언가가 필요하다. 그게 바로 JVM이다.
즉, OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터이다.
간단한 과정설명
우리가 짠 소스코드(.java)를 자바컴파일러(javac)가 컴파일 하면 .class 파일로 바뀌는데 이것은 바이트 코드가 된다.
Byte Code 는 JVM에서 돌아가도록 만들어진 코드. 그러니까 JVM 이 읽게되는 코드다
( 나는 01001 같은 숫자인줄 알았는데 그냥 하나의 이름이다)
JVM 의 상세 구조
- jvm은 크게 4가지로 구성된다
- Class Loader : 바이트 코드를 불러와서 메모리(Runtime Data Area)에 올려놓는다
- Execution Engine : 실행엔진에서 코드를 실행한다
- Garbage Collector : 메모리 공간 자동정리 해주는?
- Runtime Data Area : 메모리 영역
정리
컴파일러가 .java 소스를 .class 파일 = 바이트 코드로 변환한다.
그다음 Class Loader 가 바이트 코드들을 런타임 데이터 영역(Runtime Data Area) 에 로드시키고
로딩된 바이트 코드를 Execution Engine(실행엔진) 에 의해 실행되게 한다.
- 메모리 영역 Runtime Data Area 는 크게 5가지로 구성된다.
공통적으로 사용되는
- Method Area : 각 클래스별로 전역변수, 정적변수, 메소드 정보들이 저장되는 공간
- Heap Area : 사용자가 사용하며 생긴 데이터가 저장되는 공간 = 데이터가 동적으로 할당된다.
스레드별로 사용되는
- PC Register : 현재 수행중인 명령어
- Stack Area : 함수에 대한 정보 (함수의 매개변수, 지역변수, 리턴정보들..)
- Native Method Stack : 자바 외 다른언어로 작성된 코드들
정리
자바 메모리구조는 크게 5가지.
스레드마다 3가지, 스레드 공통으로는 2가지가 있다
PC Register 는 현재 수행중인 JVM 명령어가 들어가있고,
JVM Stack 은 호출된 메소드의 매개변수, 지역변수, 리턴정보들이 저장된다.
Native Method Stack 는 자바 외의 언어인 C, C++ 같은 것들을 수행하기 위한 영역이고,
Method Area 는 전역변수, 정적변수, 메소드 정보들이 저장되게 한다.
Heap Area 는 런타임 중 생성되는 객체들이 동적으로 할당되는 곳이다.
가비지 컬렉션 (GC) 이란? Garbage Collection
JVM 에서 메모리 관리해주는 모듈
a=1 , b=2 라는 소스코드가 실행될 때 메모리에서 1,2 저장하는데 쓰이지 않아도 자리만 차지하고 낭비되고 있으면 비워주는 작업을 해왔다 자바에서는 JVM에서 비워주는 작업을 자동으로 작업해준다. 이것을 가비지 컬렉션이라고 한다.
어떻게 작동하는지?
소스코드가 실행하다가 메모리가 차면 잠깐 실행을 멈추고
메모리에서 어디서 참조되고 있는지 확인하는데 참조되지 않는다면? 삭제한다. → 메모리가 빈공간이 생김
이런 과정들을 Mark and Sweep 이라고 한다
정리
JVM 에서 메모리 관리해주는 모듈이다.
자세히는 Heap 메모리를 재활용하기 위해 더 이상 참조되지 않는 객체들을 메모리에서 제거하는 모듈이다.
그래서 개발자가 직접 메모리를 정리하지 않아도 개발 속도가 향상되는 장점이 있으나
Mark and Sweep 과정에서 참조되지 않는 객체를 찾는 과정이 있는데
이때 스레드가 잠깐 중단되어 성능이 떨어지는 단점이 있다.
객체지향 프로그래밍
어렵다 최소한 설명할 용어를 말하면 알아들을것.
지금 당장 어려워도 나만의 언어로 정리할 수 있는 문장을 만들어보자
현실 세계의 사물같은 객체를 만들고, 객체에서 필요한 특징을 뽑아 프로그래밍 수행
키보드,마우스 과 같은 객체의 특징을 뽑자 (필드,메서드)
ex) 키보드가 버튼이 눌린다 같은 메서드로 표현 / 어떤 상태인지를 변수로 표현
- 객체지향의 특징 4가지
1. 추상성 : 한 사물의 공통특징을 뽑아 한 개념을 만든다 ( 콜라,물의 공통점은? 마시는 것! )
2. 캡슐화 : 정보은닉을 통해 내부적으로는 높은 응집도를 가지고 외부와는 낮은 결합도를 갖도록한다.
각 객체안에 숨길건 숨기고 공개될건 공개하는데 서로 응집도는 높으나 외부와는 연결이 잘 안되도록!
3. 상속화 : A,B 클래스 안에 비슷한 기능이 있다면 B클래스에 A클래스의 기능을 상속하여 재사용하도록한다.
4. 다형성 : 데이트를 담는 리스트에 문자,숫자 등을 담기위한 메서드들을 각각 정의 할 필요없이
모두 같은 이름을 갖고 그안에 문자,숫자,다른객체들을 다~ 다르게 정의하여 다른방식으로 동작하도록 함.
추상 클래스와 인터페이스
- 추상 클래스 : abstract 지시자로 정의되고 추상메소드가 하나이상 포함 돼 있다.
- 인터페이스 : interface 지시자로 정의하며 모든 메소드가 추상메소드로 정의된다.
자바 8 이후부터 점점 두 경계가 모호해진다?
추상클래스와 인터페이스의 차이는? 존재 목적이 다르다
추상 클래스는 상속 을 위한 것이고 인터페이스는 보장 을 위한 것
추상클래스는 상속을 받아 부모 클래스 기능을 자식클래스에 재활용하여 확장시키는 목적
인터페이스는 구현한 객체들이 같은 동작을 하는 것, 즉 부모 인터페이스의 기능을 사용할 수 있도록 보장하기 위한 목적
'공부' 카테고리의 다른 글
자바의 객체지향 | http 요청 실습 (0) | 2022.11.01 |
---|---|
스프링부트 기본 개념들 (1) | 2022.08.16 |
Spring | 스프링, 의존성 주입과 제어의 역전, ORM 과JPA (0) | 2022.07.27 |
스프링 | JPA(Java Persistence API ) (0) | 2022.07.27 |
스프링 | 스프링 빈 등록방법 2가지 (0) | 2022.07.27 |