[JAVA]ch8. java.lang 패키지와 유용한 클래스

황인권·2024년 6월 4일

JAVA

목록 보기
8/15

1. java.lang 패키지

  • 자바 프로그래밍에 가장 기본이 되는 클래스들을 포함하고 있다. 그렇기 때문에 import문 없이도 사용할 수 있게 되어 있다.

Object 클래스

  • equals(Object Obj)
    • 매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean 값으로 알려주는 역할을 한다.
    • Object 클래스로부터 상속받은 equals 메서드는 두 참조변수에 저장된 값(주소 값)이 같은지 판단하는 기능밖에 할 수 없다.
    • 인스턴스가 가지고 있는 값을 통해서 비교하고 싶다면 equals 메서드를 오버라이딩하여 변경하면 된다.
    • String 클래스 역시 Object 클래스의 equals 메서드를 그대로 사용하는 것이 아니라 오버라이딩을 통해서 문자열 값을 비교하도록 되어있다.
  • hashCode()
    • Object 클래스에 정의된 hashCode 메서드는 객체의 주소값을 이용해서 해시코드를 만들어 변환하기 때문에 서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없다.
    • 클래스의 인스턴스변수 값으로 객체의 같고 다름을 판단해야 한다면 equals와 마찬가지로 hashCode 메서드도 적절히 오버라이딩해야 한다.
  • toString()
    • 인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의된 것이다.
    • Object 클래스에서 toString()의 접근 제어자가 public이므로, 이를 오버라이딩하는 클래스에서는 toStirng()의 접근제어자를 public으로 할 수 밖에 없다.
  • clone()
    • 자신을 복제하여 새로운 인스턴스를 생성한다.
    • Object 클래스의 clone 메서드는 단순히 인스턴스 변수의 값만을 복사하기 때문에 참조타입의 변수는 주소를 복제하기 때문에 원래의 인스턴스에 영향을 미친다. 이런 경우 clone 메서드를 오버라이딩해야 한다.
    • clone()을 사용하려면, 먼저 복제할 클래스가 Clonable 인터페이스를 구현해야하고, clone()을 오버라이딩하면서 접근 제어자를 protected에서 public으로 변경해야 한다.

얕은 복사(Shallow Copy)

  • 객체를 복사할 때, 해당 객체만 복사하여 새 객체를 생성한다.
  • 복사된 객체의 인스턴스 변수는 원본 객체의 인스턴스 변수와 같은 메모리 주소를 참조한다.
  • 따라서, 해당 메모리 주소의 값이 변경되면 원본 객체 및 복사 객체의 인스턴스 변수 값은 같이 변경된다.

깊은 복사(Deep Copy)

  • 객체를 복사할 때, 해당 객체와 인스턴스 변수까지 복사하는 방식.
  • 전부를 복사하여 새 주소에 담기 때문에 참조를 공유하지 않느다.
  • getClass()
    • 자신이 속한 클래스의 Class 객체를 반환하는 메서드이다.

      Class 객체는 클래스의 모든 정보를 담고 있으며, 클래스 당 1개만 존재한다.
      클래스 파일이 '클래스 로더'에 의해서 메모리에 올라갈 때, 자동으로 생성된다.

    • Class 객체를 이용하면 클래스에 정의된 멤버의 이름이나 개수 등, 클래스에 대한 모든 정보를 얻을 수 있기 때문에 Class 객체를 통해서 객체를 생성하고 메서드를 호출하는 등 보다 동적인 코드를 작성할 수 있다.

String 클래스

  • 변경 불가능한 클래스
    • 문자열간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우에는 String 클래스 대신 StringBuffer 클래스를 사용하는 것이 좋다.
  • 문자열의 비교
    • 문자열을 만들 때는 2가지 방법, 문자열 리터럴을 지정하는 방법과 String 클래스의 생성자를 사용해서 만드는 방법이 있다.
    • String 클래스의 생성자를 이용한 경우에는 new 연산자에 의해서 메모리 할당이 이루어지기 때문에 새로운 String 인스턴스가 생성된다.
      그러나, 문자열 리터럴은 이미 존재하는 것을 재사용하는 것이다.
    • 따라서, 각 String 인스턴스의 주소를 비교했을 때 결과가 달라질 수 있다.
  • 문자열 리터럴
    • 자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다. 이 때 같은 내용의 문자열 리터럴은 한번만 저장된다.
  • 빈 문자열
    • java String s = ""; 은 가능하지만 java char c = '';은 불가능하다.
  • 유니코드의 보충문자
    • String 클래스의 메서드 중 매개변수의 타입이 char인 것들이 있고 int인 것이 있다.
      이는 확장된 유니코드를 다루기 위한 것이다.

StringBuffer 클래스와 StringBuilder 클래스

  • StringBuffer 클래스는 문자열 변경이 가능하다.
  • 이 때, 편집할 문자열의 길이를 고려하여 버퍼의 길이를 충분히 잡아주는 것이 좋다.
  • 버퍼의 크기를 지정해 주지 않으면 16개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다.

  • < StringBuffer의 비교 >
    • StringBuffer 클래스는 equals를 오버라이딩하지 않아서 동가비교연산자(==)와 같은 결과가 나온다.
    • 반면에 toString()은 담고 있는 문자열을 String으로 반환하도록 오버라이딩 되어있다.
      그래서 StringBuffer 인스턴스에 담긴 문자열을 비교하기 위해서는 toString()을 호출해서 String 인스턴스를 얻은 다음에 equals 메서드를 사용하여 비교해야 한다.
  • < String Builder >
    • StringBuffer 클래스에서 쓰레드의 동기화만 뺀 클래스이다. 동기화가 StringBuffer의 성능을 떨어뜨리기 때문이다.

래퍼(wrapper) 클래스

  • 기본형 변수를 객체로 다뤄야 하는 경우에 사용된다.
  • char 형과 int 형을 제외한 나머지는 자료형의 이름의 첫글자를 대문자로 한 것이 각 래퍼클래스의 이름이다.
    • char -> Character
    • int -> integer
  • 래퍼클래스의 생성자는 매개변수로 문자열이나 각 자료형의 값들을 인자로 받는다.
  • 래퍼클래스들은 모두 equals()가 오버라이딩되어 있어서 객체가 가지고 있는 값으로 비교한다.

Number 클래스

  • 추상 클래스로 내부적으로 숫자를 멤버변수로 갖는 래퍼 클래스들의 조상이다.

오토박싱 & 언박싱

  • 컴파일러가 자동으로 기본형과 참조형 간의 계산이 가능하도록 변환하는 코드를 넣어준다.
  • 기본형 값을 래퍼클래스의 객체로 자동으로 변환해주는 것을 '오토박싱'이라 하고, 반대로 변환하는 것을 '언박싱'이라고 한다.

2. 유용한 클래스

정규식 : java.util.regex

  • 정규식을 정의하고 데이터를 비교하는 과정
    • 정규식을 매개변수 Pattern 클래스의 static 메서드인 Pattern compile(String regex)을 호출하여 Pattern 인스턴스를 얻는다.
      java pattern p = Pattern.compile(”c[a-z]*”);
    • 정규식으로 비교할 대상을 매개변수로 Pattern zmffotmdml Matcher (CahrSequance input)를 호출해서 Matcher 인스턴스를 얻는다.
      java pattern p = Pattern.compile(”c[a-z]*”);
    • Matcher 인스턴스에 boolean matchses()를 호출해서 정규식에 부합하는지 확인한다.
      java pattern p = Pattern.compile(”c[a-z]*”);
profile
inkwon Hwang

0개의 댓글