1. Object 클래스의 메서드
- 모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다.
- notify( ), wait( )등은 쓰레드와 관련된 메서드이다.
- equals( ), hashCode( ), toString( )은 적절히 오버라이딩해야 한다.
2. equals(Object obj)
- 객체가 자신과 주어진 객체(obj)를 비교한다. 같으면 true 다르면 false
- Object클래스에 정의된 equals( )는 참조변수 값(객체의 주소)을 비교한다.
- 서로 다른 객체는 주소가 항상 다르다.
- equals( )를 오버라이딩해서 인스턴스변수의 값을 비교하도록 바꾼다.
< equals를 오버라이딩 하지 않고 사용했을 때 >
package javaStandard;
public class Ex9_1_1 {
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는 같습니다");
else
System.out.println("v1과 v2는 다릅니다.");
}
}
class Value{
int value;
Value(int value){
this.value = value;
}
}
// 서로 다른 객체는 같은 값을 집어 넣더라도 주소가 다르다. (오버라이딩 하지 않은 equals를 사용하면 객체의 값을 비교하는 것이 아닌 객체의 주소값을 비교하기 때문)
<equals() 오버라이딩 해준 뒤 사용했을 때>
package javaStandard;
public class Ex9_1_1 {
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는 같습니다");
else
System.out.println("v1과 v2는 다릅니다.");
}
}
class Value{
int value;
Value(int value){
this.value = value;
}
public boolean equals(Object obj) {
Value v = (Value)obj; // obj는 값이 없기에 형변환를 해준다.
return this.value == v.value;
}
}
// 서로 같다고 인식한다. equals()를 오버라이딩 해준 뒤 사용했기 때문
🤷♀️여기서 우리는 왜 iv(instance value)으로 객체가 같은지 여부를 판단할까?
- cv의 경우엔 객체마다 공통으로 사용한다(공유)
- 그러나 iv의 경우엔 객체마다 다르게(개별) 사용되기 때문이다
3. hashCode( )
- 객체의 해시코드(int타입의 정수)를 반환하는 메서드(해시함수)
- 다량의 데이터를 저장 검색하는 해싱기법에 사용된다.
- Object클래스의 hashCode( )는 객체의 내부주소(객체의 주소를 int로 변환해서 반환)를 반환한다.
- equals( )를 오버라이딩하면, hashCode( )도 같이 오버라이딩 해야 한다.
- equals( )의 결과가 true인 두 객체의 hash code는 같아야하기 때문이다.
- System.identityHashCode(Object obj)는 Object 클래스의 hashCode( )와 동일한 결과를 반환한다.
4. toString( )
- 객체의 정보를 문자열(String)로 제공할 목적으로 정의된 메서드
- 객체를 문자열로 변환하기 위한 메서드
- toString() = iv 값들을 문자형으로 바꿈
<toString( ) 오버라이딩 없이 사용할 때>
package javajungsuk;
class Card{
String kind;
int number;
Card(){
this("SPADE",1);
}
Card(String kind, int number){
this.kind = kind;
this.number = number;
}
}
public class Java9_3_1 {
public static void main(String[] args) {
System.out.println(new Card().toString());
System.out.println(new Card().toString());
/*결과 출력 클래스이름 객체주소
Card@5305068a
Card@1f32e575 */
}
}
↓
<toString( ) 오버라이딩 해서 사용할 때>
package javajungsuk;
class Card{
String kind;
int number;
Card(){
this("SPADE",1);
}
Card(String kind, int number){
this.kind = kind;
this.number = number;
}
//오버라이딩 해주어야 한다.
public String toString() {
return "kind: " + kind + ", number : "+number;
}
}
public class Java9_3_1 {
public static void main(String[] args) {
System.out.println(new Card().toString());
System.out.println(new Card().toString());
/*결과 출력 클래스이름 객체주소
kind: SPADE, number : 1
kind: SPADE, number : 1 */
}
}
5. getClass( )
- 자신이 속한 클래스의 Class 객체를 반환하는 메서드
- Class객체는 클래스의 모든 정보를 담고 있으며, 클래스당 단 1개만 존재한다.
- 클래스파일(*.class)이 메모리에 로드될 때 생성된다.
6. 실습코드
package javajungsuk;
import java.util.Objects;
class Card{
String kind;
int number;
Card(){
this("SPADE",1);
}
Card(String kind, int number){
this.kind = kind;
this.number = number;
}
//equals()를 오버라이딩하면 hashCode()도 오버라이딩 해야한다.
public int hashCode() {
return Objects.hash(kind,number);
}
public boolean equals(Object obj) {
if(!(obj instanceof Card))
return false;
Card c = (Card)obj;
return this.kind.equals(c.kind) && this.number==c.number;
}
public String toString() {
return "kind: " + kind + ", number : "+number;
}
}
public class Java9_3_2 {
public static void main(String[] args) {
Card c1 = new Card();
Card c2 = new Card();
System.out.println(new Card().toString());
System.out.println(new Card().toString());
System.out.println(c1.equals(c2));
}
}
이클립스가 오버라이딩을 자동으로 진행해줌 (hashCode( )와 equals( )에 대해서)
'Java > 객체지향' 카테고리의 다른 글
[객체지향][자바의 정석] - 9.3 StringBuffer클래스 (0) | 2022.01.17 |
---|---|
[객체지향][자바의 정석] - 9.2 String 클래스 (0) | 2022.01.08 |
[객체지향][자바의 정석] - 8.1 예외처리(Exception Handling) (0) | 2021.12.27 |
[객체지향][자바의 정석] - 7.8 내부 클래스(Inner class) (0) | 2021.12.14 |
객체지향 개념 끝 (0) | 2021.12.14 |