✔️이 글은 [자바의 신 - 이상민 지음] 도서를 바탕으로 정리한 글입니다.
java.lang 패키지는 특별하죠
java.lang은 import를 안해도 그 안의 클래스들을 사용할 수 있는 유일한 패키지로 자바에 꼭 필요한 여러 기능을 제공한다.
java.lang에서 제공하는 인터페이스, 클래스, 예외 클래스등은 다음과 같이 나눠볼 수 있다.
- 언어 관련 기본 : Comparable, Class, Enum, ArrayOutOfBoundsException...
- 문자열 관련 : CharSequence, String, StringBuffer, StringBuilder, ....
- 기본 자료형 및 숫자 관련 : Boolean, Byte, Character, Double, Float, ....
- 쓰레드 관련 : Runnable, Thread, ThreadGroup, ThreadLocal, ....
- 예외 관련 : Throwable, Exception
- 런타임 관련 : Process, Runtime ...
여러 에러 중에서 아래 두개 정돈 알아두자.
- OutOfMemoryError(OOME) : 메모리가 부족하여 발생하는 에러
- StackOverflowError : 호출된 메소드의 깊이가 너무 깊을 때 발생하는 에러, 자바에서는 메소드 호출에 관한 정보를 Stack에서 관리하는데 잘못 호출시 스택에 쌓을 수 있는 메소드 호출 정보의 한계를 넘어서 에러가 발생
기본 어노테이션 3개 : Override, Deprecated, SuppressWarnings
숫자를 처리하는 클래스들
간단한 계산을 할때는 자바의 Stack영역에 저장되는 기본 자료형을 이용해 빠르게 계산한다.
이런 기본 자료형의 숫자를 객체로 처리해야할 때 다음 클래스들을 사용한다.
- Byte
- Short
- Integer
- Long
- Float
- Double
- Character
- Boolean
Character와 Boolean을 제외한 숫자를 처리하는 클래스들은 감싼(Wrapper) 클래스라 하고, 모두 Number라는 abstract 클래스를 확장한다. 이런 참조 자료형 중 Byte, Short, Integer, Long, Float, Double의 경우는 필요시 기본 자료형처럼 사용이 가능하다. 따라서 new로 객체를 만들어주지 않고도 값을 할당할 수 있다. 또 각 참조 자료형으로 만들어진 객체의 값을 더하면 실제로 +연산을 수행한 것처럼 값을 계산해준다.
Character를 제외한 클래스에서 String과 같은 문자열을 숫자 타입으로 변환해주는 메소드 중에서 기본 자료형을 리턴하는 parse클래스타입() 메소드와 참조 자료형을 리턴하는 valueOf() 메소드가 있다.
이런 참조 자료형을 만든 이유
- 매개 변수를 참조 자료형으로만 받는 메소드 처리를 위해
- 제네릭과 같이 기본 자료형을 사용하지 않는 기능을 사용하기 위해
- Boolean을 제외한 클래스에 선언된 상수 값으로 MIN_VALUE(최소값), MAX_VALUE(최대값)을 사용하기 위해
- 문자열->숫자, 숫자->문자열 변환과 진수 변환을 쉽게 처리하기 위해
진수 변환 메소드
- Integer.toBinaryString() : 정수값을 2진수로 나타내줌
- Integer.toHexString() : 정수값을 16진수로 나타내줌
돈계산과 같이 중요한 연산시 정수형은 BigInteger, 소수형은 BigDecimal을 사용해야 한다.
두 클래스 모두 java.lang.Number 클래스 상속을 받았으며, java.math 패키지에 선언되어 있다.
각종 정보를 확인하기 위한 System 클래스
System 클래스의 static 변수
- static PrintStream err : 에러 및 오류 출력시 사용
- static InputStream in : 입력값 처리
- static PrintStream out : 출력값 처리
System.out.println()에서 out은 PrintStream이라는 객체라서 PrintStream의 static 메소드인 println()을 사용할 수 있는 것이다.
그러므로 출력과 관련된 메소드는 PrintStream에서, 입력과 관련된 메소드는 InputStream 클래스에서 찾아봐야 한다.
두 클래스는 모두 java.io 패키지에 선언되어 있다.
System 클래스는 입출력과 관련된게 아닌 시스템에 대한 정보를 확인하는 메소드를 제공한다.
- 시스템 속성(Property)값 관리 : clearProperty(String key), getProperties(), getProperty(String key), getProperty(String key, String def), setProperties(Properties props), setProperty(String key, String value) 등
- 시스템 환경(Environment)값 조회 : getenv(), getenv(String name)
- GC 수행 : gc(), runFinalization() => 절대 사용 x
- JVM 종료 : exit(int status) => 절대 사용 x
- 현재 시간 조회 : currentTimeMillis()-현재 시간 밀리초로 리턴, nanoTime()-시간의 차이를 나노초 단위로 측정
- 기타 관리용 메소드들
Properties라는 클래스는 java.util에 속하며 Hashtable 클래스의 상속을 받는다. 필요 여부와 상관없이 자바 프로그램을 실행하면 Properties 객체가 생성되며 언제 어디서든 JVM 내에서 꺼내어 사용할 수 있고 추가, 변경이 가능하다.
환경값 env는 변경하지 못하고 읽기만 가능한 값으로 대부분 OS나 장비와 관련된 것들이다.
GC 수행에 관련된 메소드는 알아서 필요할 때 수행되던 GC를 따로 실행시켜 시스템의 성능을 떨어뜨리니 사용하면 안된다.
JVM 종료 메소드도 해당 애플리케이션의 JVM이 죽어버려 시스템 장애가 발생하므로 사용해서는 안된다.
System.out을 살펴보자
PrintStream의 출력을 위한 메소드
print()와 println()
print는 출력 후 줄바꿈이 없고, println()은 줄바꿈이 있다.
byte와 short 타입 메소드가 Overloading 되어 있지 않아도 매개변수로 넘겨주면 int로 알아서 형변환을 해준다.
null인 객체를 출력하면 String클래스의 valueOf()라는 static 메소드를 호출하여 결과를 받아 출력되어 "null"이라는 값을 정상적으로 출력해준다. toString() 메소드를 사용하면 null인 객체는 예외를 발생시킨다.
null인 객체와 문자열을 더하면 그 문장을 StringBuilder로 변환하여 주기 때문에 이 또한 정상적으로 출력된다.
Object obj = null;
// 아래 두 문장은 같은 방식으로 동작한다.
System.out.println(obj + " is object's value");
System.out.println(new StringBuilder().append(obj).appen(" is object's value");
format()과 printf()
출력형태를 지정해주는 출력 메소드로 이름만 다르고 처리하는 것은 동일하다.
정리해 봅시다
1. 자바 패키지 중 같은 패키지에 있는 클래스를 제외하고, 별도로 import하지 않아도 되는 패키지는?
java.lang
2. 자바의 메모리가 부족해서 발생하는 에러는?
OOME(OutOfMemoryError)
3. 메소드 호출 관계가 너무 많아서 발생하는 에러는?
StackOverflowError
4. java.lang 패키지에 선언된 3개의 어노테이션과 각각의 역할은?
Override는 오버라이딩된 메소드라는 것을 명시해주고, Deprecated는 더이상 사용하지 않는 메소드나 변수임을 명시해주고, SuppressWarnings는 해당 코드에서 발생하는 경고를 무시하라고 명시해준다.
5. Double과 Integer 같은 숫자 타입에서 처리할 수 있는 최대, 최소값을 알 수 있는 상수의 이름은?
MAX_VALUE, MIN_VALUE
6. Integer 값을 2진수로 표현하려면 어떤 메소드를 사용해야 하나요?
toBinaryString()
7. Integer 값을 16진법으로 표현하려면 어떤 메소드를 사용해야 하나요?
toHexString()
8. 속성(Properties)과 환경(Environment) 값의 차이는?
속성값은 추가와 변경이 가능하지만, 환경값은 읽기만 가능하다.
Properties는 JVM에서 사용하는 속성값을 제공하며, Environment는 시스템에서 사용하는 환경값을 제공한다.
9. System.out과 System.err에서 사용할 수 있는 메소드를 확인하려면 어떤 클래스를 찾아봐야 하나요?
PrintStream
10. System 클래스에서 현재 시간을 조회하는 용도로 사용하는 메소드 이름은?
currentTimeMillis()
11. System 클래스에서 시간 측정 용도로 사용하는 메소드 이름은?
nanoTime()
12. System.out.print() 메소드와 System.out.println() 메소드의 차이점?
print는 출력후 줄바꿈이 없고, println은 출력 후 줄바꿈을 해준다.
13. System.out.println() 메소드에 객체가 매개 변수로 넘어 왔을 때 String의 어떤 메소드가 호출되어 결과를 출려하나요? 그 메소를 사용하는 이유는?
String의 valueOf() 메소드가 수행된다. System.out.println() 메소드로 넘어온 객체가 null일 경우 예외를 발생시키지 않게 하기 위해서이다.
'도서 > 자바의 신' 카테고리의 다른 글
[도서/자바의 신] #22 자바랭 다음으로 많이 쓰는 애들은 컬렉션 - Part1(List) (1) | 2022.12.30 |
---|---|
[도서/자바의 신] #21 실수를 방지하기 위한 제네릭이라는 것도 있어요 (0) | 2022.12.29 |
[도서/자바의 신] #19 이쯤에서 자바의 역사와 JVM에 대해서 알아보자 (0) | 2022.12.29 |
[도서/자바의 신] 부록 #3 float와 double (0) | 2022.12.27 |
[도서/자바의 신] #17 어노테이션이라는 것도 알아야 한다 (1) | 2022.12.25 |