Java/Java의 정석

[Java의 정석] 09. java.lang 패키지

동현 유 2022. 3. 17. 11:32
모르는 것만 짧고 빠르게 정리한 노트입니다.
1.1 Object 클래스

 

  • hashCode() : 객체의 주소값을 이용해서 해시코드를 만들어 반환한다. str 클래스는 문자열 내용이 같으면 도일한 해시코드를 반환하도록 오버라이딩되어 있다
  • toString() : 클래스이름 + @해시코드 값이 기본으로 설정되어있다.
  • clone() : 객체의 값을 복사한다.. 참조타입의 경우에는 주소값을 복사하므로, 얕은복사문제가 있다. Cloneable 인터페이스를 상속받아 오버라이딩해야한다.

 

1.2 String 클래스

 

  • 생성자를 이용한 경우에는 항상 새로운 String 인스턴스가 생성된다.
  • 리터럴은 클래스가 메모리에 로드될 때 미리 생성되어있다. 따라서 같은 리터럴로 초기화되는 변수들은 모두 같은 주소의 문자열 리터럴을 갖는다.
  • immutable 하기 때문에, 연산시에도 항상 새로운 문자열이 생긴다.
  • 문자열 리터럴은 컴파일 시에 바이트코드로 같이 변환되어 .class 파일에 담긴다. 문자열 리터럴이 여러번 나오는 경우에는 해당 리터럴을 한번만 포함시킨다.
  • 빈 문자열을 할달할 수 있다. char 는 안된다. C 언어에서는 문자열 끝에 널 문자가 항상 붙지만, 자바에서는 널 문자를 사용하지 않는다. 대신 문자열의 길이정보를 따로 저장한다.
  • 유니코드의 보충문자 : 원래 2byte 문자체계인데, 20비트로 확장되었다. 기존의 char로 부족해서 int 로 다룰 수 밖에 없다. String 클래스 메서드 중에서 매개변수가 int 인 것은 보충문자를 지원하는 것이다.
  • 문자 인코딩 변환: getBytes 를 이용해 바이트배열을 얻은 후, 새롭게 인코딩을 설정해서 생성자를 통해 생성한다.

 

1.3 StringBuffer 클래스 & StringBuilder 클래스

 

  • 내부적으로 char 배열을 버퍼로 갖고있다. 크기를 지정하지 않으면 16 이 기본값이다.
  • 생성자를 통해 초기 문자열을 넘겨주면, 해당 문자열보다 16 더 크게 버퍼를 생성한다.
  • 버퍼의 크기를 늘려야할 때는, 내부적으로 새로운 배열을 생성한 후, 버퍼의 내용을 복사한다.
  • equals 메서드가 오버라이딩 되어있지 않아서 == 와 같다. 따라서 비교하려면 toString 호출한 후에 equals 를 호출해야한다.
  • threads safe 하다.
  • 동기화 시에는 StringBuffer 의 성능이 떨어지기 때문에, 기능은 똑같은 StringBuilder 를 사용한다.

 

1.4 Math 클래스

 

  • 메서드 이름에 'Exact' 가 포함된 메서드들이 jdk1.8부터 새로 추가되었는데, 정수간의 연산에서 발생할 수 있는 오버플로우를 감지하기 위한 것이다.
  • Math 클래스는 최대한의 성능을 얻기 위해 JVM 이 설치된 OS 의 메서드를 호출해서 사용한다. 즉 OS 마다 결과가 다를 수 있다. 이런 차이를 없애기 위해 성능을 다소 포기하는 대신 이식성이 높은 StrictMath 클래스가 나왔다.

 

1.5 래퍼 클래스

 

  • MAX_VALUE, MIN-VALUE, SIZE, BYTES, TYPE 등의 static 상수를 갖고 있다.
  • 오토박싱이 된다고 해도, == 를 사용할 수 없다.
  • 문자열을 숫자로 변환할 때는 parseInt, valueOf 와 같은 메소드를 사용하는데, 전자는 반환값이 원시형이고 후자는 래퍼 클래스 타입이다.
  • 오토박싱/언박싱 : jdk1.5 부터 도입되어서 기본형과 래퍼 클래스 타입 간의 연산이 가능하다. 컴파일 시에 자동으로 변환하는 코드를 추가해준다.

 

2.1 Objects 클래스

 

  • isNull(), nonNull() -> boolean
  • requireNonNull() -> NullPointerException!
  • equals() -> null 검사를 내부에서 알아서 해준다. 단 두개의 매개변수 모두가 null 인 경우는 참을 반환
  • deepEquals() -> 재귀적인 equal 검사
  • toString() -> 내부에서 null 검사, 두번째 인자는 첫번째가 널인 경우에 대신 사용하는 값을 지정한다.

 

 

2.5 java.util.StringTokenizer 클래스

 

 

2.6 java.math.BigInteger 클래스

 

 

2.7 java.math.BigDecimal 클래스