자바/자바

(JAVA) java.lang 패키지란

불광동 물주먹 2025. 7. 6. 15:45

자바의 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 필수 영역 명확히 구분할 것