Obejct클래스는 모든 객체의 조상인 부모클래스이다. 모든 객체가 암시적으로 extends Object를 가지고 있다고 생각하면 된다.

이런 계층구조를 가지는 이유는, 객체를 만들어내는 모든 클래스가 공통으로 포함하고 있어야 하는 기능을 제공하기 위해서이다.


Object가 모든 클래스의 부모이며, 다형성의 개념으로서, 어느 객체든 변수에 받을 수 있을 뿐만 아니라
어느클래스든 자식클래스가 되므로 (형변환)하여 대입할 수 있다는 개념을 이용해서
비교시 하는 메소드()의 파라미터에 해당 객체형이 아닌 Obejct형으로 받아서, 그것을 형변한 해도 비교가 가능하다는 것을 실습해보자.


1. 같은 클래스지만, 다른 필드값을 가질 객체를 생성할 Archer클래스를 만들어보자.

이름과, 공격력 변수를 만들고, 생성자도 만들어, 사용되는 곳에서 초기화 될 수 있게 하자

2. 다형성을 이용해서, 부모클래스의 참조변수 Object안에 들어있는 객체가 Archer객체로서, 필드값(name, power) 같는지 물어보고
   boolean을 반환하는 equals()메소드를 만들어주자.
  ( 비교할 때, 둘 다 Archer객체를 만들어서 비교할 것임)

확인하는 방법은

  1. 들어오는 Object변수를, 확인해줄 Archer클래스로 형변환 한다. 그러면 Object변수는 Archer의 객체가 된다.
    그러면 자동으로, Archer의 필드인 name과 power를 가지고 있게 된다.
    ( 상위계층(Object) –> 하위계층(Archer)에 대입할 때는 형변환 필수)
  2. Object에서 비롯하여 형변환이 된 Archer객체를 –> Archer의 참조변수 temp 에 넣는다.
    이렇게 object변수를 Archer형으로 형변환할 수 있는 이유는 <더 상위계층, 부모클래스>이기 때문에 가능하다.
    넘어온 매개변수 Object는 암시적으로 자신을 상속한 Archer클래스로 형변환이 가능하다.
  3. if문으로 Archer객체가 가지는 name과 < – > temp속 name이 같은지 물어본다. 동시에 power도 같은지 물어본다.
  4. 같으면 true, 그렇지 않다면 false를 return한다.


public class Archer {
    
     String name;
     String power;
    
     public Archer(String name, String power) {
         this.name = name;
         this.power = power;
        
     }
    
    
     public boolean equals(Object obj) {
         Archer temp = (Archer) obj;
         if( name == temp.name && power == temp.power) {           
            
             return true;   
            
         }else {
            
             return false;
            
         }
        
     }
    
    
}


3. 메인클래스-메인함수를 구현해서, Archer클래스의 객체를 생성하고, 사용해보자.

  1. 2개의 객체를 생성하고, 참조변수에 넣어준다.
  2. 이제 2개의 객체를 비교해주기 위해서,  출력문에 archer1 == archer2 객체를 바로 비교한다. 당연히 false가 출력된다.
    필드값들이 서로 다르게 초기화 되었기 때문에 서로 다른 객체이다.
  3. 만약 초기화값을 같게 해줘도, false가 반환된다. 기본적으로 각각 생성된 객체는 hashCode가 다르기 때문에,
    초기화하여 내부 필드들이 갔더라도 완전이 다른 객체이다.
  4. 이제 Archer클래스의 equals()메소드를 이용해서 비교해보자. 초기화 값이 같다면 true가 반환된다.
    equals()라는 메소드는 같은 Archer객체로서, 들어있는 필드값이 같은지를 물어보기 때문이다.

public class Main {

    public static void main(String[] args) {
        
         Archer archer1 = new Archer("궁수1", "상");
         Archer archer2 = new Archer("궁수1", "상");
         System.out.println(archer1 == archer2);
         System.out.println(archer1.equals(archer2));

    }

}

정리

모든 클래스의 조상은 Object클래스이다. 같은 종류의 객체를 비교하는 메소드를 만들 때,  파라미터에 (Object obj)가 들어있어도
호출시에는 자식이되는 모든 클래스들을 넣어도 상관없다. 대신 형변환을 해줘야 같은 객체의 필드값들이 같은지 비교할 수 있다.

+ Recent posts