반응형
Object클래스
- 모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다
equals(Object obj)
- 객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false
- Object클래스의 equals()는 객체의 주소를 비교 (참조변수 값 비교)
class EqualsEx1 {
public static void main(String[]args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if ( v1.equals(v2)) {
System.out.println("v1과 v2는 같습니다.");
} esle {
System.out.println("v1과 v2는 다릅니다.");
}
v2 = v1;
if (v1.equals(v2)) {
System.out.println("v1과 v2는 같습니다.");
} else {
System.out.println("v1과 v2는 다릅니다.");
}
} //main
}
class Value {
int value;
Value(int value) {
this.value =value;
}
}
- equlas메서드로 Value인스턴스가 가지고 잇는 value값을 비교 하도록 할 수는 없을까? Value클래스에서 equals메서드를 오버라이딩하여 주소가 아닌 객체에 저장된 내용을 비교하도록 변경
-
class Person { long id; public boolean equals(Object obj) { if(obj!=null && obj instanceof Person) { return id == ((Person)obj).id; } else { return false; } } Person(long id){ this.id =id; } } class EqualsEx2 { public static void main(String[] args) { Person p1 = new Person(8011081111222L); Person p2 = new Person(9011091111222L); if(p1==p2) System.out.println("p1과 p2는 같은 사람입니다."); else System.out.println("p1과 p2는 다른 사람입니다."); if(p1.equals(p2)) System.out.println("p1과 p2는 같은 사람입니다."); else System.out.println("p1과 p2는 다른 사람입니다."); } }
hashCode()
- 객체의 해시코드(hash code)를 반환하는 메서드
- Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
- equals()를 오버라이딩하면, hashCode()도 오버라이딩해야 한다.
- equals()의 결과 true인 두 객체의 해시코드는 같아야 하기 때문
public class HashCodeEx1 {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println (str1.equals ( str2 ));
System.out.println (str1.hashCode ());
System.out.println (str2.hashCode ());
//System.identityHashCode(Object obj)는 Object클래스의 hashCode()와 동일
//객체마다 다른 해시코드 반환
System.out.println (System.identityHashCode ( str1 ));
System.out.println (System.identityHashCode ( str2 ));
}
}
- String클래스는 문자열의 내용이 같으면, 동일한 해시코드를 반환하도록 hashCode메서드가 오버라이딩되어 있기 때문에, 문자열의 내용이 같은 str1과 str2에 대해 hashCode()를 호출하면 항상 동일한 해시코드값을 얻는다.
toString(), toString()의 오버라이딩
- toString() : 객체를 문자열(String)으로 변환하기 위한 메서드
class Card{
String kind;
int number;
Card() {
this("SPADE", 1);
}
Card(String kind, int number){
this.kind = kind;
this.number = number;
}
//Object클래스의 toString()을 오버라이딩
public String toString() {
return "kind:"+kind+", number:" + number;
}
}
public class Ex9_4 {
public static void main(String[] args) {
System.out.println (new Card().toString ());
System.out.println (new Card().toString ());
}
}
- Card클래스에서 Object클래스로부터 상속받은 toString()을 오버라이딩 하지 않았기 떄문에 Card인스턴스에 toString()을 호출하면, Object클래스의 toString()이 호출된다.
String 클래스
String 클래스 = 데이터(char[]) + 메서드(문자열 관련)
내용을 변경할 수 없는 불변(immutable) 클래스 이며 String 클래스는 앞에 final이 붙어 있으므로 다른 클래스의 조상이 될 수 없다.
문자열의 결합이나 변경이 잦다면, 내용을 변경가능한 StringBuffer를 사용
문자열의 비교
문자열을 만드 때는 2가지 방법이 있다
- 문자열 리터럴을 지정하는 방법
- String클래스의 생성자를 사용해서 만드는 방법
String str1 = "abc"; //문자열 리터럴 "abc"의 주소가 str1에 저장됨
String str2 = "abc"; //문자열 리터럴 "abc"의 주소가 str2에 저장됨
String str3 = new String("abc"); // 새로운 String인스턴스를 생성
STring str4 = new String("abc"); // 새로운 String인스턴스를 생성
String클래스의 생성자를 이용한 경우에는 new연산자에 의해서 메모리할당이 이루어지기 때문에 항상 새로운 String인스턴스가 생성된다. 그러나 문자열 리터럴은 이미 존재하는 것을 재사용하는 것이다
문자열 리터럴
- 문자열 리터럴은 프로그램 실행시 자동으로 생성된다(constant pool에 저장)
빈 문자열 ("", empty string)
- 내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열
String str = ""; // str을 빈문자열로 초기화
- 크기가 0인 배열을 생성하는 것은 어느 타입이나 가능
char[] chArr = new char[0]; //길이가 0인 char배열
int[] iArr = {}; // 길이가 0인 int 배열
String s= ""; 과 같은 표현이 가능하다고해서 char c= ''; 와 같은 표현도 가능한 것은 아니다
char형 변수에는 반드시 하나의 문자를 지정해야한다.
'Language > Java' 카테고리의 다른 글
List, Set, Map (0) | 2021.10.10 |
---|---|
StringBuffer클래스 (0) | 2021.10.03 |
예외 처리 (0) | 2021.09.27 |
인터페이스 (0) | 2021.09.26 |
내부 클래스 (0) | 2021.09.25 |