Programing Language/Java

[Java] 자바 오브젝트 클래스(Java Object Class)

vinedpillar 2022. 7. 18. 15:11

자바 오브젝트 클래스

  • 자바 오브젝트 클래스는 java.lang에 포함된 라이브러리입니다.

  • 클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않으면 자동으로 Object 클래스를 상속하게 됩니다.

  • 따라서 자바의 모든 클래스는 Object의 자식이나 자손 클래스입니다.

  • 때문에 Object 클래스의 메서드는 모든 클래스에서 활용 가능합니다.

 

 

 

오브젝트 클래스의 주요 메서드

  • boolean equals(Object obj): 클래스 인스턴스의 주소를 비교하여 참, 거짓의 결과를 반환합니다.

  • int hashCode(): 인스턴스의 해시코드를 반환합니다. 

  • String toString(): 인스턴스를 문자열 정보로 반환합니다.

 

 

 

equals(Object obj) 메서드

  • equals() 메서드는 두 클래스 인스턴스의 주소를 비교하여 boolean 값을 반환합니다.

  • equals() 메서드는 매개 변수를 Object 타입으로 받기 때문에 모든 클래스가 매개 변수로 대입될 수 있습니다.

  • equals() 메서드는 비교 연산자(==)와 동일한 결과를 반환합니다.
    • 객체간 비교 시 주소값만 비교하기 때문에 내용이 같은지를 비교할 때 == 연산자로는 부정확한 결과가 나올 수 있습니다.
    • 이 경우 equals() 메서드를 활용하여 비교하는 것이 좋습니다. 

  • 일반적으로 비교의 목적에 따라 오버라이딩하여 사용하며, 다른 라이브러리에도 오버라이딩되어 사용되고 있습니다.  
equals(Object obj) 메서드 사용 예시

public class Student {
    public String name;
    
    public Student(String name) {
        this.name = name;
    }
    
    // equals 메서드 오버라이딩
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Student std) {
            if(name.equals(std.name)) {
                return true;
            }
        }
        return false;
    }
}

public class EqualsExample {
    public static void main(String[] args) {
        Student std1 = new Student();
        Student std2 = new Student();
        Student std3 = new Student();
        
        if(std1.equals(std2)) {
            System.out.println("std1과 std2는 동일합니다");
        }
    }
}

 

 

 

 

hashCode() 메서드

  • 해시코드(hashcode)란 객체를 식별할 수 있는 고유한 번호를 뜻합니다.

  • hashCode() 메서드는 생성된 인스턴스의 메모리 주소를 이용하여 해시코드를 생성하기 때문에 각 인스턴스마다 다른 값을 반환합니다.

  • hashCode() 메서드는 equals() 메서드와 함께 객체가 동등한지를 비교할 때 사용됩니다.
    • hashCode(): 특정 조건에 의해 같은 고유 번호를 반환하는지 확인
    • equals(): 내부적으로 같은 데이터를 가지는지 확인
    • 두 메서드에서 모두 true를 반환해야 같은 객체로 확인
  • hashCode() 메서드는 일반적으로 인스턴스간에 데이터를 식별할 수 있는 고유 데이터(식별자)를 기준으로 재정의하여 원하는 값을 반환하도록 오버라이딩하여 활용합니다.
    (생성된 인스턴스가 다르더라도 내부 값이 같다면 같은 인스턴스로 분류하기 위해 활용)
hashCode() 메서드 사용 예시

public class Student {
    private int id;
    private String name;
    
    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }
    
    public int getId() {
    	return id;
    }
    
    public String getName() {
    	return name;
    }
    
    // hashCode() 메서드 오버라이딩
    @Override
    public int hashCode() {
        int hashcode = id + name.hashCode();
        
        return hashCode;
    }
    
    // equals() 메서드 오버라이딩
    @Override
    public boolean equals(Object obj) {
    	if(obj instanceof Student std) {
        	if(id == std.getId() && name.equals(std.getName()))) {
            	return true;
            }
        }
        
        return false;
    }
}


public class HashCodeExample {
    public static void main(String[] args) {
        Student std1 = new Student(1, "홍길동");
        Student std2 = new Student(1, "홍길동");
        
        if(std1.hashCode() == std2.hashCode()) {
            if(std1.equals(std2)) {
            	System.out.println("같은 객체입니다.");
            }
            else {
            	System.out.println("데이터가 다르므로 같은 객체가 아닙니다.");
            }
        }
        else {
        	System.out.println("해시코드가 다르므로 같은 객체가 아닙니다.");
        }        	
    }
}

 

 

 

 

toString() 메서드

  • toString() 메서드는 생성된 인스턴스의 문자 정보를 반환합니다.

  • 기본적으로 toString() 메서드를 사용하면 '클래스이름@16진수해시코드'로 구성된 문자열을 반환합니다.

  • toString() 메서드 역시 다른 Object 클래스의 메서드와 같이 원하는 형식의 문자열을 반환하도록  오버라이딩하여 활용합니다.
toString() 메서드 사용 예시

public class Student {
    private String grade;
    private String classNumber;
    private String name;
    
    public Student(String grade, String classNumber, String name) {
        this.grade = grade;
        this.classNumber = classNumber;
        this.name = name;
    }
    
    // toString() 메서드 오버라이딩
    @Override
    public String toString() {

        return grade + "학년 " + classNumber + "반 " + name;
    }
}


public class EqualsExample {
    public static void main(String[] args) {
        Student std1 = new Student("1", "2", "홍길동");
        
        // std1의 정보를 변수에 담아 출력
        String std1Info = std1.toSring();
        System.out.println(std1Info);
    }
}