본문 바로가기

Java

Object클래스(equal, hashCode, toString, String클래스, join)

출처 - Java의 정석 기초편 (남궁 성)

 

 

1. Object클래스
- 모든 클래스의 최고 조상
- 오직 11개 메서드 → 모든 클래스에서 바로 사용 가능

protect Object clone() // 오버라이딩시 public
public boolean equals(Object obj)
protected void finalize() // 오버라이딩시 public
public Class getClass // 설계도 정보
public int hashCode()
public String toString()
public void notify()
public void notifyAll()
public void wait()
public void wait(long timeout)
public void wait(long timeout, int nanos)



2. equals()
- 객체 자신(this)과 주어진 객체(obj)를 비교, 반환타입 boolean
- Object클래스의 equals()는 객체 주소 비교(참조변수 값 비교)
- 주소 비교: 서로 다른 객체는 항상 거짓

public boolean equals(Object obj) {
    return (this==obj);
}



3. equal() 오버라이딩
- 인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩 → 형변환 필요
- equals() 오버라이딩시 hashCode()도 오버라이딩 해야 함
- equals()의 결과가 true인 두 객체의 해시코드가 같아야 하기 때문

class Person {
    long id;
    
    public boolean equsals(Object obj) {
        if(obj instanceof Person)
            return id == ((Person)obj).id; // iv 값 비교로 오버라이딩
        else
            return false;
    }
}



4. hashCode()
- 객체의 지문인 hashCode를 반환하는 메서드
- 객체의 주소를 int로 변환해서 반환
- String클래스는 문자열의 내용이 같으면 동일한 hashCode를 반환하도록 hashCode메서드가 오버라이딩 되어 있음
- System.identityHashCode(Object obj)는 객체마다 항상 다른 hashCode 반환


5. toString()
- 객체를 문자열으로 변환하기 위한 메서드
- 객체 == iv집합 이므로 iv 값을 문자열로 변환한다는 것과 같음

public String toString() { // 클래스이름@16진수객체주소
    return getClass().getName()+”@“+Integer.toHexString(hashCode());
}

 


6. toString() 오버라이딩
- 인스턴스 변수들의 값을 문자열로 변환하여 반환하도록 오버라이딩
- 오버라이딩시 조상에 정의된 접근 범위보다 같거나 넓어야 함

public String toString() {
    return “kind : “ + kind + “, number : “ + number;
}

 


7. String클래스

- 문자열을 다루기 위한 클래스

- 데이터(char[])+문자열 관련 메서드

- 변경 불가능한(immutable) 클래스

- 덧셈 연산자 이용해 문자열 결합시 새로운 String인스턴스가 생성 → 메모리 공간 차지해 성능 저하

- 문자열 결합이 잦거나 내용 변경 필요시 StringBuffer클래스 사용

 

public final class String implements java.io.Serializable, Comparable { // final 조상 클래스 불가
	private char[] value; // 문자배열
    ... // 메서드 잔뜩 들어 있음
}

 

 

8. 문자열(String) 비교

- 문자열 리터럴 지정: 여러 참조변수가 하나의 문자열 리터럴 공유

- String클래스의 생성자 사용: new → 항상 새로운 문자열 생성

- 문자열 내용비교, equals 내용 비교

 

String str1 = "abc"; // 0x100
String str2 = "abc"; // 0x100
String str3 = new String("abc"); // 0x200
String str4 = new String("abc"); // 0x300

 

 

9. 문자열 리터럴(String리터럴)

- 실행시 프로그램에 있는 모든 문자열은 자동으로 생성되어 상수 저장소(constant pool)에 저장

- 같은 내용의 문자열 리터럴은 하나만 생성

- 내용 변경 불가

 

 

10. 빈 문자열(empty string)

- ""

- 내용이 없는 문자열

- 길이가 0인 char형 배열을 저장하는 문자열

- 길이가 0인 배열을 생성하는 것은 어느 타입이든 가능

- 유용: 숫자 → 문자,  문자와 문자열 초기화

 

char[] chArr = new char[0]; // 길이가 0인 char배열
int[] iArr = {}; // 길이가 0인 int배열

Strigng s = ""; // 빈 문자열로 초기화
char c = ' '; // 공백으로 초기화

 

 

11. String클래스 생성자와 메서드

 

String(String s) // String s = new String("Hello")
String(char[] value) // char[] c = {'H','e','l','l','o'};
String(StringBuffer buf) // StringBuffer sb = new StringBuffer("Hello")
char charAt(int index)
int compareTo(String str) // 사전순 비교(0, 음수, 양수)
String concat(String str) // 문자열 결합
boolean contains(CharSequence s) // 지정된 문자열 포함되었는지 검사
boolean endsWith(String suffix)
boolean startsWith(String prefix)
boolean equals(Object obj) // 문자열 비교
boolean equalsIgnoreCase(String str)
int indexOf(int ch) // index 반환, 없으면 -1
int indexOf(int ch, int pos) // 검색 시작 위치 지정
int indexOf(String str) // 시작 인덱스 반환
String intern()
int lastIndexOf(int ch) // 오른쪽 끝에서부터 찾아서 index 반환
int lastIndexOf(String str)
int length()
String replace(char old, char nw) // 문자 대체
String replace(CharSequence old, CharSequence nw) // 문자열 대체
String replaceAll(String regex, String replacement)
String replaceFirst(String regex, String replacement)
String[] split(String regex) // 분리자(regex)로 나누어 문자열 배열에 담아 반환
String[] split(String regex, int limit) // 지정된 수(limint)로 자름
String substring(int begin)
Stirng substring(int begin, int end) // begin ≤ x < end
String toString // 문자열 반환
String toLowerCase() // 소문자
String toUpperCase() // 대문자
String trim() // 양끝 공백 제거, 문자열 수정 불가 → 새로 생성
Static String valueOf(기본형) // toString() 호출한 결과 반환

 

 

12. join()과 StringJoiner

- join()은 여러 문자열 사이에 구분자를 넣어 결합 ↔ 구분자로 문자열을 자르는 split()

- java.util.StringJoiner클래스

 

String animals = "dog,cat,bear";
String[] arr = animals.split(",");

System.out.pringln(String.join("-", arr)); // dog-cat-bear

StringJoiner sj = new Stringjoiner("/","[","]");
for(String s : arr)
    sj.add(s.toUpperCase());
    
System.out.println(sj.toSTring()); // [DOG/CAT/BEAR]

 

 

13. 문자열 ↔ 기본형

- 숫자 → 문자열: 숫자 + ""(빈 문자열), String.valueOf()

- 문자열 → 숫자: Integer.parseInt(), Integer.valueOf()

- 오토박싱에 의해 Integer → int 자동변환