자바의 정석 ch09. java.lang패키지와 유용한 클래스 (1)

yuju9·2022년 2월 27일
0

자바의 정석 스터디

목록 보기
13/18

java.lang패키지

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

object클래스

  • 멤버변수는 없고, 11개의 메서드만 가지고있음

equals(Object obj)

  • 매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean값으로 알려주는 역할을 함(두 참조변수에 저장된 주소값이 같은지를 판단하는 기능밖에 할 수 없음)
  • 주소가 아닌 객체에 저장된 내용을 비교하도록 변경하는 방법? (equals메서드를 오버라이딩)
    주소값이 아닌, 멤버변수 id의 값을 비교하도록 만들기
public boolean equals(Object obj) {
	if (obj!=null && obj instanceof Person) {
    	return id == ((Person)obj).id;
    } else {
    	return false;
    }
}

hashCode()

  • 해싱 기법에 사용되는 해시함수를 구현한 것
  • 해싱: 데이터 관리기법 중 하나, 다량의 데이터를 저장하고 검색하는데 유용
  • 서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없음

toString()

  • 인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의한 것(인스턴스 변수에 저장된 값들을 문자열로 표현한다는 의미)
  • String인스턴스가 갖고있는 문자열을 반환하도록 오버라이딩 되어있음(+Date클래스도 마찬가지)

clone()

  • 자신을 복제하여 새로운 인스턴스를 생성하는 일을 함
  • 얕은 복사(원본을 변경하면 복사본도 영향을 받음)
  • clonable인터페이스를 구현한 클래스에서만 clone()을 호출할 수 있음
  • clone()을 오버라이딩하면서 접근 제어자를 protected에서 public으로 변경해야 함. 그래야만 상속관계가 없는 다른 클래스에서 clone()을 호출할 수 있음.
  • try-catch내에서 조상클래스의 clone()을 호출
class Point implements Cloneable {
	//...
    public Object clone() {
    	Object obj=null;
        try {
        	obj = super.clone();
        } catch (CloneNotSupportedException e) {}
        return obj;
   	}
}

공변 반환타입

  • 오버라이딩할 때 조상 메서드의 반환타입을 자손 클래스의 타입으로 변경을 허용하는 것
  • ex. clone()의 반환타입을 Object에서 Point로 변경(=조상의 타입에서 자손의 타입으로 변경)
public Point clone() { //반환타입을 Object에서 Point로 변경
	Object obj = null;
    try {
    	obj = super.clone();
    } catch (CloneNotSupportedException e) {}
    return (Point)obj; //point타입으로 형변환
  • 번거로운 형변환이 줄어다는 장점이 있음

getClass()

  • 자신이 속한 클래스의 Class객체(이름이 'Class'인 클래스의 객체)를 반환하는 메서드

String클래스

  • 문자열을 저장하고 이를 다루는데 필요한 메서드 제공

변경 불가능한 클래스

  • String클래스는 앞에 final이 붙어 있으므로 다른 클래스의 조상이 될 수 없다.
  • 한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, 변경할 수는 없다.
    ex. 문자열을 결합(+ 연산자 사용)하는 경우, 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열이 담긴 String인슨터스가 생성됨
String a = "a"; //0x100주소
String b = "b"; //0x200주소
String a = a + b; //0x300주소로 바뀜
  • 문자열 간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우에는 String클래스 대신 StringBuffer클래스를 사용하는 것이 좋다. (StringBuffer인스턴스에 저장된 문자열은 변경이 가능함)

문자열의 비교

  • 문자열을 만들 때의 두가지 방법
  1. 문자열 리터럴을 지정하는 방법
  2. String클래스의 생성자를 사용해서 만드는 방법

문자열 리터럴

  • 자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장됨(같은 내용의 문자열 리터럴은 한번만 저장됨)

빈 문자열

  • 길이가 0인 배열 존재 가능
char[] chArr = new char[0];
int[] iArr = {};

//초기화 방법
String s = "";
char c = ' ';

String클래스의 생성자와 메서드



join()과 StringJoiner

  • join()은 여러 문자열 사이에 구분자를 넣어서 결합
  • ex.
String animals = "dog,cat,bear";
String[] arr = animals.split(",");
String str = String.join("-", arr);
System.out.println(str);

StringBuffer클래스와 StringBuilder클래스

  • 내부적으로 문자열 편집을 위한 버퍼를 가지고 있으며, StringBuffer인스턴스를 생성할 때 그 크기를 지정할 수 있다. 이 때, 편집할 문자열 길이를 고려하여 버퍼의 길이를 충분히 잡아주는 것이 좋다.
  • StringBuffer클래스는 String클래스와 같이 문자열을 저장하기 위한 char형 배열의 참조변수를 인스턴스변수로 선언해 놓고 있다. StirngBuffer인스턴스가 생성될 때, char형 배열이 생성되며 이 때 생성된 char형 배열을 인스턴스변수 value가 참조하게 된다.
public final class StringBuffer implements java.io.Serializable {
	private char[] value;
    ...
}

StringBuffer의 생성자

  • StringBuffer클래스의 인스턴스를 생성할 때, 적절한 길이의 char형 배열이 생성되고, 이 배열은 문자열을 저장하고 편집하기 위한 공간(buffer)으로 사용된다.
public StringBuffer(int length) {
	value = new char[length];
    shared = false;
}

public StringBuffer() {
	this(16); //버퍼의 크기를 지정하지 않으면 자동적으로 버퍼의 크기는 16으로 된다.
}

public StringBuffer (String str) {
	this(str.length() + 16);
    append(str);
}

StringBuffer의 비교

  • StringBuffer클래스는 equals메서드를 오버라이딩하지 않아서 StringBuffer클래스의 equals메서드를 사용해도 등가비교연산자(==)로 비교한 것과 같은 결과를 얻음
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");

System.out.println(sb==sb2); //false
System.out.println(sb.equals(sb2)); //false
  • StringBuffer인스턴스에 담긴 문자열을 비교하기 위해서는 StringBuffer인스턴스에 toString()을 호출해서 String인스턴스를 얻은 다음, 여기에 equals메서드를 사용해서 비교해야 한다.

StringBuffer클래스의 생성자와 메서드




StringBuilder

  • StringBuilder는 멀티쓰레드에 안전하도록 동기화되어있음 ([참고]동기화는 StringBuffer의 성능을 떨어트림. 따라서 StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder가 새로 추가되었음.)
  • 소스코드에서 StringBuffer대신 StringBuilder를 사용하도록 바꾸기만 하면 됨.
StringBuilder sb;
sb = new StringBuilder();
sb.append("abc");

//StringBuffer로 바꾸기
StringBuffer sb;
sb = new StringBuffer();
sb.append("abc");

Math클래스

  • Math클래스는 기본적인 수학계산에 유용한 메서드로 구성되어있음.
  • Math클래스의 생성자는 접근 제어자가 private이기 때문에 다른 클래스에서 Math인스턴스를 생성할 수 없도록 되어있음.(클래스 내에 인스턴스변수가 하나도 없어서 인스턴스를 생성할 필요가 없기 때문)
import static java.lang.Math.*;
import static java.lang.System.*;
  • 반올림: round(), 올림: ceil(), 버림: floor()

래퍼(wrapper) 클래스

  • 객체지향 개념에서는 모든 것은 객체로 다루어져야 하지만, 자바에서는 8개의 기본형을 객체로 다루지 않음.
  • 8개의 기본형을 대표하는 8개의 래퍼클래스가 있는데, 이 클래스를 이용하면 기본형 값을 객체로 다룰 수 있음

Number클래스

  • BigInteger: long으로도 다룰 수 없는 큰 범위의 정수
  • BigDecimal: double로도 다룰 수 없는 큰 범우의 부동 소수점수를 처리하기 위한 것

0개의 댓글

관련 채용 정보