쌓고 쌓다

[JAVA] Object 클래스 본문

프로그래밍/java

[JAVA] Object 클래스

승민아 2022. 5. 21. 18:00

모든 자바 클래스는 Object 클래스를 상속받는다.

즉, 모든 클래스의 슈퍼 클래스이며 모든 객체는 Object 클래스의 메소드를 가진다.

 

그중 몇 가지 메소드에 대해서만 정리한다.

메소드 설명
boolean equals(Object obj) obj가 가리키는 객체와 현재 객체를 비교하여 같으면 true
Class getClass() 현 객체의 런타임 클래스를 리턴
int hashCode() 현 객체에 대한 해시 코드 값 리턴
String toString() 현 객체에 대한 문자열 표현을 리턴

 

hashCode()

  • 객체의 해시코드 값(객체의 주소, 고유값)을 리턴
  • "이 객체의 고유값은?"을 의미하는 hashCode()로 오버라이딩 가능 ( 상속 객체가 오버로딩도 가능 )

실행 코드

public class Hongong {


    public static void main(String args[]){
        Point a = new Point(2,3);
        Point b = new Point(2,3);
        Point c = a;

        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
        System.out.println(c.hashCode());
    }
}

실행 결과

-> a와 c의 해쉬코드가 같다.

 

getClass()

  • 객체의 클래스 정보를 담은 Class 객체 리턴
  • Class 객체의 getName() 메소드는 객체의 클래스 이름을 반환
  • upCasting 관계없이 실제 객체의 클래스 이름을 반환

toString()

  • 객체를 문자열로 리턴
  • 대부분의 클래스에서 toString()을 오버라이딩하여 자신의 객체를 문자열로 표현하도록 구현함.
  • 자신이 개발한 클래스에서 Object의 toString()를 오버라이딩함.

Ojbect 클래스에 구현된 toString의 메소드

 

 

 

모든 메소드 예제 코드

class Point{
    private int x,y;
    public Point(int x,int y)
    {
        this.x=x;
        this.y=y;
    }
}

public class Hongong {

    public static void print(Object obj)
    {
        System.out.println(obj.getClass());
        System.out.println(obj.getClass().getName());
        System.out.println(obj.hashCode());
        System.out.println(obj.toString());
        System.out.println(obj);
    }

    public static void main(String args[]){
        Point p = new Point(2,3);
        print(p);
    }
}

 

실행 결과

 

Point 클래스에 toString() 오버라이딩

class Point{
    private int x,y;

    public Point(int x,int y)
    {
        this.x=x;
        this.y=y;
    }

    public String toString()
    {
        return "Point("+x+","+y+")";
    }


}


public class Hongong {


    public static void main(String args[]){
        Point p = new Point(2,3);
        System.out.println(p.toString());
        System.out.println(p);
    }
}

 

실행 결과

  • 객체 p는 p.toString()으로 자동 변환됨을 알 수 있다.

 

객체 비교 ( 객체==객체 )

==연산자 ( 객체 레퍼런스 비교 )

  • 두 객체의 주소가 같은가?
  • 두 객체의 해시코드 값이 같은가?

실행 코드

public class Hongong {


    public static void main(String args[]){
        Point a = new Point(2,3);
        Point b = new Point(2,3);
        Point c = a;

        if(a==b)
            System.out.println("a==b");
        if(a==c)
            System.out.println("a==c");
    }
}

a와 c는 같은 객체를 가리키고 있다.

a와 b는 같은 값은 같지만 다른 객체이다.

 

실행 결과

-> a와 c만 같다고 나온다.

 

Object 클래스의 equals()

  • 두 객체의 해시코드 값이 같은가?
  • == 와 같은 반환 값

실행 코드

public class Hongong {


    public static void main(String args[]){
        Point a = new Point(2,3);
        Point b = new Point(2,3);
        Point c = a;

        if(a.equals(b))
            System.out.println("a==b");
        if(a.equals(c))
            System.out.println("a==c");
    }
}

 

실행 결과

 

왜? ==랑 똑같은데 equals()를 만들었을까?

  • 개발자가 equals()를 필요한 용도에 맞게 오버라이딩할 수 있게 해 주기 위함. (ex, 객체의 내용이 같은가? 판단 )
  • String의 equals() 메소드가 오버라이딩 된것과 같음 (ex, str.equals("문자열") )

아래와 같이 equals를 오버라이딩해서 사용

class Point{
    private int x,y;

    public Point(int x,int y)
    {
        this.x=x;
        this.y=y;
    }

    public boolean equals(Point p)
    {
        if(x==p.x&&y==p.y)
            return true;
        else
            return false;
    }
}

 

실행 코드

public class Hongong {


    public static void main(String args[]){
        Point a = new Point(2,3);
        Point b = new Point(2,3);
        Point c = new Point(3,4);

        if(a==b)
            System.out.println("a==b");
        if(a.equals(b))
            System.out.println("a equals b");
        if(a.equals(c))
            System.out.println("a eqauls c");
    }
}

 

실행 결과

Comments