본문 바로가기

Kosta 교육

[Day12 - JAVA] chap9. lang 패키지_1

1.1 Object 클래스의 메서드

: 최상위 클래스이므로 모든 클래스는 Object 클래스의 자식이므로 항상 사용이 가능

: 11개의 메서드만 가지고 있음


1.2 equals(Object obj)

: 객체 자신과 주어진 객체(obj)를 비교하며, 같으면 true, 다르면 false

: Object 클래스에 정의된 equals는 참조변수 값(객체의 주소)을 비교

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

: equals를 그대로 가져다 쓰라는 것이 아닌 의미에 맞게 오버라이딩하여 사용하라는 것

// 복소수
class Complex{
    int real;
    int imaginary;
    public Complex(int real, int imaginary){
        this.real = real;
        this.imaginary = imaginary;
    }

    @Override // 주소값이 아닌 안의 값(real, imaginary)를 비교하여 동일하다면 true, 다르다면 false를 반환하도록 오버라이딩을 진행
    public boolean equals(Object obj) {
        if(obj instanceof Complex == false) return false; // 일단 Complex가 될 수 없는 경우 false를 반환
        // 다운 캐스팅이 가능하다면 다운 캐스팅 진행
        Complex c = (Complex) obj;
        return real==c.real && imaginary==c.imaginary;
    }
}
public class EqualsTest2 {
    public static void main(String[] args) {
        Complex c1 = new Complex(3, 5);
        Complex c2 = new Complex(3, 5);
        Complex c3 = new Complex(5, 3);

        System.out.println(c1.equals(c2)); // true
        System.out.println(c1.equals(c3)); // false
    }
}

1.3 hashCode()

: 객체의 해시코드를 반환하는 해시함수

: 동일한 실행에서 한 객체에 대해 hashCode()를 반복해서 호출했을 때 얻어지는 해시 코드는 동일해야 함

: 일반적으로 해시 코드가 같은 인스턴스들이 존재하는 것은 가능하지만 Object 클래스에 정의된 hashCode()는 객체의 주소값으로 해시코드를 생성하기에 두 인스턴스의 해시코드 반환값은 같을 수 없음

: equals()를 오버라이딩했다면, hashCode()도 적절히 오버라이딩해야 함

>> 동일한 데이터가 들어가지 않기 때문에 내부에서 같은 데이터의 입력인지 확인이 필요. 따라서 HashCode()와 equals() 함수로 판단해야 하기 때문에 이 둘의 오버라이딩이 필요 (equals나 hashCode 중 하나라도 오버라이딩하여 판단하지 않을 경우 동일한 값이 중복으로 출력됨)

 

*해시코드(hashCode) : 데이터를 저장하고 검색하는 방법 중 하나인 해싱(hashing)을 구현한 컬렉션 클래스(HashMap, HashSet)에서 객체를 저장하고 읽어올 때 사용하는 키


1.4 toString()

: 객체의 정보를 문자열로 제공할 목적으로 정의된 메서드

public String toString(){ // Object 클래스의 toString()
	return getClass().getName() + "@"
    	+Integer.toHexString(hashCode());
}

 

목적에 맞게 적절하게 오버라이딩하여 사용해야 함

class Person{
    String name;
    int age;
    Person  (String name, int age){
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString(){
        return "이름 : " + name + ", 나이 : " + age;
    }

/*    public String info(){
        return "이름 : " + name + ", 나이 : " + age;
    }*/

}
public class ToStringTest1 {
    public static void main(String[] args) {
        Person p1 = new Person("hong", 30);
        String str = "!!!"+p1;
        System.out.println(p1); 
        // println 자체가 문자열로 출력하는 것. 그렇기에 P만 있어도 p.toString을 의미하게 됨
        // info()를 사용할 필요없이 toString()이 호출됨
    }
}

1.5 clone()

: 객체 자신을 복제해서 새로운 객체를 생성하는 메서드

: Object 클래스에 정의된 clone() 메서드는 멤버변수의 값만을 복제

: 멤버변수가 배열인 경우, 그 내용도 복제하도록 오버라이딩 되어야 하며, Cloneable 인터페이스를 구현한 클래스의 인스턴스만 복제 가능

 

 

깃허브 링크 : https://github.com/Khjin06k/kostaJava/tree/main/src/day12