[자바] Object 클래스 - equals() 메서드와 toString() 메서드

Gammi·2022년 11월 3일
0

JAVA

목록 보기
25/35
post-thumbnail

📁 Object 클래스


  • java.lang 패키지에 위치하는 클래스

  • 최상위 클래스

    -> 상속 표현하지 않아도 자동으로 상속 가능

  • Object 클래스의 모든 멤버 다른 클래스에서 사용, 오버라이딩 가능





📂 equals() 메서드


  • public boolean equals(Object o) {}

  • 두 객체가 같은지 동등 비교 수행

    -> 주소값이 같으면 true, 다르면 false 리턴

  • 객체가 가지는 멤버가 같은지 비교하고 싶으면 equals() 메서드를 오버라이딩 해서 각 객체의 멤버변수끼리 비교하도록 수정해서 사용

  • 자바에서 제공하는 대부분의 클래스는 Object 클래스의 equals() 메서드를 오버라이딩 해놨기 때문에 객체 비교 가능


< equals() 메서드 자동 생성 단축어 >

Alt + Shift + S -> H


public static void main(String[] args) {
  Person p1 = new Person("홍길동", 20);
  Person p2 = new Person("홍길동", 20);
  // 객체값 출력해보면 주소가 다르게 나옴
  
  if(p1 == p2) {
    System.out.println("두 객체의 주소값이 같다");
  } else {
    System.out.println("두 객체의 주소값이 다르다");
  }
  // 위에서 주소값 달랐으니까 당연히 다르다 출력됨
  // 원래는 equals 쓰면 주소값 비교해서 다르다고 나오는데
  // 얘는 지금 클래스 내에서 오버라이딩을 해놨기 때문에
  // 주소값을 비교하는 게 아니라서 동등비교 연산자 사용했음
  
  if(p1.equals(p2)) {
    System.out.println("두 객체의 내용(멤버변수 값)이 같다");
  } else {
    System.out.println("두 객체의 내용(멤버변수 값)이 다르다");
  }
  // 이건 같다고 출력됨
}

class Person{
  String name;
  int age;
  
  public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
  }
  
  @Override
  public boolean equals(Object obj) {
  // 자동완성으로 오버라이딩한 equals() 메서드
  // 이렇게 만들면 파라미터로 객체를 전달하면서
  // 자동으로 Object 타입으로 업캐스팅이 됨
  // 그러면 고유 멤버에는 접근이 불가능해지기 때문에 다시 다운캐스팅을 해야한다...
  // 다운캐스팅할 때 instanceof 쓰면 더 편함...
    if(obj instanceof Person) {
      Person p = (Person)obj;
      // 다운캐스팅!
      if(name.equals(p.name) && jumin.equals(p.jumin)) {
        return true;
        // 다운캐스팅된 객체의 멤버변수랑 인스턴스 멤버변수 비교
        // 문자열끼리 비교하는 거라서 String 클래스의 equals() 메서드 이용!
        // 자동완성할 때 잘 보고 선택하기!!
      }
    }
  }
}





📂 String 객체 생성 방법


  1. 리터럴 할당을 통해 생성하는 방법(일반적인 방법)
  • 상수풀에서 동일한 문자열이 존재하는지 검사 후,
    존재하지 않으면 새로 생성, 존재하면 해당 주소값 리턴!

⭐ 입력

String s1 = "Hello";
String s2 = "Hello";

// 동등연산자로 주소값 비교하기
if(s1 == s2) {
  System.out.println("s1과 s2는 주소값이 같다");
} else {
  System.out.println("s1과 s2는 주소값이 다르다");
}

// equals() 메서드로 값 비교하기
if(s1.equals(s2)) {
  System.out.println("s1과 s2의 내용이 같다");
} else {
  System.out.println("s1과 s2의 내용이 다르다");
}

📌 출력

s1과 s2는 주소값이 같다
s1과 s2의 내용이 같다

  1. 일반적인 클래스 인스턴스 생성하는 방법(new 연산자 사용)
  • new 연산자에 의해 Heap 공간에 문자열 객체 생성,
    동일한 문자열 가진 객체가 존재하더라도 새로 생성함

String s3 = new String("Hello");
String s4 = new String("Hello");

if(s3 == s4) {
  System.out.println("s3과 s4는 주소값이 같다");
} else {
  System.out.println("s3과 s4는 주소값이 다르다");
}

if(s3.equals(s4)) {
  System.out.println("s3과 s4의 내용이 같다");
} else {
  System.out.println("s3과 s4의 내용이 다르다");
}

📌 출력

s3과 s4는 주소값이 다르다
s3과 s4의 내용이 같다





📂 toString() 메서드


  • public String toString() {}

  • 어떤 객체의 정보를 문자열로 변환하여 리턴

  • 기본적으로 Object 클래스의 toString() 메서드는 객체의 주소값을 문자열로 리턴하도록 정의되어 있음

  • 객체 정보를 리턴하고 싶다면 toString() 메서드를 오버라이딩하여 멤버변수 값을 문자열로 결합하여 리턴해야 함

  • 출력문 내 toString() 메서드 생략 가능

    -> 참조변수명만으로 사용 가능

  • 자바에서 제공하는 대부분의 클래스는 toString() 메서드 오버라이딩 되어 있기 때문에 객체에 저장된 값을 문자열로 리턴받을 수 있음


< toString() 메서드 자동 완성 단축키 >

Alt + Shift + S -> S


public static void main(String[] args) {
  Person p = new Person("홍길동", 20, "031010-1234567");
  System.out.println(p.toString());
  System.out.println(p);
  // 출력문에는 toString() 메서드 생략 가능함
}

class Person {
  String name;
  int age;
  String jumin;
  
  pulbic Person(String name, int age, String jumin) {
    super();
    this.name = name;
    this.age = age;
    this.jumin = jumin;
  }
  
  @Override
  public String toString() {
    return "Person [name=" + name + ", age=" + age + ", jumin=" + jumin + "]";
  }
}
profile
개발자가 되었어요⭐️

0개의 댓글