본문 바로가기

TIL(Today I Learned)

TIL-230926(자바의정석 Chapter09 'java.lang패키지와 유용한 클래스')

📝오늘 공부한 것

  • 자바의 정석 공부 - Chapter 10
  • 이력서 수정하기
  • 자바의 정석 스터디

 

📌 자바의 정석 스터디

[ java.lang 패키지]

Object클래스

Object클래스는 멤버변수는 없고 오직 11개의 메서드만 가지고 있음

이 메서드들은 모든 인스턴스가 가져야할 기본적인 것들임

 

equals(Object obi)

  • 매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean값으로 알려주는 역할
  • 객체를 생성할 때, 메모리의 비어있는 공간을 찾아서 생성하므로 서로 다른 두 개의 객체가 같은 주소를 갖는 일은 있을 수 없음. 두 개 이상의 참조변수가 같은 주소값을 갖는 것은 가능함.
  • String클래스뿐만 아니라, Date, File, wrapper클래스의 equals메서드도 주소값이 아닌 내용을 비교하도록 오버라이딩되어 있다. 그러나, StringBuffer클래스는 오버라이딩되어있지 않다.

toString()

  • 인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의된 메서드

clone()

  • 자신을 복제하여 새로운 인스턴스를 생성하는 일을 한다.
  • Object클래스에 정의된 clone()은 단순히 인스턴스변수의 값만 복사하기 때문에 참조타입의 인스턴스 변수가 있는 클래스는 완전한 인스턴스 복제가 이루어지지 않는다.

공변 반환타입

  • 오버라이딩할 때 조상메서드의 반환타입을 자손 클래스의 타입으로 변경으로 허용하는 것
    → 조상의 타입이 아닌, 실제로 반환되는 자손 객체의 타입으로 반환할 수 있어서 번거로운 형변환이 줄어든다는 장점이 있다.

 

얕은 복사와 깊은 복사

  • clone()은 단순히 객체에 저장된 값을 그대로 복제할 뿐, 객체가 참조하고 있는 개체까지 복제하지 않는다.
  • 얕은 복사 : 객체에 저장된 값은 복사하는 것. 원본과 복제본이 같은 객체를 공유한다. 원본을 복사하면 복사본도 영향을 받는다.
  • 깊은 복사 : 원본이 참조하고 있는 객체까지 복제하는 것. 원본과 복사본이 서로 다른 객체를 참조하기 때문에 원본의 변경이 복사본에 영향을 미치지 않는다.

getClass()

  • 자신이 속한 클래스의 Class객체를 반환하는 메서드
  • Class객체는 이름이 ‘Class’인 클래스의 객체
  • Class객체는 클래스의 모든 정보를 담고있으며, 클래스당 1개만 존재한다.
  • 클래스 파일이 ‘클래스 로더’에 의해서 메모리에 올라갈 때, 자동으로 생성된다.

→ 즉, 클래스 객체란, 클래스 파일을 읽어서 사용하기 편한 형태로 저장해 놓은 것을 말한다.

 

String클래스

생성된 String인스턴스가 갖고 있는 문자열은 읽을 수만 있고, 변경할 수는 없다.

 

문자 인코딩 변환

문자열을 숫자로 변환하는 과정에서는 예외가 발생하기 쉽기 때문에 주의를 기울여야하고, 예외가 발생했을 때의 처리를 적절히 해주어야 한다.

 

StringBuffer클래스와 StringBuilder클래스

  • String클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만, StringBuffer는 가능하다.
  • 내부적으로 문자열 편집을 위한 buffer를 가지고 있으며, StringBuffer인스턴스를 생성할 때 크기를 지정할 수 있다.
  • 이때, 편집할 문자열의 길이를 고려하여 버퍼의 길이를 충분히 잡아주어야 한다.
  • 버퍼의 크기를 지정해주지 않으면 16개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다.

StringBuilder

  • StringBuffer는 멀티쓰레드에 안전하도록 동기화되어 있다.
  • 멀티쓰레드로 작성된 프로그램이 아닌 경우, StringBuffer의 동기화는 불필요하게 성능만 떨어뜨리게 된다.
  • StringBuilder는 StringBuffer에서 쓰레드의 동기화만 뺀 것이다.

 

Math클래스

  • Math클래스의 생성자는 접근 제어자가 private이기 때문에 다른 클래스에서 Math인스턴스를 생성할 수 없도록 되어있다.
    → 클래스 내에 인스턴스변수가 하나도 없어서 인스턴스를 생성할 필요가 없기때문
  • Math클래스의 메서드는 모두 static이다.

StrictMath클래스

  • Math클래스는 최대한의 성능을 얻기위해 OS에 의존적인 계산을 하고 있다.
  • StrictMath클래스란 어떤 OS에서 실행되어도 항상 같은 결과를 얻도록 Math클래스를 새로 작성한 것이다.

wrapper클래스

  • wrapper클래스를 이용하면 기본형 값을 객체로 다룰 수 있다.
  • wrapper클래스들은 모두 equals()가 오버라이딩되어 있어서 주소값이 아닌 객체가 가지고 있는 값을 비교한다.
  • ‘오토박싱’ 기능 때문에 반환값이 기본형일 때와 래퍼클래스일 때의 차이가 없어졌다.
  • 따라서, valueOf()를 사용 → 성능은 ‘타입.parse타입’보다는 조금 더 느림

오토박싱 : 기본형 값을 wrapper클래스의 객체로 자동형변환 해주는 것

언박싱 : 반대로 변환하는 것

 

[유용한 클래스]

java.util.Objects클래스

  • Object클래스의 보조 클래스로 Math클래스처럼 모든 메서드가 ‘static’이다.
  • 객체의 비교나 null체크에 유용하다.
  • isNull(), nonNull, requireNonNull(), compare() 등이 있다.

java.util.Random클래스

  • Math.random()과의 차이점은 종자값을 설정할 수 있다는 것이다.
  • 종자값이 같은 Random인스턴스들은 항상 같은 난수를 같은 순서대로 반환한다.

정규식 - java.util.regex패키지

  • Pattern : 정규식을 정의하는데 사용
  • Matcher : 정규식을 데이터와 비교하는 역할

java.util.StringTokenizer클래스

  • StringTokenizer는 긴 문자열을 지정된 구분자를 기준으로 토큰이라는 여러 개의 문자열로 잘라내는 데 사용된다.
  • 구분자로 단 하나의 문자 밖에 사용하지 못하기 때문에 복잡한 형태의 구분자로 문자열을 나누어야 할 때는 정규식을 사용하는 메서드를 사용해야 한다.

java.util.BigInteger클래스

  • 정수형으로 표현할 수 없을 때 사용한다.
  • 성능은 Long타입보다 떨어짐.
  • 가능하면 산술연산 대신 비트연산으로 처리하도록 노력해야 한다.

java.util.BigDecimal클래스

  • double타입으로 표현할 수 없을 때 사용한다.

 

💡 .equals()  vs  ==

지금까지 '==는 주소값을 비교하고, equals는 값을 비교한다.'라고만 알고 있었는데, 오늘 스터디를 통해 새로운 것을 알게 되었다!!

Object클래스에서는 ==뿐만 아니라 equals도 객체의 주소값을 비교하는 것이었다.

String클래스에서는 equals를 값을 비교할 수 있도록 오버라이딩하여 문자열의 내용을 비교할 수 있게 된 것이었다!!