TIL_230228_자바의 정석 복습_java.lang 패키지와 유용한 클래스

창고·2023년 2월 28일
0

본 내용은 <자바의 정석> 내용을 복습, 정리하였습니다.

Chapter 9. java.lang 패키지와 유용한 클래스

1. java.lang 패키지

(1) Object 클래스

  • equals(Object obj) : 매개 변수로 객체의 참조변수를 받아 비교하여 그 결과를 boolean 값으로 알려주는 역할
    • 서로 다른 두 객체는 같은 주소를 갖는 일이 있을 수 없음. 단, 두 개 이상의 참조 변수가 같은 주소값을 갖는 것 (한 객체를 참조하는 것)은 가능
public boolean equals(Object obj) {
	return (this==obj);
}
  • hashcode() : 해싱 기법에 사용되는 해시 함수를 구현한 것. 찾고자 하는 값을 입력 시 그 값이 저장된 위치를 알려주는 해시코드를 반환
    • 해시코드가 같은 두 객체가 존재하는 것이 가능
  • equals and hashcode : 클래스의 인스턴스 변수 값으로 객체의 같고 다름을 판단해야 할 경우 equals와 hashcode 모두 재정의하여 사용해야 함
  • toString() : 인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의됨. 인스턴스 변수에 저장된 값들을 문자열로 표현
  • clone() : 자신을 복제하여 새로운 인스턴스를 생성하는 일. 인스턴스 변수의 값만 복사하므로 참조 타입의 인스턴스 변수가 있는 클래스는 완전한 복제가 이루어지지는 않음
    • 복제할 클래스가 Clonable 인터페이스를 구현해야 하고 clone()을 오버라이딩하면서 접근 제어자를 public으로 변경해야 함
  • 얕은 복사와 깊은 복사
    • 얕은 복사 : 원본과 복제본이 같은 객체를 공유하는 경우. (clone()의 경우 참조 객체까지 복제하지 않고 있어 복제가 되더라도 원본과 같은 객체를 참조하게 됨) 이 경우 원본이 변경되면 복사본도 영향을 받음
    • 깊은 복사 : 원본이 참조하고 있는 객체까지 복제하는 경우. 원본과 복사본이 서로 다른 객체를 참조하고 있어 원본이 변경되더라도 복사본은 영향을 받지 않음
  • getClass() : 자신이 속한 클래스의 Class 객체를 반환하는 메서드
    • Class 객체는 클래스의 모든 정보를 담고 있으며 클래스 당 1개만 존재
    • 클래스 파일이 클래스 로더에 의해 메모리에 올라갈 때 자동으로 생성
    • 클래스 로더는 실행 시 필요한 클래스를 동적으로 메모리에 로드
    • 기존에 생성된 클래스 객체가 메모리에 존재하는지 확인하고 있으면 객체의 참조를 반환, 없으면 클래스 패스에 지정된 경로를 따라 클래스 파일을 찾고 해당 클래스 파일을 읽어 Class 객체로 변환
    • 클래스 객체를 얻는 방법
      • 보다 자세한 내용은 Reflection API를 참고
Class cObj = new Example().getClass(); // 생성된 객체로부터 얻는 방법
Class cObj = Example.class; // 클래스 리터럴(*.class)로부터 얻는 방법
Class cObj = Class.forName("Example"); // 클래스 이름으로부터 얻는 방법

(2) String 클래스

  • 변경 불가능(immutable) 클래스
    • 한번 생성된 String 인스턴스가 갖고 있는 문자열은 읽어올 수만 있고 변경은 불가능
    • 문자열을 + 연산자를 통해 결합하는 경우 문자열끼리 연결되는 것이 아니라 연결된 문자열을 이 담긴 새로운 인스턴스가 생성되는 것
  • 문자열의 비교
    • equals 메서드의 경우 두 문자열의 내용을 비교하므로 문자열 내용이 같다면 true
    • 그러나 등가 비교 연산자 == 사용 시 결과가 다름
  • 문자열 리터럴
    • 소스 파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장됨. 같은 내용의 문자열 리터럴은 한번만 저장되며 리터럴 역시 String 인스턴스이고 한번 생성하면 내용을 변경할 수 없음
    • 이러한 리터럴들은 JVM 내의 상수 저장소에 저장됨
String abc1 = "aaa"; // 리터럴
String abc2 = new String("aaa"); // 생성자, 새 인스턴스를 생성
  • 빈 문자열
    • 길이가 0인 문자열도 존재할 수 있음
String empty = "";

(3) StringBuffer, StringBuilder

  • StringBuffer
    • 지정된 문자열을 변경할 수 있음. 내부적으로 문자열 편집을 위한 버퍼를 가지고 있음
    • StringBuffer 인스턴스 생성 시 그 크기를 지정할 수 있음
    • 멀티쓰레드에 안전(thread safe) 하도록 동기화되어 있음
      • 멀티쓰레드가 아닌 경우 성능이 불필요하게 떨어질 수 있음
  • StringBuilder
    • StringBuffer에서 쓰레드의 동기화만 빼고 나머지 기능은 완전히 똑같음

(4) Wrapper

  • 8개의 기본형을 객체로 저장해야 할 때 사용
  • equals()가 오버라이딩 되어 있어 주소값이 아닌 객체가 가지고 있는 값을 비교

2. 유용한 클래스

(1) java.util.Objects

(2) java.util.Random

(3) java.util.regex - 정규식(Regular Expression)

(4) java.util.StringTokenizer

(5) java.math.BigInteger, BigDecimal

profile
공부했던 내용들을 모아둔 창고입니다.

0개의 댓글