19장 이쯤에서 자바의 역사와 jvm에 대해서 알아보자
JDK | Java Development Kit |
J2SE | Java 2 Standard Edition |
Java SE | Java Standard Edition |
JRE | Java Runtime Environment 실행만을 위한 환경으로 이 JRE만 설치하면, 자바를 컴파일하는 등의 각종 프로그램이 제외된 상태로 설치된다 |
OpenJDK | 소스에 라이센스 문제가 되는 부분을 제거한 완전 오픈소스 버전의 JDK |
자바의 특징
- 단순하고 객체지향적이며 친숙
- 다형성, 캡술화 등 객체지향적으로 디자인됨
- 견고하며 보안상 안전
- 컴파일 할 때와 실행할 때 문법적 오류에 대한 체크
- 메모리 관리 모델이 매우 단순
- 분산환경에서 디자인되어 보안성이 높다
- 아키텍처에 중립적이어야 하며 포터블
- 다양한 하드웨어 아키텍처에서 수행할 수 있도록 되어있음
- 자바의 버전만 동일하다면 동일한 프로그램은 어떤 플랫폼에서도 실행 가능 (jvm 덕분)
- 아키텍처에 중립적인 바이트 코드 생성
- 높은 성능을 제공
- 자동화된 가비지 컬렉터는 낮은 우선 순위의 쓰레드로 동작하기 때문
- 인터프리트 언어이며, 쓰레드를 제공하고 동적인 언어
- 자바 인터프리터는 자바 바이트 코드를 어떤 장비에서도 수행할 수 있도록함
- 자바 컴파일러는 컴파일시 매우 엄격한 정적인 점검을 수행하고, 실행시에 동적으로 필요한 프로그램들을 링크시킴
- 자바는 멀티쓰레드 환경을 제공하여 동시에 여러 작업이 가능하여 사용자에게 빠른경험 제공
JIT 컴파일러란
Just In Time의 약자로 동적 변환이라고 보면 된다. 프로그램 실행을 빠르게 하기 위함으로 명칭이 컴파일러지만, 실행시에 사용되는 기술이다. 인터프리터방식과 정적 컴파일 방식이 혼합된 것
- 인터프리터 방식 : 프로그램을 실행할 때마다 컴퓨터가 알아 들을 수 있는 언어로 변환하는 작업을 수행하여 간편하지만 성능이 느림
- 정적 방식 : 실행하기 전에 컴퓨터가 알아 들을 수 있는 언어로 변환하는 작업을 미리 실행하며, 변환 작업은 딱 한번만 수행
변환 작업은 인터프리터에 의해서 지속적으로 수행되지만, 필요한 코드의 정보는 캐시에 담아두었다가 재사용
JVM -> 기계 코드로 변환되는 부분을 JIT에서 수행
JVM이란
자바 프로그램이 수행되는 프로세스
GC
사용되지 않는 객체를 제거하는 메모리 관리를 한다
GC의 진행과정
JVM은 Heap 공간에 영역을 나누어 객체들을 관리한다.
Young 영역 : 젊은 객체들이 존재
Old 영역 :늙은 객체들이 존재
Minor CG or Young GC (Garbage Collection)
- Eden 영역에 객체가 생성
- Eden 영역이 꽉 차면 살아있는 객체만 Survior 영역으로 객체가 복사되고, 다시 Eden 영역을 채우게 되낟
- Survior 영역이 꽉 차게 되면 다른 Survior 영역으로 객체가 복사된다. 이때, Eden 영역에 있는 객체들 중 살아있는 객체들도 다른 Survivor 영역으로 간다. 즉, Survior 영역 들 중 하나는 반드시 비어있어야만 한다
Major CG or Full GC (Garbage Collection)
- 오래 살아 있는 객체들은 old 영역으로 이동
Young GC가 Full GC보다 빠르다. 일반적으로 더 작은 공간이 할당되고, 객체들을 처리하는 방식도 다르기 때문
20장 가장 많이 쓰는 패키지는 자바랭
유일하게 java.lang 패키지들은 import를 안해도 사용할 수 있다. java.lang 패키지에서 제공하는 인터페이스, 클래스, 예외 클래스 등은 다음과 같이 분류할 수 있다
- 언어 관련 기본
- 문자열 관련
- 기본 자료형 및 숫자 관련
- 쓰레드 관련
- 예외 관련
- 런타임 관련
Java.lang 패키지에 정의된 대표적인 에러
- OutOfMemoryError(OOME) : 메모리가 부족하여 발생하는 에러로 프로그램을 잘못 작성하거나 설정이 제대로 되어 있지 않는 경우
- StackOverFlow : 호출된 메소드의 깊이가 너무 깊을 때 발생하는 에러. 자바에서는 스택이라는 영역에 어떤 메소드가 어떤 메소드를 호출했는지에 대한 정보를 관리하는데, 메소드를 잘못 작성하면 스책에 쌓을 수 잇는 메소드 호출 정보의 한계를 넘어설 수 있다.
java.lang 패키지는 자바의 기본 어노테이션이 선언되어 있다.
- Deprecated
- Override
- SuppressWarnings
숫자를 처리하는 클래스
자바에서 간단한 계산을 할 때는 대부분 기본 자료형을 사용하고, 이 기본 자료형은 자바의 스택 영역에 저장되어 관리된다. 따라서, 계산할 때 보다 빠른 처리 가능.
기본 자료형의 숫자를 객체로 처리해야 할 필요의 수가 있어, 다음과 같이 기본 자료형으로 선언되어 있는 타입의 클래스들이 선언되어 있다.
- Byte
- Shore
- Integer
- Long
- Float
- Double
- Character
- Boolean
기본자료형의 대문자로 바뀌었으며, Character와 Boolean을 제외한 숫자를 처리하는 클래스들은 Wrapper 클래스라고 불리며, 모두 Number라는 abstract 클래스를 확장한다.
자바 컴파일러에서 자동으로 형변환을 해주기 때문에 겉보기에는 참조자료형이지만, 기본자료형처럼 사용할 수 있다.
- parse타입이름() 메소드는 기본 자료형을 리턴, valueOf() 메소드는 참조자료형을 리턴한다.
- 참조 자료형 중 더하기 연산이 가능한 것은 String 뿐이다.
숫자를 처리하는 참조 자료형을 만든 이유
- 매개 변수를 참조 자료형으로만 받는 메소드를 처리하기 위해서
- 제네릭과 같이 기본 자료형을 사용하지 않는 기능을 사용하기 위해서
- MIN_VALUE(최소값)나 MAX_VALUE(최대값)와 같이 클래스에 선언된 상수 값을 선언하기 위해서
- 문자열을 숫자로, 숫자를 문자열로 쉽게 변환하고 2,8,10,16 진수 변환을 쉽게 처리하기 위해서
기본 자료형을 참조 자료형으로 만든 클래스들은 Boolean 클래스를 제외하고 모두 MIN_VALUE, MAX_VALUE 라는 상수를 가진다
Ex) Byte.MIN_VALUE, Byte.MAX_VALUE, … , (int)Character.MIN_VALUE, (int)Character.MAX_VALUE
Integer의 최소값과 최대값을 2진수와 16진수로 나타내는 방법
Ex) 2진수 : Integer.toBinaryString(Integer.MIN_VALUE). 16진수 : Integer.toHexString(Integer.MAX_VALUE)
PrintStream 클래스
선언 및 리턴 타입 | 변수명 | 설명 |
static PrintStream | err | 에러 및 오류 출력시 사용 |
static InputStream | in | 입력값을 처리시 사용 |
static PrintStream | out | 출력값을 처리시 사용 |
모두 static으로 선언되어 있어 별도의 클래스 객체를 생성할 필요가 없다.
PrintStream, InputStream은 모두 java.io 패키지에 선언되어 있다.
System 클래스
시스템 정보를 확인하는 클래스로, 다음과 같은 역할을 한다
- 시스템 속성(property)값 관리
- java.util 패키지에 속하며, Hashtable의 상속을 받은 클래스
- 시스템 환경(environment)값 조회
- Properties는 추가나 변경이 가능하지만 환경값 env라는 것은 변경이 불가하고 읽기만 가능
- GC 수행
- JVM 종료
- 현재 시간 조회
- currentTimeMills() 현재시간을 확인
- nanoTime() 시간 측정
- 기타 관리용 메소드
System.out
- print() : 줄바꿈 x
- println() : 줄바꿈 o
- 위의 두 메소드 기본 자료형과 참조 자료형 매개변수 사용 가능. byte타입이나 short타입은 int타입을 매개 변수로 받는 메소드에서 처리
- StringBuilder의 append()메소드를 사용하여 더하기 문장을 출력
- String.valueOf()라는 static 메소드를 호출하여 결과를 받은 후 출력하으로 null은 출력이 됨, toString()으로 처리한 메소드는 NPE 발생
- format()
- printf()
- write()
- printNull()
'JAVA > about java' 카테고리의 다른 글
[GC] Garbage Collector (0) | 2023.04.29 |
---|---|
[Thread safe] Thread safe / unsafe 기준과 코드 설계 방법 (0) | 2023.04.25 |
[Annotation] 어노테이션 (1) | 2023.04.25 |
[ArrayList] ArrayList / Array vs ArrayList / 자바 버전 별 차이점 (0) | 2023.04.25 |
[String] String 클래스 (0) | 2023.04.23 |