개발/Java

[Java] Object

suniverse 2023. 3. 4. 19:37

java.lang.Object는 모든 클래스의 최상이 클래스이다.

=> 별도로 상속을 받지 않는 클래스는 묵시적으로 Object를 상속받는다. 

 

✍ Object 객체 생성

public static void main(String[] args) {
    Object o = new Object(); // 인스턴스 생성 
    System.out.println(o);
    System.out.println(o.toString());
}

=> Object도 일반 클래스와 동일하게 인스턴스 생성 후 사용이 가능하다 

 

💻

 


🔍 Object로 부터 상속받은 메서드 활용해보기

 

우선 Object로 상속받은 메서드를 사용하기 위해 Person이라는 클래스를 생성해보자 

 

class Person {
	String name;
	int age;
	public Person() {}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}	
}

 

✍ getClass() 메서드 

 

- 현재 객체의 클래스 정보를 Class 타입 객체로 리턴하는 메서드이다. 

예를 들어, Person 클래스의 참조변수 p1의 getClass() 결과를 출력하면 : class Person이 출력된다)

- 해당 클래스의 클래스명을 얻으려면 getClass() 메서드 결과에 다시 .getName()을 붙인다 

- 클래스명만 필요할 경우 getClass() 메서드 결과에 다시 .getSimpleName()을 붙인다 

 

public static void main(String[] args) {
    Person p1 = new Person();
    System.out.println("p1 : " + p1);
    System.out.println("p1.getClass() : " + p1.getClass());
    System.out.println("p1.getClass().getName()" + p1.getClass().getName());
    System.out.println("p1.getClass().getSimpleName()" + p1.getClass().getSimpleName());
}

 

💻

 

 

✍ hasgCode() 메서드 

참조변수의 주소값을 출력해주는 메서드이다 

System.out.println(p1.hashCode());
System.out.println(Integer.toHexString(p1.hashCode()));

Integer.toHexString() 은 정수값을 16진수로 변환해주는 메서드이다. 

 

💻

 

 

✍ equals() 메서드 

- 두 객체가 같은 객체인지를 판별해주는 메서드이다 

- Object 클래스의 equals() 메서드는 두 객체의 주소값(참조값)을 비교하여 주소값이 같으면 true, 다르면 false를 리턴한다 

 

public static void main(String[] args) {
    int a = 10;
    int b = 10;
    if(a == b) {
        System.out.println("a, b는 같다!");
    } else {
        System.out.println("a, b는 다르다!");
    }
}

=> 기본 데이터 타입 변수값을 비교할 때는 동등비교연산자(==)를 사용하여 비 교한다. 

즉, 기본 데이터타입 변수에 같은 값을 저장할 경우 동등비교연산 결과는 true 이다. 

💻

 

public static void main(String[] args) {
    Object o1 = new Object();
    Object o2 = new Object();

    if(o1 == o2) {
        System.out.println("o1, o2는 같다!");
    } else {
        System.out.println("o1, o2는 다르다!");
    }

    if(o1.equals(o2)) {
        System.out.println("o1, o2는 같다!");
    } else {
        System.out.println("o1, o2는 다르다!");			
    }
}

=> 인스턴스를 생성할 때마다 서로 다른 메모리 공간에 인스턴스가 생성된다. 

그러므로 해당 인스턴스의 주소값도 인스턴스마다 달라진다 ! 

각 인스턴스의 참조변수 o1과 o2를 동등비교 할 때와 equlas() 메서드를 사용했을 때의 결과는 같다. 

 

💻

 

단! equals() 메서는 두 객체의 주소값을 비교하므로, 두 객체에 저장된 데이터가 같더라도 false가 리턴된다. 객체끼리의 비교는 실제 데이터가 아니라 주소값을 비교하는 것 이라는 걸 명심해야 한다! 

 

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Person other = (Person) obj;
    return age == other.age && Objects.equals(name, other.name);
}

=> 클래스 내부에서 equals() 메서드 단축키로 오버라이딩도 가능하다.

Alt + Shift + S -> H