자바의 java.lang 패키지란?
- 자바에서 가장 핵심적인 클래스들이 모여 있는 기본 패키지
- 자바 언어 그 자체의 일부로 간주되며, import 없이 자동 사용 가능
- JVM이 자바 코드를 실행할 수 있게 해주는 필수 기반 클래스 포함
- 모든 자바 프로젝트의 출발점이자 중심
주요 역할별 클래스 분류
| 영역 |
대표 클래스 |
설명 |
| 객체 기본 구조 |
Object, Class, Enum |
상속, 동등성, 리플렉션 |
| 문자열 처리 |
String, StringBuilder, StringBuffer |
불변 문자열, 동적 문자열 |
| 수치/형 변환 |
Integer, Long, Double, Character |
래퍼 클래스, 오토박싱 |
| 시스템 제어 |
System, Runtime, Process |
입출력, 종료, 시간, 환경변수 |
| 예외 구조 |
Throwable, Exception, Error |
예외/오류 처리 |
| 수학 연산 |
Math, StrictMath |
고속 수학 연산 |
1. Object 클래스 – 모든 클래스의 조상
핵심 메서드
| 메서드 |
용도 |
| equals() |
객체 동등성 비교 |
| hashCode() |
해시 기반 자료구조 사용 |
| toString() |
문자열 표현 |
| clone() |
객체 복제 |
| getClass() |
클래스 정보 반환 |
| finalize() |
GC 직전 콜백 (Deprecated) |
- 실전 예: equals()와 hashCode()
class User {
String id;
public User(String id) { this.id = id; }
@Override
public boolean equals(Object obj) {
if (!(obj instanceof User)) return false;
return id.equals(((User)obj).id);
}
@Override
public int hashCode() {
return id.hashCode();
}
}
실전 예: clone()을 통한 깊은 복사
class Address implements Cloneable {
String city;
public Address(String city) { this.city = city; }
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Person implements Cloneable {
String name;
Address address;
@Override
protected Object clone() throws CloneNotSupportedException {
Person clone = (Person) super.clone();
clone.address = (Address) address.clone();
return clone;
}
}
2. 문자열 관련 클래스
String: 불변 객체
String a = "hello";
String b = new String("hello");
System.out.println(a == b); // false
System.out.println(a.equals(b)); // true
- 불변성으로 인해 멀티스레드 안전
- String Pool에 의해 리터럴은 공유됨
StringBuilder vs StringBuffer
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) sb.append(i);
System.out.println(sb.toString());
| 클래스 |
쓰레드 안전 |
성능 |
용도 |
| StringBuilder |
X |
빠름 |
단일 스레드 문자열 조작 |
| StringBuffer |
O |
느림 |
멀티스레드 환경 (실전에서 잘 안 씀) |
3. 래퍼 클래스와 오토박싱/언박싱
예제: 캐싱 범위와 비교
Integer x = 127;
Integer y = 127;
System.out.println(x == y); // true
Integer a = 128;
Integer b = 128;
System.out.println(a == b); // false
parseInt() vs valueOf()
| 메서드 |
리턴 타입 |
설명 |
| Integer.parseInt("123") |
int |
문자열 → 기본형 |
| Integer.valueOf("123") |
Integer |
문자열 → 래퍼 객체 (캐싱 포함) |
4. System 클래스 – JVM 인터페이스
4-1. 입출력 스트림
System.out.println("표준 출력");
System.err.println("에러 로그 출력");
4-2. 시간 측정
long start = System.nanoTime();
// 처리 로직
long end = System.nanoTime();
System.out.println("걸린 시간(ns): " + (end - start));
4-3. 종료 및 GC 요청
System.gc(); // GC 요청 (강제 아님)
System.exit(0); // JVM 종료
4-4. 시스템 정보
System.out.println(System.getProperty("os.name"));
System.out.println(System.getenv("JAVA_HOME"));
4-5. 배열 복사
int[] src = {1, 2, 3};
int[] dest = new int[3];
System.arraycopy(src, 0, dest, 0, 3);
System.out.println(Arrays.toString(dest));
5. Throwable 계층 – 예외 처리 기반
Throwable
├─ Error (복구 불가)
│ ├─ OutOfMemoryError
│ └─ StackOverflowError
└─ Exception (복구 가능)
├─ Checked: IOException
└─ Unchecked: NullPointerException
예외 전략 예시
try {
Files.readAllLines(Paths.get("file.txt"));
} catch (IOException e) {
throw new RuntimeException("파일 읽기 실패", e);
}
-checked 예외는 반드시 처리 or throws 필요
-unchecked 예외는 런타임 중 발생, 논리 오류 발생 가능성
6. 수치 연산 클래스
Math / StrictMath
System.out.println(Math.abs(-3)); // 3
System.out.println(Math.pow(2, 10)); // 1024
- Math는 플랫폼 최적화
- StrictMath는 결과 일관성 보장
BigDecimal – 정밀한 계산
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b)); // 정확한 0.3
- 금융/회계 시스템에서는 필수
요약
| 주제 |
전문가가 주의하는 포인트 |
| Object |
equals/hashCode 일관성은 자료구조 버그 방지에 필수 |
| String |
불변성 + 풀 → 성능/안정성 모두 고려 |
| 래퍼 클래스 |
== 비교 금지, 오토박싱 성능 영향 인식 |
| System |
arraycopy는 빠르고 안전한 복사 도구 |
| 예외 |
API 안정성과 유지보수를 위한 예외 계층 설계 중요 |
| 수치 연산 |
BigDecimal 필수 영역 명확히 구분할 것 |