[JAVA NOTE]1. About JAVA
Java , JDK , J2SE , J2EE , JRE 등과 관련된 용어 정리
- Java : 프로그래밍 언어 / 개발 플랫폼에 더욱 가까움
- JDK : Java Development Kit 자바 개발 키트 , 자바 SE, 자바EE, 자바 ME 플랫폼 중 하나를 구현했음
- J2SE : Java 2 Standard Edition
- J2EE : Java 2 Enterprise Edition
- JRE : Java Runtime Environment
→ 자바 바이트코드가 JRE 위에서 동작함
→ 자바 API와 JVM으로 구성
- JVM : Java Virtual Machine
→ 자바 바이트 코드를 해석하고 실행하는 역할을 수행
- 위 언급 용어들은 모두 자바 플랫폼을 사용한 개발 혹은 실행을 위한 API
- 플랫폼 : 특정 소프트웨어를 구동할 수 있는 갖추어진 공간
- API : 프로그램 작성을 위한 도구의 모음 (함수,라이브러리)
- 라이브러리: 소프트웨어를 개발할 때 융용하게 사용할 수 있는 변수, 함수 등의 모음
→ 자바 바이트코드가 JRE 위에서 동작함
→ 자바 API와 JVM으로 구성
→ 자바 바이트 코드를 해석하고 실행하는 역할을 수행
자바의 특징
-
C , C++ 파생언어
-
Garbage Collector : 자동 메모리 정리 기능
→ 메모리에 다양한 데이터 값을 넣고 삭제하는 작업을 하며 메모리가 지저분해지는 경우 발생, 이때 Garbage Collector는 프로그램이 실행 중에 사용하지 않는 메모리를 자동해제함, 메모리 관리를 염두하지 않고 프로그램 개발 가능
-
JVM ( Java Virtual Machine)
- 코드로 작성된 프로그래밍 언어를 해석하는데 사용되는 도구의 차이 발생
- 컴파일링(프로그래밍 언어를 운영체제가 이해할 수 있는 기계어로 번역되는 과정)에서 운영체제가 맞지 않으면 다른 기계어로 번역되기 때문에 서로 다른 운영체제에서는 사용할 수 없었음 → native Language
- JVM → 운영체제와 프로그램 사이에서 프로그램이 동작하고 있는 운영체제가 무엇인지 판단한 후 해당 운영체제의 기계어로 다시 번역해줌, 따라서 운영체제와 상관 없이 프로그램 실행 가능함
C , C++ 파생언어
Garbage Collector : 자동 메모리 정리 기능
→ 메모리에 다양한 데이터 값을 넣고 삭제하는 작업을 하며 메모리가 지저분해지는 경우 발생, 이때 Garbage Collector는 프로그램이 실행 중에 사용하지 않는 메모리를 자동해제함, 메모리 관리를 염두하지 않고 프로그램 개발 가능
JVM ( Java Virtual Machine)
- 코드로 작성된 프로그래밍 언어를 해석하는데 사용되는 도구의 차이 발생
- 컴파일링(프로그래밍 언어를 운영체제가 이해할 수 있는 기계어로 번역되는 과정)에서 운영체제가 맞지 않으면 다른 기계어로 번역되기 때문에 서로 다른 운영체제에서는 사용할 수 없었음 → native Language
- JVM → 운영체제와 프로그램 사이에서 프로그램이 동작하고 있는 운영체제가 무엇인지 판단한 후 해당 운영체제의 기계어로 다시 번역해줌, 따라서 운영체제와 상관 없이 프로그램 실행 가능함
JVM (기본 기초)
- Java는 “JVM”이라는 프로그램을 통해 동작함
- Java 프로그램은 .java 확장자로 이루어져 있음
→ JAVAC Compiler를 통해 .class라는 파일로 변환
→ 각 운영체제에 설치되어있는 JVM이 *.class 파일을 실행하는 방식으로 동작
→ JAVAC Compiler를 통해 .class라는 파일로 변환
→ 각 운영체제에 설치되어있는 JVM이 *.class 파일을 실행하는 방식으로 동작
JVM 특징 (기초)
- Java 프로그램을 실행하고자 하는 컴퓨터에 JVM이 설치되어있지 않으면 실행시킬 수없음
- 같은 Java 소스코드는 여러 운영체제에서 수정하지 않고 사용할 수 있음
- Managed Language: Java와 같이 여러 운영체제에서 사용할 수 있는 프로그래밍 언어
- Managed Language는 Native Language보다 실행속도가 느림
→ JVM이 각 운영체제에 맞는 Native 언어로 변환해주는 작업이 필요하므로!!
→ Native 언어는 이런 과정 필요 X
JVM 특징 (심화)
- 스택 기반의 가상 머신: 대표적인 컴퓨터 아키텍처인 인텔 x86 아키텍처나 ARM 아키텍처와 같은 하드웨어가 레지스터 기반으로 동작하는 데 비해 JVM은 스택 기반으로 동작한다.
- 심볼릭 레퍼런스: 기본 자료형(primitive data type)을 제외한 모든 타입(클래스와 인터페이스)을 명시적인 메모리 주소 기반의 레퍼런스가 아니라 심볼릭 레퍼런스를 통해 참조한다.
- 가비지 컬렉션(garbage collection): 클래스 인스턴스는 사용자 코드에 의해 명시적으로 생성되고 가비지 컬렉션에 의해 자동으로 파괴된다.
- 기본 자료형을 명확하게 정의하여 플랫폼 독립성 보장: C/C++ 등의 전통적인 언어는 플랫폼에 따라 int 형의 크기가 변한다. JVM은 기본 자료형을 명확하게 정의하여 호환성을 유지하고 플랫폼 독립성을 보장한다.
- 네트워크 바이트 오더(network byte order): 자바 클래스 파일은 네트워크 바이트 오더를 사용한다. 인텔 x86 아키텍처가 사용하는 리틀 엔디안이나, RISC 계열 아키텍처가 주로 사용하는 빅 엔디안 사이에서 플랫폼 독립성을 유지하려면 고정된 바이트 오더를 유지해야 하므로 네트워크 전송 시에 사용하는 바이트 오더인 네트워크 바이트 오더를 사용한다. 네트워크 바이트 오더는 빅 엔디안이다.
JVM 구조와 자바 코드 수행 과정
- 클래스 로더(Class Loader)가 컴파일된 자바 바이트코드를 런타임 데이터 영역(Runtime Data Areas)에 로드하고 실행 엔진(Execution Engine)이 자바 바이트코드를 실행한다.
- 각각의 운영체제에 맞게 JVM이 있음
- JVM 구조 심화
Class Loader(클래스 로더)의 개념
- 자바는 동적 로드 , 즉 컴파일 타임이 아니라 런타임에 클래스를 처음으로 참조할 때 해당 클래스를 로드하고 링크하는 특징이 있음. 이 동적 로드를 담당하는 부분이 JVM의 클래스 로더
클래스 로더 특징
- 계층 구조: 클래스 로더끼리 부모-자식 관계를 이루어 계층 구조로 생성된다. 최상위 클래스 로더는 부트스트랩 클래스 로더(Bootstrap Class Loader)이다.
- 위임 모델: 계층 구조를 바탕으로 클래스 로더끼리 로드를 위임하는 구조로 동작한다. 클래스를 로드할 때 먼저 상위 클래스 로더를 확인하여 상위 클래스 로더에 있다면 해당 클래스를 사용하고, 없다면 로드를 요청받은 클래스 로더가 클래스를 로드한다.
- 가시성(visibility) 제한: 하위 클래스 로더는 상위 클래스 로더의 클래스를 찾을 수 있지만, 상위 클래스 로더는 하위 클래스 로더의 클래스를 찾을 수 없다.
- 언로드 불가: 클래스 로더는 클래스를 로드할 수는 있지만 언로드할 수는 없다. 언로드 대신, 현재 클래스 로더를 삭제하고 아예 새로운 클래스 로더를 생성하는 방법을 사용할 수 있다.
- 로드된 클래스들을 보관하는 네임스페이스(namespace)를 갖는다. 클래스를 로드할 때 이미 로드된 클래스인지 확인하기 위해서 네임스페이스에 보관된 FQCN(Fully Qualified Class Name)을 기준으로 클래스를 찾는다. 비록 FQCN이 같더라도 네임스페이스가 다르면, 즉 다른 클래스 로더가 로드한 클래스이면 다른 클래스로 간주된다.
클래스 로더의 종류와 특징
- 부트스트랩 클래스 로더: JVM을 기동할 때 생성되며, Object 클래스들을 비롯하여 자바 API들을 로드한다. 다른 클래스 로더와 달리 자바가 아니라 네이티브 코드로 구현되어 있다.
- 익스텐션 클래스 로더(Extension Class Loader): 기본 자바 API를 제외한 확장 클래스들을 로드한다. 다양한 보안 확장 기능 등을 여기에서 로드하게 된다.
- 시스템 클래스 로더(System Class Loader): 부트스트랩 클래스 로더와 익스텐션 클래스 로더가 JVM 자체의 구성 요소들을 로드하는 것이라 한다면, 시스템 클래스 로더는 애플리케이션의 클래스들을 로드한다고 할 수 있다. 사용자가 지정한 $CLASSPATH 내의 클래스들을 로드한다.
- 사용자 정의 클래스 로더(User-Defined Class Loader): 애플리케이션 사용자가 직접 코드 상에서 생성해서 사용하는 클래스 로더이다.
클래스 로더 동작과정
-
클래스 로더가 아직 로드되지 않은 클래스 찾았을 경우 다음과 같은 과정을 거침
-
과정
- 로드(Load) : 클래스를 파일에서 가져와서 JVM의 메모리에 로드한다. - 검증(Verifying): 읽어 들인 클래스가 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사한다. 클래스 로드의 전 과정 중에서 가장 까다로운 검사를 수행하는 과정으로서 가장 복잡하고 시간이 많이 걸린다. JVM TCK의 테스트 케이스 중에서 가장 많은 부분이 잘못된 클래스를 로드하여 정상적으로 검증 오류를 발생시키는지 테스트하는 부분이다. - 준비(Preparing): 클래스가 필요로 하는 메모리를 할당하고, 클래스에서 정의된 필드, 메서드, 인터페이스들을 나타내는 데이터 구조를 준비한다. - 분석(Resolving): 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다. - 초기화: 클래스 변수들을 적절한 값으로 초기화한다. 즉, static initializer들을 수행하고, static 필드들을 설정된 값으로 초기화한다.
런타임 데이터 영역
- JVM이라는 프로그램이 운영체제 위에서 실행되면서 할당받는 메모리 영역
- 런타임 데이터 영역은 총 6개 영역로 나눈다.
- 스레드마다 하나씩 생성
- PC 레지스터 : PC Register
- JVM 스택 : JVM Stack
- 네이티브 메서드 스택 : Native Method stack
- 모든 스레드 공유
- 힙 : Heap
- 메서드 : Method Area
- 런타임 상수 풀 : Runtime Constant Pool
- 하단은 각각의 특징을 나타냄
-
PC 레지스터: PC(Program Counter) 레지스터는 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 생성된다. PC 레지스터는 현재 수행 중인 JVM 명령의 주소를 갖는다.
-
JVM 스택: JVM 스택은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 생성된다. 스택 프레임(Stack Frame)이라는 구조체를 저장하는 스택으로, JVM은 오직 JVM 스택에 스택 프레임을 추가하고(push) 제거하는(pop) 동작만 수행한다. 예외 발생 시 printStackTrace() 등의 메서드로 보여주는 Stack Trace의 각 라인은 하나의 스택 프레임을 표현한다.
-
스택 프레임: JVM 내에서 메서드가 수행될 때마다 하나의 스택 프레임이 생성되어 해당 스레드의 JVM 스택에 추가되고 메서드가 종료되면 스택 프레임이 제거된다. 각 스택 프레임은 지역 변수 배열(Local Variable Array), 피연산자 스택(Operand Stack), 현재 실행 중인 메서드가 속한 클래스의 런타임 상수 풀에 대한 레퍼런스를 갖는다. 지역 변수 배열, 피연산자 스택의 크기는 컴파일 시에 결정되기 때문에 스택 프레임의 크기도 메서드에 따라 크기가 고정된다.
-
지역 변수 배열: 0부터 시작하는 인덱스를 가진 배열이다. 0은 메서드가 속한 클래스 인스턴스의 this 레퍼런스이고, 1부터는 메서드에 전달된 파라미터들이 저장되며, 메서드 파라미터 이후에는 메서드의 지역 변수들이 저장된다.
-
피연산자 스택: 메서드의 실제 작업 공간이다. 각 메서드는 피연산자 스택과 지역 변수 배열 사이에서 데이터를 교환하고, 다른 메서드 호출 결과를 추가하거나(push) 꺼낸다(pop). 피연산자 스택 공간이 얼마나 필요한지는 컴파일할 때 결정할 수 있으므로, 피연산자 스택의 크기도 컴파일 시에 결정된다.
-
네이티브 메서드 스택: 자바 외의 언어로 작성된 네이티브 코드를 위한 스택이다. 즉, JNI(Java Native Interface)를 통해 호출하는 C/C++ 등의 코드를 수행하기 위한 스택으로, 언어에 맞게 C 스택이나 C++ 스택이 생성된다.
-
메서드 영역: 메서드 영역은 모든 스레드가 공유하는 영역으로 JVM이 시작될 때 생성된다. JVM이 읽어 들인 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 필드와 메서드 정보, Static 변수, 메서드의 바이트코드 등을 보관한다. 메서드 영역은 JVM 벤더마다 다양한 형태로 구현할 수 있으며, 오라클 핫스팟 JVM(HotSpot JVM)에서는 흔히 Permanent Area, 혹은 Permanent Generation(PermGen)이라고 불린다. 메서드 영역에 대한 가비지 컬렉션은 JVM 벤더의 선택 사항이다.
-
런타임 상수 풀: 클래스 파일 포맷에서 constant_pool 테이블에 해당하는 영역이다. 메서드 영역에 포함되는 영역이긴 하지만, JVM 동작에서 가장 핵심적인 역할을 수행하는 곳이기 때문에 JVM 명세에서도 따로 중요하게 기술한다. 각 클래스와 인터페이스의 상수뿐만 아니라, 메서드와 필드에 대한 모든 레퍼런스까지 담고 있는 테이블이다. 즉, 어떤 메서드나 필드를 참조할 때 JVM은 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조한다.
-
힙: 인스턴스 또는 객체를 저장하는 공간으로 가비지 컬렉션 대상이다. JVM 성능 등의 이슈에서 가장 많이 언급되는 공간이다. 힙 구성 방식이나 가비지 컬렉션 방법 등은 JVM 벤더의 재량이다.
-
SDT (Strict Data Type)
- Managed Language의 특징
- 자료형(Data Type) : 프로그래머가 Compiler에게 알려주는 데이터의 속성
- SDT : Managed Language를 다룰 땐 사용하고자 하는 자료형이 무엇인지 정확하게 표현해야 하며, 상황에 따라 꼭 맞는 자료형을 사용해야 함
POP VS OOP
POP(Procedure Oriented Program) 절차지향 프로그램
POP (절차지향 프로그램) 개념
프로그램이 시작하면 프로그래밍된 순서대로 진행함 , 모든 순서가 종료되면 프로그램도 종료됨
POP 특징
- 기능 우선 : OOP(절차지향프로그램)에 비해 빠르게 프로그래밍 가능
- 데이터 접근 용이
- 대부분의 함수가 프로그램 내부에서 어디서든 사용 가능한 전역 데이터를 사용하기에 데이터 접근이 용이함 → 보안성이 낮음
- 데이터 모듈화의 어려움
- 모듈화? → 프로그램을 관리가 용이하도록 기능 단위로 분리하는 작업 의미
- 데이터 및 기능 추가 시 기존에 작성된 프로그램을 수정
- 프로그램의 크기가 커질수록 유지보수의 어려움 증가
OOP(Object Oriented Program) 객체지향 프로그램
OOP (객체지향 프로그램) 개념
“객체”라는 개념을 통해 데이터 및 함수를 모듈화 하여 프로그램의 유지보수와 보안성 강화
OOP 특징
- 캡슐화
데이터를 캡슐화(은닉화)함으로써, 상황에 따라 프로그램 외부에서 접근 가능한 데이터를 지정할 수 있음 (ex. public, private, protected와 같은 접근제한자)
→ 내부적으로 숨겨야하는 데이터의 접근을 막음으로써 데이터의 보안성 좋아짐
- 추상화
OOP에서 제공하는 함수/데이터 모듈화의 일종으로 객체의 기본적인 틀(뼈대)만 미리 만들어 놓을 수 있음, 상속을 사용하여 구체적인 객체로 만들어 사용할 수 있음
- 상속
OOP에서 제공하는 함수/데이터의 모듈화의 일종으로 피상속 객체(부모 클래스)의 데이터 및 함수들을 상속 객체로 그대로 이어 받아 사용할 수 있는 기능
→ 코드의 재사용성 높임
- 다형성
객체가 다양한 형태로 표현될 수 있다는 개념. 추상화된 객체와 같이 ‘틀’을 가진 객체가 구체화된 객체로 표현가능하다는 뜻
Author And Source
이 문제에 관하여([JAVA NOTE]1. About JAVA), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jitae/JAVA-NOTE1.About-JAVA저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)