
기본형은 값만 저장하는 단순한 타입이다.
자바는 이런 한계를 해결하기 위해 기본형을 객체로 감싼 래퍼 클래스를 제공한다.
- int → Integer
- long → Long
- double → Double
- boolean → Boolean
- char → Character
래퍼 클래스는 모두 불변이다.
값이 바뀌지 않기 때문에 항상 새로운 객체를 만들면서 사용하게 된다.
기본형을 객체로 감싸는 것을 boxing이라고 한다.
Integer num = Integer.valueOf(10);
래퍼에서 값을 꺼내 기본형으로 되돌리는 것을 unboxing이라고 한다.
int value = num.intValue();
자바는 이를 자동으로 처리하는 auto(un)boxing을 제공한다.
Integer a = 10;
int b = a;
클래스 정보를 표현하는 메타 객체
Class 객체는 자바의 모든 클래스 정보를 담고 있는 특별한 객체다.
프레임워크가 동작할 수 있는 기반이 되는 기술로 애노테이션 스캔이나 리플렉션 기능도 Class를 통해 이루어진다.
Class 객체는 다음과 같은 방식으로 얻을 수 있다.
Class clazz1 = String.class;
Class clazz2 = new String().getClass();
Class clazz3 = Class.forName("java.lang.String");
얻은 Class 정보로 필드나 메서드를 조회할 수 있다.
clazz.getDeclaredFields();
clazz.getDeclaredMethods();
Class는 결국 코드를 데이터처럼 다루기 위한 기반이다.
JVM 기능에 접근하기 위한 도구
System은 객체를 생성할 수 없으며 모든 기능이 static으로 제공된다.
JVM 수준의 기능들을 제공하는 유틸리티 역할을 한다.
시간 확인
System.currentTimeMillis();
환경 변수 조회
System.getenv("PATH");
표준 입출력 스트림
System.out.println("hello");
System.err.println("error");
System.exit는 JVM을 즉시 종료하는 기능이다.
System.exit(0);
프로그램이 강제로 종료되기 때문에 정리해야 하는 리소스가 있어도 처리되지 않는다.
스레드가 동작 중이더라도 모두 강제로 끊긴다.
스프링 같은 프레임워크에서는 컨테이너 종료 과정이 무시되어 예상치 못한 장애를 유발할 수 있다.
일반적인 애플리케이션에서는 종료 흐름을 정상적으로 흘려보내는 것이 안전하다.
수학 연산 유틸리티
Math는 간단한 수학 연산을 제공하는 유틸리티 클래스다.
객체를 만들지 않고 바로 사용할 수 있다.
절대값
Math.abs(-10);
최댓값과 최솟값
Math.max(10, 20);
Math.min(10, 20);
반올림, 올림, 내림
Math.round(10.4);
Math.ceil(10.1);
Math.floor(10.9);
간단한 난수는 Math.random으로 생성할 수 있다.
double r = Math.random();
범위를 변경하고 싶다면 곱셈과 캐스팅으로 조정한다.
int v = (int)(Math.random() * 10); // 0 ~ 9
좀 더 통제된 난수는 Random 클래스를 사용한다.
Random random = new Random();
int n = random.nextInt(10); // 0 ~ 9
Random은 시드 값 설정, 정해진 범위, 다양한 타입 등
더 정교한 랜덤 기능을 제공한다.