JAVA 란
- 대표적인 객체지향 프로그래밍 언어
- 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체지향 개념의 특징인 캡슐화,상속,다형성이 잘 적용된 언어
장점
- JVM ( 자바 가상 머신 ) 위에서 동작하여, 운영체제에 독립적이다.
- 가비지 콜렉터( G.C Garbage Collector )를 통한 자동적인 메모리 관리가 가능하다.
단점
- 다중 상속이나 타입에 엄격하며, 제약이 많다.
- JVM 위에서 동작하기 때문에 실행속도가 상대적으로 느리다.
프로세스, 스레드
프로세스란
- 단순히 실행 중인 프로그램
- 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말한다.
- 이러한 프로세스는 프로그램에 사용되는 데이터와 메모리등의 자원 그리고 스레드로 구성된다.
스레드란
- 스레드란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미,
- 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다.
- 또한 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 한다.
JDK , JRE
JDK ( Java Development Kit ) 자바 개발 키트
- JAVA를 사용하기 위해 필요한 모든 기능을 갖춘 JAVA용 SDK (Softwar Development KIt) 이다.
- JDK는 JRE를 포함하고 있다. JRE에 있는 모든 것 뿐만 아니라 컴파일러(javac)와 jdb,javadoc과 같은 도구도 있다. 즉 JDK는 프로그램을 생성,실행,컴파일 할 수 있다.
JRE ( Java Runtime Environment ) 자바 런타임 환경
- JVM + 자바 클래스 라이브러리( Java Class Library )등으로 구성되어 있다.
- 컴파일 된 Java 프로그램을 실행하는데 필요한 패키지이다.
요약
JDK 는 자바 프로그램을 실행,컴파일,개발용 도구
JRE ,JVM을 모두 포함하는 포괄적인 키트
JRE는 자바 프로그램을 실행 할 수 있게하는 도구 이다. JVM을 포함하고 있다.
SDK
하드웨어 플랫폼, 운영체제 또는 프로그래밍 언어 제작사가 제공하는 툴이다.
키트의 요소는 제작사마다 다르다. SDK의 대표적인 예로 JDK가 있다.
SDK 를 활용하여 애플리케이션을 개발 할 수 있다.
JVM , 메모리 구조
JVM ( Java Virtual Machine )
자바를 실행하기 위한 가상 기계(컴퓨터)
- OS에 종속받지 않고 CPU가 JAVA를 인식, 실행할 수 있게 해주는 가상의 컴퓨터
- JAVA 소스코드 즉 원시코드(*.java)를 JavaCompiler가 OS가 인식 할 수 있는 기계어가 아닌 JVM이 인식 할 수 있는 *.class라는 Java bytecode로 변환 시켜주고 , 변환된 바이트코드를 JVM이 OS가 바이트코드를 이해할 수 있도록 해석해준다. 따라서 바이트코드는 JVM위에서 OS 상관없이 실행될 수 있는 것이다.
- Java Compiler = JDK 를 설치하면 bin에 존재하는 javac.exe를 말한다. 즉 JDK에 Java Compiler가 포함.
- 바이트코드 = JVM이 이해할 수 있는 언어로 변환된 자바 소스코드 , 컴파일러에 의해 변환된 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불린다.
- 바이트 코드는 다시 실시간 번역기 또는 JIT 컴파일러에 의해 바이너리 코드로 변환된다.
- 바이너리 코드 = 이진코드라고도 함, 컴퓨터가 인식 할 수 있는 0과 1로 구성된 이진코드
- 기계어 = 0과 1로 이루어진 바이너리 코드, 기계어가 이진코드로 이루어져 있을 뿐 모든 이진 코드가 기계어인 것은 아니다. 기계어는 특정한 언어가 아니라 CPU가 이해하는 명령어 집합이며 , CPU 제조사마다 기계어가 다를 수 있다.
- JIT 컴파일러 = JIT 컴파일 (Just-In-Time Compliation) 또는 동적 번역 이라고 한다. JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러이다, 인터프리터 방식의 단점을 보완하기 위해 도입 되었다.
- JVM의 구성요소
- 클래스 로더(Class Loader)
- JVM 내로 클래스파일(*.class)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
- 런타임시 동적으로 클래스를 로드하고 Jar파일 내 저장된 클래스들을 JVM위에 탑재
- 즉 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크하는 역할을 한다.
- 실행 엔진(Execution Engine)
- 클래스를 실행시키는 역할, 클래스 로더가 JVM내의 런타임 데이터 영역에 바이트코드를 배치시키고 이것은 실행 엔진에 의해 실행된다.
- 인터프리터
- 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다. 하지만 한줄 씩 수행하기 때문에 느리다는 단점이 있다.
- JIT 컴파일러
- 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 해당 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식이다.
- 가비지 콜렉터
- 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제함.
- 인터프리터
- 클래스를 실행시키는 역할, 클래스 로더가 JVM내의 런타임 데이터 영역에 바이트코드를 배치시키고 이것은 실행 엔진에 의해 실행된다.
- 런타임 데이터 영역 ( 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간 )
- 메소드 ( 클래스 ,스태틱 )영역
- 메소드 영역은 JVM이 동작해서 클래스가 로딩될때 생성되고, 클래스파일의 바이트코드가 저장되는 공간,
- 클래스 로더에 의해 로드된 클래스 이름 , 부모 클래스 이름, 메서드 ,변수등의 클래스 정보를 저장 (전역변수 포함)
- JVM이 동작하고 클래스가 로드될 때 적재되서 프로그램이 종료될 때까지 저장 된다. 명시적 Null 선언시 GC가 관리.
- 모든 스레드가 공유 ( 1개의 공간만 존재 )
- 힙 영역
- new 연산자로 생성되는 클래스와 인스턴스 변수, 배열 타입 등 Reference Type이 저장되는 곳이다.
- JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.
- 당연히 Method Area 영역에 저장된 클래스만이 생성이 되어 적재된다. (당연한 소리이긴 하다)
- 모든 Object타입 (String,Integer,ArrayList 등) 은 heap 영역에서 생성된다. 몇개의 스레드가 존재하든 단 하나의 Heap영역만 존재하며 이는 모든 스레드에서 공유하는 공간입니다.
- 객체가 더이상 쓰이지 않거나 명시적 Null 선언 시 GC가 청소
- 모든 스레드가 공유 ( 1개의 공간만 존재 )
- PC레지스터
- 스레드가 시작될 때마다 생성됨.
- JVM이 수행할 명령어의 주소를 저장하는 공간. 현재 수행중인 JVM 명령의 주소를 가짐.
- 각 스레드 별로 생성
- JVM Stack 영역
- 스레드가 생성될 때마다 하나씩 생성되며 각 스레드들이 독립적으로 가지고 있는 메모리공간
- 메서드 호출 시마다 각각의 스택 프레임( 그 메서드만을 위한 공간)이 생성된다. 메서드 수행이 끝나면 프레임별로 삭제를 한다.
- 메서드 안에서 사용되는 값들을 저장. 호출된 메서드의 매개변수,지역변수,리턴 값 및 연산시 일어나는 값들을 임시로 저장한다.
- 네이티브 메소드 스택
- 바이트 코드가 아닌 기계어로 작성된 코드를 실행하는 공간.
- 다른 언어( C/C++ )로 작성된 코드를 위한 공간
- Java Native Inerface를 통해 바이트코드로 변환
- Java Code를 수행하다 JNI 호출 시 JavaStack에서 Native Stack으로 동적 연결을 통해 확장
- JNI (Java Native Interface)호출 시 생성
- 각 스레드 별로 생성
- JNI ( Java Native Interface )
- 자바가 다른 언어로 만들어진 어플리케이션과 상호 작용할 수 있는 인터페이스 제공하는 프로그램이다.
- JNI는 JVM이 Native Method를 적재하고 수행할수 있도로 한다.
- 실질적으로 제대로 동작하는 언어는 C / C++ 정도 밖에 없다고 한다.
- Native Method Library
- C, C++로 작성된 라이브러리를 칭한다.
- 만일 헤더가 필요하면 JNI는 이 라이브러리를 로딩해 실행한다.
- 메소드 ( 클래스 ,스태틱 )영역
- 클래스 로더(Class Loader)
메서드 영역은 JVM이 시작될 때 생성되는 공간으로 바이트 코드(.class)를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이다.
JVM이 동작하고 클래스가 로드될 때 적재되서 프로그램이 종료될 때까지 저장 된다.
메서드 영역은 JVM이 시작될 때 생성되는 공간으로 바이트 코드(.class)를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이다.
JVM이 동작하고 클래스가 로드될 때 적재되서 프로그램이 종료될 때까지 저장 된다.
스택(stack) 영역: 컴파일 타임에 크기가 결정됨
힙(heap) 영역: 런타임시 크기가 결정됨(동적할당)
컴파일 타임: 소스코드가 실행가능한 기계어코드로 변환되어 머신에서 실행가능한 프로그램이 되며, 이러한 편집과정을 컴파일 타임이라고 한다.
런타임: 컴파일 과정을 마친 프로그램이 사용자에 의해 실행되고 이러한 응욜프로그램이 동작되는 시점을 런타임이라고 한다.
GC
가비지 컬렉션이란??
- JVM에서 메모리를 관리해주는 모듈,
- Heap 메모리를 재활용 하기 위해서 더이상 참조되지 않고있는 객체들을 메모리에서 해제 해주는 모듈
- 개발자가 직접 메모리에 대한 할당 / 해제를 해줄 필요가 없어 개발시간이 단축되는 장점이있지만 G.C가 객체에 대한 참조를 조회하는 과정 (Mark and Sweep)을 진행하는 동안 잠깐 스레드가 중단되어 성능이 떨어지는 단점도 존재함.
가비지 컬렉션의 동작방식
- Stop The World
- 가비지 컬렉션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업,
- GC가 실행될 때는 GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업이 중단되고, GC가 완료되면 작업이 재개된다.
- Mark and Sweep
- Mark
- 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
- Sweep
- Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업
- Stop The World를 통해 모든 작업을 중단시키면, GC는 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각이 어떤 객체를 참고하고 있는지를 탐색하게 된다. 그리고 사용되고 있는 메모리를 식별하는데, 이러한 과정을 Mark라고 한다. 이후에 Mark가 되지 않은 객체들을 메모리에서 제거하는데, 이러한 과정을 Sweep라고 한다
- Mark
Minor GC , Major GC
JVM의 Heap영역은 처음 설계될 때 다음의 2가지를 전제(Weak Generational Hypothesis)로 설계되었다.
- 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 된다.
- 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.
즉, 객체는 대부분 일회성되며, 메모리에 오랫동안 남아있는 경우는 드물다는 것이다. 그렇기 때문에 객체의 생존 기간에 따라 물리적인 Heap 영역을 나누게 되었고 Young, Old 총 2가지 영역으로 설계되었다. 초기에는 Perm 영역이 존재하였지만 Java8부터 제거되었다.
Young 영역(Young Generation) - Minor GC
- 새롭게 생성된 객체가 할당되는 영역
- 대부분의 객체가 금방 Unreachable 상태가 되기 때문에 많은 객체가 Young영역에 생성되었다가 사라진다.
- Young영역에 대한 가비지 컬렉션을 MInor GC라고 한다.
Minor GC를 정확히 이해하기 위해서는 Young 영역의 구조에 대해 이해를 해야 한다. Young 영역은 1개의 Eden 영역과 2개의 Survivor 영역, 총 3가지로 나뉘어진다.
- Eden 영역
- 새로 생성된 객체가 할당되는 영역
- Survivor
- 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역
동작 순서
- 새로 생성된 객체가 Eden에 할당
- 객체가 계속 생성되어 Eden영역이 꽉차게되고 Minor GC가 실행된다.
- Eden영역에서 사용되지 않는 객체의 메모리가 해제된다.
- Eden영역에서 살아남은 객체는 1개의 Survivor 영역으로 이동
- 1~2번의 과정이 반복되다가 Survivor영역이 가득차게 되면 Survivor영역의 살아남은 객체를 다른 Survivor영역으로 이동시킨다 ( 1개의 Survivor영역은 반드시 빈 상태가 된다 )
- 이러한 과정을 반복하여 계속해서 살아남은 객체는 Old영역으로 이동 (Promotion)된다.
Old영역(Old Generation)
Young 영역에서 오래 살아남은 객체는 Old 영역으로 Promotion됨을 확인할 수 있었다. 그리고 Major GC는 객체들이 계속 Promotion되어 Old 영역의 메모리가 부족해지면 발생하게 된다. Young 영역은 일반적으로 Old 영역보다 크키가 작기 때문에 GC가 보통 0.5초에서 1초 사이에 끝난다. 그렇기 때문에 Minor GC는 애플리케이션에 크게 영향을 주지 않는다. 하지만 Old 영역은 Young 영역보다 크며 Young 영역을 참조할 수도 있다. 그렇기 때문에 Major GC는 일반적으로 Minor GC보다 시간이 오래걸리며, 10배 이상의 시간을 사용한다.
- Young영역에서 Reachable 상태를 유지하며 살아남은 객체가 복사되는 영역
- Young영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다.
- Old 영역에 대한 가비지 컬렉션을 Major GC 또는 Full GC라고 부른다.
- Old 영역이 Young 영역보다 크게 할당되는 이유는 Young 영역의 수명이 짧은 객체들은 큰 공간을 필요로 하지 않으며 큰 객체들은 Young 영역이 아니라 바로 Old 영역에 할당되기 때문이다.
객체지향 언어
객체지향 언어란??
- 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)은 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
객체지향의 4대 요소
- 추상화 : 객체들의 공통적인 특징 (속성,기능)을 뽑아 이름을 붙이는 것으로 불필요한 부분을 생략하고 객체의 속성 중 가장 중요한 것에만 중점을 두어 개략화 하는 것을 말한다.
- 캡슐화 : 특정 객체가 독립적으로 역할을 수행하기 위해 필요한 데이터와 기능을 하나로 묶어놓은 것, (모듈화) 객체의 속성(Data Fields)과 행위(메서드)를 하나로 묶고 실제 구현 내용 일부를 외부에 감추어 은닉한다.
- 상속 : 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 기법, 코드를 공통적으로 관리하여 코드의 추가와 변경에 유리하여 코드의 재사용성을 높이고 중복 코드를 제거하여 생산성과 유지보수에 유리하다.
- 다형성 : 프로그램 언어의 각 요소들 (상수,변수,식,객체,메소드 등 )이 다른 다양한 자료형(Type)에 속하는 것이 허가되는 성질을 말한다.
다형성의 예
오버로딩 (Overloading) : 같은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다른 것
오버라이딩 (Overriding): 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 것,
장점
- 코드 재사용성이 높다.
- 남이 만든 클래스를 가져와서 이용할 수 있고,상속을 통해 확장해서 사용할 수 있다.
- 유지보수가 쉽다.
- 절차지향 프로그래밍 같은 경우 일일이 찾아 수정해야하는 반면, 객체지향은 수정해야할 부분이 클래스 내부에 멤버변수 혹은 메서드로 있기 때문에 해당 부분만 수정하면 됩니다.
- 대형 프로젝트에 적합하다.
- 클래스 단위로 모듈화 시켜서 개발 할 수 있으므로, 대형 프로젝트처럼 여러명,여러 회사에서 개발 필요시 업무 분담하기 쉽다.
단점
- 처리속도가 상대적으로 느리다.
- 객체가 많으면 용량이 커질수 있습니다.
- 설계시 많은 시간과 노력이 필요하다.
Class , 객체 , 인스턴스 개념
Class
- 객체를 만들어 내기 위한 설계도 혹은 틀
- 연관되어 이는 변수와 메서드의 집합
- 변수 = 하나의 값을 저장할 수 있는 공간
- 메서드 = 메서드란 특정 기능을 정의한 코드들의 집합이라고 생각하면 된다.
객체 (Object)
- 소프트웨어 세계에 구현할 대상
- 클래스의 인스턴스라고도 부른다.
- 객체는 설계도(클래스)를 기반으로 생성되며, 자신의 고유 이름과 상태, 행동을 갖습니다.
여기서 상태는 필드(fields), 행동은 메소드(Method)라고 표현합니다. - 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.
- OOP의 관점에서 클래스의 타입으로 선언되었을 때 '객체'라고 부른다.
인스턴스( Instance )
- 설계도를 바탕으로 소프트웨어 세계에 실제로 구현된 구체적인 실체
- 객체에 메모리가 할당되어 실제로 활용되는 실체는 '인스턴스'라고 부릅니다.
- 실체화된 인스턴스는 메모리에 할당된다.
- 인스턴스는 객체에 포함된다고 볼 수 있다.
- OOP의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다.
- 실행 프로세스는 프로그램의 인스턴스이다.
- 인스턴스라는 용어는 반드시 클래스와 객체 사이의 관계로 한정지어서 사용 할 필요는 없다.
- 인스턴스는 어떤 원본(추상적인 개념)으로부터 '생성된 복제본'을 의미한다.
Static 키워드
- Static 키워드를 사용한 변수 , 메서드는 클래스가 메모리에 올라갈때 함께 초기화 되며 , 인스턴스 생성 없이 사용 할 수 있다 ( New 생성자 )
- 같은 클래스에 선언된 static 변수 , 메서드가 선언된 메모리를 공유합니다.
- 메서드 영역에서 메모리를 관리 합니다.
- 인스턴스 생성없이 바로 사용가능 하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용
- static은 자주 변하지 않는 값이나 공통으로 사용되는 값 같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어들이는 것보다 일종의 '전역변수'와 같은 개념을 통해 접근하는 것이 비용도 줄이고 효율도 높일 수 있다.
추상클래스와 인터페이스
추상 클래스
- Class 앞에 'abstract' 키워드를 사용하여 정의하며, 하나 이상의 추상 메서드를 가지는 클래스를 말한다. 추상메서드를 선언하여 상속을 통해서 하위 클래스에서 ( 반드시 ) 구현하도록 강제하는 클래스.
- 추상메서드를 포함하지 않는 클래스에서도 'abstract'를 붙혀 추상 클래스로 지정이 가능하다 , 반대로 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 한다!!
- 추상클래스는 상속을 위한 클래스이기 때문에 new 키워드를 통해 직접 객체를 생성 할 수 없다.
- 인터페이스와 다르게 static이나 final이 아닌 필드를 가질 수 있고, 모든 접근 제어자를 사용 할 수 있다.
인터페이스
- 'interface'키워드를 사용하여 선언하며, 상수(static final)와 추상메서드(abstract method)의 집합이다.
- 추상 클래스보다 추상화 정도가 높으며 추상클래스와는 다르게 구현부가 있는 일반 메서드, 일반 멤버 변수를 가질 수없다는 특징이 있다.
- 모든 메서드는 'public abstract'로 선언해야 하며, 이를 생략할 수 있습니다. 또한 모든 멤버 변수는 'public static final'으로 선언해야 하며 ,마찬가지로 이를 생략 할 수 있다. ( 컴파일시 자동으로 생성해주기 때문 )
공통점
- 공통점은 메서드의 선언만 있고, 구현의 내용이 없다는 것 (추상 메서드)
- new 키워드를 통해 객체를 생성 할 수 없으며,상속받은 클래스가 반드시 선언된 추상 메서드를 구현하도록 한다는 점
차이점
- 추상 클래스는 extends 키워드로 상속을 하며 , 다중 상속이 불가능하다, 반면 인터페이스는 implements 키워드를 사용하며 다중 상속이 가능하다.
- 추상클래스는 추상 클래스를 상속받아 기능을 이용하고 , 확장시키는 목적으로 사용,
- 인터페이스는 함수의 껍데기만 존재, 함수의 구현을 강제해 구현 객체의 같은 동작을 보장하기 위해 사용
자바의 런타임 동작 과정
- 개발자가 자바 소스코드(.java)를 작성합니다.
- Compiler에서 Javac로 해당 코드들을 .Class 파일로 변환시킨다 ( 바이트 코드로 변환 ) 아직 컴퓨터가 읽을 수 없는 자바 가상 머신이 이해할 수 있는 코드입니다. 바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있습니다.
- 컴파일된 바이트 코드를 JVM의 클래스로더(Class Loader)에게 전달합니다.
- 클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data area), 즉 JVM의 메모리에 올립니다.
- 클래스로더 세부 동작
- 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드합니다.
- 검증 : 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어있는지 검사
- 준비 : 클래스가 필요로 하는 메모리를 할당한다.
- 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.
- 초기화 : 클래스 변수들을 적절한 값으로 초기화 합니다 (Static 필드)
- 클래스로더 세부 동작
- 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행합니다. 이때, 실행 엔진은 두가지 방식으로 변경합니다.
- 인터프리터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행합니다. 하나하나의 실행은 빠르나, 전체적인 실행속도가 느리다는 단점을 가집니다.
- JIT 컴파일러 (Just-In-Time Compiler) : 인터프리터의 단점을 보완하기 위해 도입된 방식으로, 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식, 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠릅니다.
바이너리 코드란?
바이너리 코드는 컴퓨터가 인식할 수 있는 0과 1로 구성된 이진코드를 의미한다.
바이트 코드란?
CPU가 이해할 수 있는 언어가 바이너리 코드라면 바이트 코드는 가상 머신이 이해할 수 언어이다.
CPU가 아닌 가상 머신에서 이해할 수 있는 코드를 위한 이진 표현법이다. 즉, 가상 머신이 이해할 수 있는0과 1로 구성된 이진코드를 의미.
어떤 플렛폼에도 종속되지 않고 실행될 수 있는 가상 머신용 기계어 코드이다.
'CS지식' 카테고리의 다른 글
CS 공부 - HTTP (0) | 2023.04.02 |
---|---|
CS 공부 -Spring (0) | 2023.03.23 |
기술면접 DB (0) | 2023.03.19 |
HTTP 동작원리 (0) | 2023.03.15 |
CS 공부 자바 -2 (0) | 2023.03.12 |