[JAVA]equals()メソッド(オブジェクト、String、Integerクラス、上書き)


Objectsランクの方法では、toString()に続いて、今回はequals()を見てみましょう.
equals()メソッドequals()は、2つのインスタンスのアドレス値を比較することによって同じインスタンスを決定する方法であり、同じ場合はtrue、異なる場合はfalsebooleanの値を返す.
ここでアドレス値を比較する場合、値が同じであれば、もちろん同じインスタンスです.例として、Studentというクラスを作成して比較します.
public class equalTest {
    public static class Student {
        String name;
        int studentNum;

        public Student (String name, int studentNum) {
            this.name=name;
            this.studentNum=studentNum;
        }
    }
    public static void main(String[] args) {
        Student st1 = new Student("kim",111);
        Student st2 = new Student("lee",222);
        Student st3= st1;

        System.out.println(st1.equals(st2));
        System.out.println(st1.equals(st3));

    }
}

/* 출력결과
false
true
*/
st1およびst2は異なる例であることが明らかである.st3st1からコピーされたものであり、st1と同じアドレス値を指す.したがって、同じインスタンスを共有します.
ただし、アドレスが同じ(物理的に同じ)場合、論理的に2つのインスタンスが同じと判断された場合、equals()を再定義することができる.
論理的に同じ2つのインスタンスは?
作成したばかりのStudioオブジェクトStudent st4= new Student("kim",111);を使用して、新しいオブジェクトを作成します.では、st4st1の名前と学号は同じ学生です.st1st4が指す例は異なるが、論理的には同じ学生である.この場合、st 1とst 4を同じ学生として扱うのが正しい結果である.
したがって、equals()は、プログラム上でも同様の判断ができるように過度に調整されるべきである.
再定義されたequals()StringクラスおよびIntegerクラスでは、equals()メソッドが再定義されているので、Studentクラスのequals()メソッドを上書きするために使用される.
まず、equalsがStringクラスとIntegerクラスでどのように動作するかを理解しましょう.
public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "abc";

        System.out.println(str1.equals(str2));


        Integer num1 = 100;
        Integer num2 = 100;

        System.out.println(num1.equals(num2));

    }
    
    /*출력결과
    true
    true
    */
str1およびstr2は同じ内容であるが、インスタンスアドレスは異なる.しかしequalsで比較すると、結果は同じです.このことから,String型のequals()は,2つのオブジェクトの内容が同じであれば同じと考える.num1num2も同様であり、変数に割り当てられた値が同じであればInteger型ではインスタンスのアドレス値ではないと考えられる.
equals()を使用して再定義
次に示すように、Studioクラスのequals()を再定義するために使用できます.
@Override
public boolean equals(Object obj) {
  if (obj instanceof Student) { //비교대상이 Student형이면
    Student std = (Student)obj;
    if(this.studentId == std.studentId)
      return true; //학번이 같으면 같은 사람
    else
      return false;
 	 }
    return false;
  }