패스트캠퍼스 백엔드 부트캠프 3기/JAVA

[JAVA] java.lang 패키지

hail2y 2025. 1. 14. 14:04
  • Object 클래스
  • String 클래스
  • StringBuffer/StringBuilder 클래스
  • Math 클래스
  • wrapper 클래스

Object 클래스는 모든 클래스의 최고 조상 클래스다

다른 말로 우리가 사용하는 모든 클래스가 Object 클래스를 상속받기 때문에 아래의 메서드를 포함하고 있다. 메서드의 내용을 변형하고 싶다면 자손 클래스에서 오버라이딩하여 사용하면 된다. (아래는 자바의 정석 기초편 참고)

Object 클래스의 메서드  메서드 설명
protected Object clone() 객체 자신의 복사본을 반환한다.
public boolean equals(Object obj) 객체 자신과 obj가 같은 객체인지 알려준다. (주소 비교)
protected void finalize() 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다. 이때 수행되어야 하는 코드가 있는 경우에만 오버라이딩한다.
public Class getClass() 객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환한다.
public int hashCode() 객체 자신의 해시코드를 반환한다.
public String toString() 객체 자신의 정보를 문자열로 반환한다.
public void notify() 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다.
public void notifyAll() 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다.
public void wait() 다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간 (timeout, nanos) 동안 기다리게 한다. (timeout은 천 분의 1초, nanos는 10^9분, 즉10억 분의 1초)
public void wait(long timeout)
public void wait(long timeout, int nanos)
  • public native int hashCode(); 내용이 없음
    - 네이티브 메서드는 OS가 가지고 있는 메서드로 C언어로 구현되어 있다. 자바와 그 외 언어를 서로 호출할 수 있게 해주는 기술인 JNI를 사용한다. 
    - 주소값을 사용
  • 해시 값을 사용하는 자료 구조는 hashCode() 메서드의 반환 값을 사용한다.
  • hashCode 메서드의 반환 값이 일치한 이후 equals 메서드의 반환값이 참일 때만 논리적으로 같은 객체라고 판단한다.(https://www.maeil-mail.kr/question/70)
  • 아래와 같이 오버라이딩 하면 인스턴스 변수의 값들이 같을 때 같은 값을 반환한다.
public int hashCode() {
    return Objects.hash(iv 변수들...);
}
  • equals()
    - equals()를 오버라이딩 하면 hashCode()도 오버라이딩해야 한다. 왜냐하면 String 객체처럼 equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문이다. 
    String a = "abc";
    String b = "abc";
    System.out.println(a == b);                    // true
    System.out.println(a.equals(b));               // true
    System.out.println(a.hashCode() == b.hashCode()); // true

String 클래스

  • String은 빈 문자열("")로 초기화하고 char은 공백(' ')으로 초기화하는 것이 좋다. 
  • join(구분자, 여러 문자열)은 문자열 사이에 구분자를 넣어 결합해 준다.
    String[] arr = {"1", "2", "3"};
    String str = String.join("-", arr);
    System.out.println(str); // 1-2-3
  • parse~() → valueOf()
  • 자바 컴파일러, JVM은 String을 특별하게 취급한다. String 클래스에서 this는 내부적으로 문자열 데이터(값)를 가리킨다. 

StringBuffer 클래스

  • StringBuffer/StringBuilder 클래스는 String 클래스와 달리 mutable로 내용 변경이 가능하다.
  • 문자열 길이가 내부 배열의 크기보다 클 경우 내부적으로 새로운 배열을 생성한 뒤 배열의 내용을 복사하고 참조 변수를 변경하는 과정을 거친다.
  • append()는 배열의 끝(뒤)에 요소를 추가하는 메서드이고 반환 타입은 StringBuffer 객체 자신이다. 그렇기 때문에 sf.append().append()... 이런 식으로 메서드 체이닝이 가능한 것이다. 
  • delete() 삭제, insert() 삽입
  • StringBuffer는 String과 달리 equals()가 오버라이딩 되어있지 않기 때문에 내용 비교를 하려면 String으로 바꾼 뒤 equals()를 사용한다. 
  • StringBuffer와 StringBuilder의 차이점은 동기화의 유무에 있다. StringBuffer는 동기화가 되어 있어 멀티스레드에 안전한 반면 StringBuilder는 동기화 되어 있지 않다. 

cf. 싱글 스레드는 한 번에 1개의 작업을 하는 것이고 멀티 스레드는 한 번에 n개의 작업을 할 수 있는 것이다. 멀티 스레드는 스레드끼리 데이터를 공유하고 공유 자원을 가지고 있기 때문에 작업을 동시에 처리하기 위해서는 데이터 보호를 위해 동기화 처리가 필수다. 

Number 클래스는 숫자와 관련된 모든 wrapper 클래스들의 조상이다.

  • JDK1.5 이후로 오토박싱과 언박싱을 지원한다.
  • 즉 기본형과 참조형 간의 형변환을 허용하는데 사실 컴파일러에서 intValue(), new Integer() 등의 코드를 자동 삽입해 주기 때문에 가능한 것이다.