20장 - 가장 많이 쓰이는 패키지는 자바랭
java.lang 패키지
- 자바 패키지 중 유일하게 java.lang 패키지에 있는 클래스들은 import 안 해도 사용 가능
- 자바에 꼭 필요한 기능 제공
java.lang 패키지에 정의된 중요한 에러
OutOfMemoryError (OOME)
- 메모리 부족으로 발생하는 에러
- 자바는 가상 머신에서 메모리를 관리하나, 프로그램을 잘못 작성하거나 설정이 제대로 되어있지 않은 경우에 해당 에러 발생함
StackOverFlowError
- 호출된 메서드의 깊이가 너무 깊을 때 발생함
- 자바에서는 스택(Stack)이라는 영역에서 어떤 메서드가 어떤 메서드를 호출했는지에 대한 정보를 관리함
- 예를 들어 메서드가 자기 자신을 호출하는 재귀 메서드를 잘못 작성하면 스택에 쌓을 수 있는 메서드 호출 정보의 한계를 넘어서 해당 에러 발생함
java.lang 패키지에 선언된 기본 어노테이션
- Override
- Deprecated
- SuppressWarnings
숫자 처리 클래스
- 자바에서는 간단한 계산 시 대부분 기본 자료형(Primitive type) 사용
- 기본 자료형은 자바의 힙(Heap)이라는 영역에 저장되지 않고, 스택이라는 영역에 저장되어 관리됨
- ➡ 계산 시 보다 빠른 처리 가능
- But 이런 기본 자료형의 숫자를 객체로 처리해야 할 때가 있음
- Byte
- Short
- Integer
- Long
- Float
- Double
- Character
- Boolean
감싼(Wrapper) 클래스
- 숫자 처리하는 클래스 Byte, Short, Integer, Long, Float, Double (Character, Boolean 제외)
- 모두 Number라는 abstract 클래스를 확장(extends)함
- 겉보기엔 참조 자료형이나, 기본 자료형처럼 사용 가능(자바 컴파일러에서 자동으로 형변환 해주기에)
parse타입이름()과 valueOf()
- 둘 다 static 메서드(타입 객체 생성할 필요 없이 바로 사용 가능)
- Character 클래스 제외 공통 메서드로 제공됨
public void numberTypeCheck() {
String value1 = "3";
String value2 = "5";
byte byte1 = Byte.parseByte(value1);
byte byte2 = Byte.parseByte(value2);
System.out.println(byte1 + byte2); //8
Integer refInt1 = Integer.valueOf(value1);
Integer refInt2 = Integer.valueOf(value2);
System.out.println(refInt1 + refInt2 + "7"); //87
}
- 둘 다 String과 같은 문자열 ➡ 숫자 타입으로 변환하나, 차이가 있음
parse타입이름() | valueOf() |
기본 자료형 리턴 | 참조 자료형 리턴 |
public void numberTypeCheck2() {
Integer refInt1;
refInt1 = 100;
System.out.println(refInt1.doubleValue());
}
컴파일 이상 x, 실행도 잘 됨 ➡ 이런 숫자 처리하는 참조 자료형 만든 이유?
- 매개 변수를 참조 자료형으로만 받는 메서드 처리 위해
- 제네릭처럼 기본 자료형을 사용하지 않는 기능 사용 위해
- MIN_VALUE (최소값)나 MAX_VALUE (최대값)와 같이 클래스에 선언된 상수 값 사용 위해
- 문자열 ➡ 숫자로, 숫자열 ➡ 문자로 쉽게 변환하고, 2, 8, 10, 16 진수 변환 쉽게 처리 위해
MIN_VALUE와 MAX_VALUE
- 기본 자료형을 참조 자료형으로 만든 클래스들은 Boolean 클래스 제외, 모두 MIN_VALUE와 MAX_VALUE라는 상수 가지고 있음
- 해당 타입이 나타낼 수 있는 값의 범위 확인하려면 static으로 선언된 이 상수들 사용하면 됨
public void numberMinMaxCheck() {
System.out.println("Byte min=" + Byte.MIN_VALUE + " max=" + Byte.MAX_VALUE);
System.out.println("Short min=" + Short.MIN_VALUE + " max=" + Short.MAX_VALUE);
System.out.println("Integer min=" + Integer.MIN_VALUE + " max=" + Integer.MAX_VALUE);
System.out.println("Long min=" + Long.MIN_VALUE + " max=" + Long.MAX_VALUE);
System.out.println("Float min=" + Float.MIN_VALUE + " max=" + Float.MAX_VALUE);
System.out.println("Double min=" + Double.MIN_VALUE + " max=" + Double.MAX_VALUE);
System.out.println("Character min=" + (int)Character.MIN_VALUE + " max=" + (int)Character.MAX_VALUE);
}
어떤 값을 원하는 진수의 숫자로 표현하고 싶을 때
- 숫자 클래스에서 제공되는 메서드 사용
- Integer나 Long 타입인 값의 숫자가 너무 많을 때 2진수나 16진수로 표현하면 보다 보기 편함
public void integerMinMaxCheckBinary() {
System.out.println("Integer BINARY min=" + Integer.toBinaryString(Integer.MIN_VALUE));
System.out.println("Integer BINARY max=" + Integer.toBinaryString(Integer.MAX_VALUE));
System.out.println("Integer HEX min=" + Integer.toHexString(Integer.MIN_VALUE));
System.out.println("Integer HEX min=" + Integer.toHexString(Integer.MAX_VALUE));
}
돈 계산 등 중요한 연산 수행 시 정확한 계산 위해 사용해야 하는 클래스
정수형 | 소수형 |
BigInteger | BigDecimal |
모두 java.lang.Number 클래스 상속 받음 java.math 패키지에 선언되어 있음 |
System 클래스
- 생성자 x
- 시스템에 대한 정보 확인하는 클래스
선언 및 리턴 타입 | 변수명 | 설명 |
static PrintStream | err | 에러 및 오류 출력 시 사용 |
static InputStream | in | 입력값 처리 시 사용 |
static PrintStream | out | 출력값 처리 시 사용 |
System.out.println()
- System = 클래스 이름
- out = System 클래스에 static으로 선언된 변수(클래스 변수) 이름, PrintStream 타입
- println() = PrintStream 클래스에 선언되어 있으며, static 메서드
- out과 println() 모두 static으로 선언되어 있음 = 별도의 클래스 객체 생성할 필요 x
- ➡ 출력 관련된 메서드는 System 클래스에서 찾으면 안 되고, PrintStream 클래스에서 찾아야 함
PrintStream과 InputStream
- 모두 java.io 패키지에 선언되어 있음
System 클래스에서 제공하는 메서드
- 시스템 속성(Property)값 관리
- 시스템 환경(Environment)값 조회
- GC 수행
- JVM 종료
- 현재 시간 조회
- 기타 관리용 메서드
- (GC 수행 및 JVM 종료 메서드 : 절대 수행하면 안 됨)
시스템 속성(Property)값 관리
리턴 타입 | 메서드 이름 및 매개 변수 | 설명 |
static String | clearProperty(String key) | key에 지정된 시스템 속성 제거 |
static Properties | getProperties() | 현재 시스템 속성을 Properties 클래스 형태로 제공 |
static String | getProperty(String key) | key에 지정된 문자열로 된 시스템 속성값(value) 얻음 |
static String | getProperty(String key, String def) | key에 지정된 문자열로 된 시스템 속성값(value) 얻고, 만약 없으면 def에 지정된 값 리턴 |
static void | setProperties(Properties props) | Properties 타입으로 넘겨주는 매개 변수에 있는 값들을 시스템 속성에 넣음 |
static String | setProperty(String key, String value) | key에 지정된 시스템 속성 값을 value로 대체 |
Properties 클래스
- java.lang 패키지에 속함
- Hashtable 상속 받은 클래스
Hashtable | 배열 |
key와 value의 쌍으로 이루어진 여러 개의 값 갖는 Map 형태의 자료 구조 Map 형태의 자료 구조는 순서 x key-value 쌍으로 되어 있음 이 객체에서 원하는 값 찾을 때에는 위치가 아닌 key로 찾음 |
하나의 객체 만들고 거기에 여러 개의 값 순서대로 들어감 그 위치(index)로 원하는 값 찾음 |
- 자바 프로그램 실행 시 자동으로 Properties 객체 생성됨
- Properties의 값은 언제든 같은 JVM 내에서는 꺼내 사용할 수 있음
package d.lang;
public class JavaLangSystem {
public static void main(String[] args) {
JavaLangSystem sample = new JavaLangSystem();
sample.systemPropertiesCheck();
}
public void systemPropertiesCheck() {
System.out.println("java.version=" + System.getProperty("java.version"));
}
}
시스템 환경(Environment)값 조회
리턴 타입 | 메서드 이름 및 매개 변수 | 설명 |
static Map<String, String> | getenv() | 현재 시스템 환경에 대한 Map 형태의 리턴값 받음 |
static String | getenv(String name) | 지정한 name에 해당하는 값 받음 |
- Properties: 추가 및 변경 가능
- 환경값 env : 변경 불가, 읽기 only (대부분 OS나 장비 관련)
System.out.println("JAVA_HOME=" + System.getenv("JAVA_HOME"));
- JAVA_HOME: 보통 JDK 설치된 경로(java.exe나 java 명령어가 있는 위치가 아닌, 자바의 가장 상위 디렉터리)
- 매개 변수가 없는 getenv() 메서드는 리턴 타입이 Map<String, String>
GC 수행
리턴 타입 | 메서드 이름 및 매개 변수 | 설명 |
static void | gc() | 가비지 컬렉터 실행 |
static void | runFinalization() | GC 처리 기다리는 모든 객체에 대해 finalize() 메서드 실행 |
- 자바는 메모리 처리를 개발자가 별도로 하지 x
- System.gc() 메서드 호출하면 가비지 컬렉션을 명시적으로 처리하도록 할 수 있음
- Object 클래스에 선언된 finalize() 메서드를 명시적으로 수행하는 runFinalization() 메서드 있음
- 위 두 개 메서드는 직접 호출할 필요 없이 JVM이 알아서 더 이상 필요 없는 객체 처리하는 GC 작업과 finalization 작업 실행
JVM 종료
리턴 타입 | 메서드 이름 및 매개 변수 | 설명 |
static void | exit(int status) | 현재 수행 중인 JVM을 멈춤 |
- 위 결과값이 0일 때만 정상적인 종료
- 그 외의 숫자는 비정상적인 종료 의미
현재 시간 조회
리턴 타입 | 메서드 이름 및 매개 변수 | 설명 |
static long | currentTimeMillis() | 현재 시간을 밀리초 단위로 리턴(1초 = 1000ms) 현재 시간을 나타낼 때 유용 |
static long | nanoTime() | 현재 시간을 나노초 단위로 리턴 시간 차이 측정하기 위한 용도 |
public void numberMinMaxElapsedCheck() {
JavaLangNumber numberSample = new JavaLangNumber();
long startTime = System.currentTimeMillis();
long startNanoTime = System.nanoTime();
numberSample.numberMinMaxCheck();
System.out.println("Milli second=" + (System.currentTimeMillis() - startTime));
System.out.println("Nano second=" + (System.nanoTime() - startNanoTime));
}
- 나노초를 밀리초로 확인하기 위해 1/1,000,000으로 나누면 0.5ms
out과 err
- System 클래스에 선언된 out (System.out)과 err (System.err) 변수는 PrintStream이라는 동일 클래스의 객체
- 정상 출력인지, 에러 났을 때의 출력 결과인지 차이만 존재함
PrintStream 클래스의 출력 위한 주요 메서드
- print()
- println()
- format()
- printf()
- write()
print() | println() |
매개 변수에 있는 내용 출력 줄바꿈 x |
매개 변수에 있는 내용 출력 매개 변수가 없는 메서드도 존재함 줄바꿈 처리 |
두 메서드 모두 기본 자료형과 참조 자료형을 매개 변수로 사용 가능 | |
byte타입이나 short 타입을 매개 변수로 받는 메서드는 선언되어 있지 x Why? byte나 short 타입을 print()나 println() 메서드로 넘겨주면 int 타입을 매개 변수로 받는 메서드에서 알아서 처리해줌 |
//줄바꿈
println(""); //이 경우, 불필요한 String 객체 생성됨
println(); //이 방법으로 줄바꿈하기
package d.lang;
public class JavaLangSystemPrint {
public static void main(String[] args) {
JavaLangSystemPrint sample = new JavaLangSystemPrint();
sample.printStreamCheck();
}
public void printStreamCheck() {
byte b = 127;
short s = 32767;
System.out.println(b);
System.out.println(s);
printInt(b);
printInt(s);
}
public void printInt(int value) {
System.out.println(value);
}
}
println()과 null
public void printNull() {
Object obj = null;
System.out.println(obj);
System.out.println(obj + " is object's value");
}
//결과
//null
//null is object's value
obj 객체가 null인데 컴파일 에러 나지 않는 이유
- 보통 객체 출력 시
- toString() 메서드를 단순 호출 = null인 obj의 toString() 호출하는 셈
- null인 obj는 아무런 할당이 되어있지 않기에 메서드 호출 불가
- ➡ 컴파일은 제대로 되지만 실행 시 예외 발생
- But 위 소스는 컴파일 제대로 됨
- print()와 println()
- 단순히 toString() 메서드 결과 출력하지 x
- String의 valueOf()라는 static 메서드 호출해 결과 받은 후 출력
- = String.valueOf(obj) 호출됨
public void printNullToString() {
Object obj = null;
System.out.println(obj.toString());
}
//결과
//NullPointerException 발생
- 객체 출력 시 toString()보다 valueOf() 사용하는 게 훨씬 안전함
null + 문자열인데도 예외 발생하지 않는 이유
public void printNull() {
Object obj = null;
System.out.println(obj + " is object's value");
}
//결과
//null is object's value
- 컴파일러에서 이 더하기 문장을 StringBuilder로 변환하기 때문
new StringBuilder().append(obj).append(" is object's value");
//obj = null;
//문제 없이 null 출력 가능
new StringBuilder().append(null).append(" is object's value");
format()과 printf()
- 서로 이름만 다르고 처리 동일함
'Backend > Java' 카테고리의 다른 글
[자바의 신] 22장 (0) | 2022.08.09 |
---|---|
[자바의 신] 21장 (0) | 2022.08.09 |
[자바의 신] 19장 (0) | 2022.07.26 |
[자바의 신] 18장 (0) | 2022.07.26 |
[자바의 신] 17장 (0) | 2022.07.25 |
댓글