728x90
- 어셈블리어
어셈블리: 기계 명령어와 일상 용어를 일대일로 매칭하는 코드표
어셈블리어: 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어
CPU마다 실행할 수 있는 기계어가 다르므로 어셈블리어도 다르게 만들어짐
어셈블러: 어셈블리어를 기계어로 번역해주는 소프트웨어
- C언어
어셈블리어로 개발할 때는 기계의 종류에 따라 다른 소스파일을 만들어야 했음
C언어 -> 하나의 소스파일을 각 기계어에 맞는 컴파일러로 컴파일하여 기계어 목적파일을 만들기 때문에
기계에 상관없이 개발이 가능해짐
하지만 운영체제의 특성에 맞게 컴파일하기 전에 각 기종별로 소스코드를 수정할 필요가 있음
- Java의 등장
객체지향 언어 , 클래스없이 개발이 불가능
- 장점
- 플랫폼에 영향을 받지 않으므로 다양한 환경에서 사용 가능: 운영체제에서 직접 실행하는 것이 아니라 가상 머신에서 먼저 실행하고, 이 가상 머신이 운영체제에 맞는 실행 파일로 바꿔주기 때문!
- 객체 지향 언어이기 때문에 유지보수가 쉽고 확장성이 좋음
- 프로그램이 안정적: 포인터를 사용하지 않아 메모리를 직접 제어할 수 없음
- 풍부한 기능을 제공하는 오픈 소스
- 개발할 수 있는 프로그램: 웹 서버, 안드로이드 앱, 게임
- 환경설정
- JDK(Java Development Kit)
- Java 애플리케이션 개발을 위해 반드시 필요, Java 컴파일러가 포함
- 일반적으로 OpenJDK + 제조사의 부가 기능 (ex. Oracle JDK)
- JRE가 포함되어 있음
- JRE(Java Runtime Environment), JVM(Java Virtual Machine)
- Java로 컴파일 된 어플리케이션을 실행하는 역할
- 모든 Java 어플리케이션은 JVM이라고 하는 가상의 컴퓨터 공간에서 실행됨
- JDK(Java Development Kit)
JDK 다운로드 링크
InterlljJ 설치
- JetBrain에서 개발한 Java 전용 IDE(Integrated Development Environment, 통합 개발 환경)
https://www.jetbrains.com/ko-kr/idea/download/?section=mac#section=mac
- Java 소스코드는 [파일명].java라는 파일 형식으로 루트 디렉토리에 패키지로 구분되어 작성됨
- 자바 컴파일러를 통해 번역된 바이트 코드는 out 디렉토리에 [파일명].class라는 형태로 저장됨
- main 함수 작성
public class Hello {
public static void main(String[] args) {
}
}
- "Hello, world!" 출력
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
- Java의 실행 과정
- 개발자가 자바 소스파일(.java) 작성
- JDK가 제공하는 javac(컴파일러)를 사용하여 소스파일 컴파일
- JVM의 Class Loader는 컴파일로 생성된 바이트 코드(.class)를 전달 받아 동적 로딩을 통해 클래스 로딩하여 JVM 내부 Runtime Data Area에 로드
- Class Loader: 프로그램 상의 모든 클래스, 변수 및 메서드의 정보를 Method Area에 배치. 동적으로 클래스를 로드하고 정적 변수와 메서드는 Heap Area에 배치함
- JVM의 Execution에 의해 기계어로 해석되어 실행
- Execution(실행 엔진):
- Interpreter: 바이트 코드를 한줄씩 읽고 번역. 느리다는 단점이 존재. 이를 보완하기 위한 JIT 컴파일러.
- JIT 컴파일러: Interpreter 방식으로 실행을 하다가 적당한 시점에 바이트 코드 전체를 컴파일하여 캐싱(컴파일한 코드를 저장해둠)
- Garbage Collector: 사용되지 않는 메모리를 추적하여 비워주는 기능을 가짐
- Execution(실행 엔진):
- Compile 언어: 소스파일 전체를 컴파일 한 후 기계어를 CPU와 메모리를 통해 읽어서 바로 실행하는 방식으로 동작하는 언어
- 종류: C, C++, Java, C# 등
- 소스파일이 클수록 컴파일 과정이 오래 걸림
- 실행 속도가 빠름
=> Java는 javac에 의해 컴파일 되지만 JVM에서 인터프리터로 실행되므로 Compile 언어이지만 Interpreter 언어의 특징을 가짐
- Interpreter 언어: 소스파일을 컴파일하지 않고 Interpreter를 사용하여 한줄 씩 번역하면서 실행하는 방식으로 동작하는 언어
- 종류: Javascript, Ruby, Python 등
- 별도의 목적 파일이 존재하지 않음
- 수정 및 디버깅이 편리
- Interpreter만 존재하면 어디서든 실행이 가능하므로 자유롭고 독립적
- 실행속도가 느림
- 전 처리 과정 이해하기
JRE이 메인 메서드를 포함하고 있는지 확인한 후 부팅시킨 JVM이 가장 먼저하는 일
- java.lang 패키지를 Method Area에 배치
- import한 패키지도 Method Area에 배치
- 프로그램 상의 모든 클래스, 변수 및 메서드 정보를 Method Area에 배치
- 정적 변수와 메서드는 Heap Area에 배치
- Runtime Data Areas
자바 프로그램에서 발생하는 데이터를 저장하는 역할. 데이터의 속성에 따라 영역이 분리되어 있음.
- PC Register: 스레드가 시작될 때마다 생성되는 공간으로, 스레드마다 하나씩 존재. 스레드가 어떤 명령에 의해 실행되어야 할지에 대한 기록을 하는 부분으로 현재 수행하고 있는 JVM의 명령 주소를 갖고 있음.
- Native Method Stack: 기계어로 작성된 프로그램을 실행시키는 영역. 자바 이외의 언어로 작성된 코드르 실행할 때 할당됨. Java Native Interface를 통해 바이트 코드로 전환하여 저장. 커널이 독자적으로 프로그램을 실행시키는 영역
- Method Area: 클래스 정보를 처음 메모리 공간에 올릴 때 초기화 되는 대상을 저장하기 위한 공간. 모든 스레드가 공유.
- Runtime Concstant Pool: 상수 자료형을 저장하여 참조하고 중복을 막는 역할 수행
- Heap Area: 객체가 생성되는 영역.
1. Permanent Generation: 생성된 객체들의 정보의 주소값이 저장된 공간
2. New/Young Generation
- Eden: 객체들이 최초로 생성되는 공간
- Survivor 0, 1: Eden에서 참조되는 객체들이 저장되는 공간
- Eden 영역에 객체가 가득차게 되면 Garbage Collector에 의해 Eden 영역의 값들을 Survivor 1 영역에 복사하고 나머지 객체들을 삭제
3. Tenured Generation
- Old: 이곳의 객체들은 Garbage Collector에 의해 삭제됨
- New/Young Generation에서 일정시간 살아남은 객체들이 저장되는 공간
- Stack Area: 메서드를 빠져나가면 소멸이 되는 데이터를 저장하기 위한 영역. 쌓이는 메서드의 단위를 스택 프레임이라고 부름. 멀티 스레드 환경에서 각 스레드가 고유의 스택 영역을 가진다는 특징이 있