Chapter09 java.lang패키지와 유용한 클래스(java.lang package & util classes)

21255 단어 JavaJava

1. java.lang패키지

1.1 Object클래스

  • 모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다.
  • 이 중 notify(), wait() 등은 쓰레드와 관련된 메서드이다.

<equals(Object obj)>

  • 객체 자신과 주어진 객체를 비교하여, 같으면 true, 다르면 false를 반환
  • 객체의 주소를 비교(참조변수 값 비교) (왜냐하면 서로 다른 두 객체는 항상 주소가 다르기 때문)

<hashCode()>

  • 객체의 해시코드(hash code, 객체의 지문)를 반환하는 메서드
  • Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환.
  • equals()를 오버라이딩하면, 두 객체의 hashCode()는 같아야 한다.
  • System.identityHashCode(Object obj)는 Object클래스의 hashCode()와 동일

<toString()>

  • 객체를 문자열(String)으로 변환하기 위한 메서드
  • 보통 오버라이딩을 한다.

<clone()>

  • 자신을 복제하여 새로운 인스턴스를 생성.
  • 단, 참조타입의 인스턴스 변수가 있는 클래스는 완전한 인스턴스 복제가 이루어지지 않고 복제본이 원래의 인스턴스에 영향을 미치게 된다.
//아래와 같이 Cloneable 인터페이스를 구현해야 clone()을 사용할 수 있다.
class 클래스명 implements Cloneable {
 // ...
	public Object clone() {
    	Object obj = null;
        try {
       	  obj = super.clone()
        } catch(CloneNotSupportedException e) { }
        return obj;
    }
}

<얕은 복사와 깊은 복사>

  • 얕은 복사 : 복사본이 원본에 영향을 끼침
  • 깊은 복사 : 복사본이 원본에 영향을 끼치지 않음.

<getClass()>

자신이 속한 클래스의 Class객체를 반환하는 메서드.

1.2 String클래스

  • 문자열을 다루기 위한 클래스
  • String클래스 = 데이터(char[]) + 메서드(문자열 관련)
  • 내용을 변경할 수 없는 불면(immutable) 클래스
  • 내용이 바뀔 수 없기 때문에 덧셈 연산자를 이용한 문자열 결합은 성능이 떨어짐(새로운 문자열이 담긴 String인스턴스가 생기기 때문) -> StringBuffer를 사용

<문자열의 비교>

String str1 = "abc";
String str2 = "abc"; // 하나의 문자열(abc), 좋은 방법를 str1과 str2가 공유함(주소).
String str3 = new String("abc");
String str4 = new String("abc"); // str3, str4는 각각 새로운 객체(문자열)가 생성됨

따라서 등가비교(==, 주소 비교) 연사자를 사용하지 말고, .equals()를 사용하여 내용 비교를 해야한다.

<문자열 리터럴>

  • 프로그램 실행시 자동으로 생성(constant pool)에 저장
  • 같은 내용의 문자열 리터럴은 하나만 만들어진다.

<빈 문자열>

  • 내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열
String str = ""; // str을 빈 문자열로 초기화
char c = ' '; // 공백으로 초기화
  • 크기가 0인 배열을 생성하는 것은 어느 타입이나 가능

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



<join()과 StringJoiner>

  • join()과 StringJoiner는 여러 문자열 사이에 구분자를 넣어서 결합한다.
String animals = "dog,cat,bear";
String[] arr = animals.split(",");
System.out.println(String.join("-", arr)); // 구분자 : "-"
///////////////////////////////////////
 StringJoiner sj = new StringJoiner("/","[","]"); // 구분자 : "/", 시작 : "[", 끝 : "]" 
        for(String s : arr)
            sj.add(s);
System.out.println(sj.toString());

<문자열과 기본형 간의 변환>

1. 숫자를 문자열로 바꾸는 방법

int i = 100;
String str1 = i + "";
String str2 = String.valueOf(i); // 속도가 더 빠름

2. 문자열을 숫자로 바꾸는 방법

int i = Integer.parseInt("100");
int i2 = Integer.valueOf("100"); 
Integer i2 = Integer.valueOf("100"); // valueOf는 참조형으로 나옴.

1.3 StringBuffer클래스와 StringBuilder클래스

<StringBuffer클래스>

  • String처럼 문자형 배열(char[])을 내부적으로 가지고 있다.
  • String과 달리 내용을 변경할 수 있다.

<StringBuffer의 생성자>

public StringBuffer(int length) {
	value = new char[length];
    	shared = false;
}
public StringBuffer() {
	this(16); // 크기 지정을 안하면 버퍼의 크기는 16이됨.
}
public StringBuffer(String str) {
	this(str.length() + 16); // 지정한 문자열보다 16이 더 크게 버퍼를 생성
    	append(str); // str추가

<StringBuffer의 변경>
append() : 끝에 문자열 추가, 지정된 내용을 추가 후 StringBuffer의 참조를 반환

StringBuffer sb = new Stringbuffer("abc");
//sb.append("123");
//sb.append("ZZ");
sb.append("123").append("ZZ");

delete() : 삭제
insert() : 삽입

<StringBuffer의 비교>

  • StringBuffer는 equals()가 오버라이딩 되어있지 않다(주소비교).
  • String으로 변환 후에 equals()로 비교해야하함.

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

<StringBuilder란?>

  • StringBuffer는 동기화 되어 있다. (멀티 쓰레드에 안전(thread-safe))
  • StringBuilder는 동기화가 안되어 있다.
  • 멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요한 성능저하를 일으킴

1.4 Math 클래스

  • 수학관련 static메서드의 집합
  • round()로 원하는 소수점 아래 첫번째 자리에서 반올림

<예외를 발생시키는 메서드>

정수형 간의 연산에서 발생하는 오버플로우를 감지하기 위한 메서드

int addExact(int x, int y);
int subtractExact(int x, int y);
int multiplyExact(int x, int y);
int increamentExact(int a);
int decrementExact(int a);
int negateExact(int a); // 매개변수의 부호를 바꿔줌
int toIntExact(long value);

<StrictMath클래스>

Math클래스는 최대한의 성능을 위해서 OS의 메서들르 호출해서 상용한다. 하지만 OS마다 결과값이 다를 수 있으므로 항상 같은 결과를 가지도록 성능면에서는 손해를 보지만 StricMath메서드를 사용한다.

1.5 래퍼(wrapper) 클래스

  • 8개의 기본형을 객체로 다뤄야할 때 사용하는 클래스.

<Number클래스>

  • 모든숫자 래퍼 클래스의 조상

<문자열을 숫자로 변환하기>

int i = new Integer("100").intValue();
int i2 = Integer.parseInt("100");
Integer i3 = Integer.valueOf("100");
//////////////////////////////////
int i4 = Integer.parseInt("100", 2); // 100(2) -> 4
int i5 = Integer.parseInt("100", 8); // 100(8) -> 64
int i6 = Integer.parseInt("100", 16); // 100(16) -> 256
int i7 = Integer.parseInt("FF", 16); // FF(16) -> 255

<오토박싱 & 언박싱>

  • 기본형을 래퍼 클래스로 바꾸는것을 오토박싱, 그 반대는 언박싱이다.

좋은 웹페이지 즐겨찾기