Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[3주차] 58. Object 클래스에 존재하는 equal(), toString() 메소드 오버라이딩*** 본문

K-DigitalTraining 강의/1. Java

[3주차] 58. Object 클래스에 존재하는 equal(), toString() 메소드 오버라이딩***

이대곤 2022. 6. 2. 09:48

* Object 클래스란?

   클래스 작성시 혹은 자바에 존재하는 모든 클래스는 명시해주지 않아도 자동적으로 extends Object 가 붙으며
   모든 클래스가 Object 클래스를 상속받게 된다. 즉, Object 클래스는 모든 클래스의 최상위 부모인 것이다.
   Object 는 멤버함수를 가지고 있는데 보통 이를 오버라이딩 해서 사용하게 된다.
   아래는 자주 오버라이딩 되어 사용되는 Object의 equals(), toString() 메소드이다.
   또한, 따로 import 해주지 않아도 이 클래스의 메소드를 사용할 수 있는데,
   이건 Object 클래스가 java.lang 패키지에 존재하기 때문임

 

* Object 클래스의 equal() 메소드 

  Object 클래스의 equal() 메소드는 두 객체의 주소를 비교하여 그 주소가 같다면 true, 다르면 false를 반환한다.
  == 연산자도 Object 클래스의 equal() 메소드와 같게 객체가 인자로 주어지면 주소를 비교하여 그 결과를 반환함.
  사용자 입장에서 보통 객체가 같은지 다른지를 볼 때 주소를 비교하기보다는 객체 내부의 값을 비교해서 판단하고 싶기
  때문에 오버라이딩되어 사용된다.
이 메소드를 오버라이딩 해서 사용할 때는 주의할 점이 있다.
  매개변수로 Object 타입의 객체를 받고 있기 때문에 다형성에 의해 모든 클래스의 객체가 들어올 수 있는데, 이것 때문에
  실행부에서 instanceof 로 원하는 타입이 맞는 경우에만 작동하도록 해줘야 한다.

class Object{

	public boolean equals(Object obj){
		...
	}
}

 

* Object 클래스의 toString() 메소드

  Object 클래스의 toString() 메소드는 주소를 반환하는데, 별 의미없는 정보라서 보통 오버라이딩 하여 사용된다.

class Object{

	public String toString(){
		...
	}
}

1. Object 클래스의 equal() 메소드 오버라이딩 예시

class Fruit2 { // 모든 클래스는 Object 클래스를 자동으로 상속받음 "extends Object"
	String name;
	int price;

	Fruit2(String name, int price) {
		this.name = name;
		this.price = price;
	}
	
	// Object 클래스로부터 상속받은 equal() 메소드 오버라이딩
	public boolean equals(Object obj) { 
		if(obj instanceof Fruit2) {
			Fruit2 fr2 = (Fruit2)obj;
			//여기서의 equals는 String의 equals() 메소드로 객체 내부의 값을 비교한 결과가 반환되어 Object 클래스의 equals() 와 다름
			return this.name.equals(fr2.name);  
		}else {
			return false;
		}
	}
}

public class Ex08_01_Equals {
	public static void main(String[] args) {
		
		// case1. 
		// "apple" 은 new String("apple")과 같은데 new를 사용하지 않고 아래와 같이 연달아 같은걸 만들라고 하면 
		// 새로운 객체를 만드는게 아니라 이미 존재하는 것의 주소를 그냥 가리키게 됨 
		String s = "apple";
		String s2 = "apple"; // 같은 "apple" 문자열이므로 효율상 새로운 공같에 다시 안만들고 미리 존재하는 "apple" 의 주소를 가리키게됨.
		System.out.println(s == s2); // 주소비교 : 결과값 true
		
		// case2.
		// new 를 사용하여 같은 문자열로 객체를 생성하면 서로 다른 주소공간에 2개의 객체가 만들어짐
		s = new String("apple"); 
		s2 = new String("apple"); 
		System.out.println(s == s2); // 주소비교 : 결과값 false
		System.out.println();
		
		// case1과 같은 방식으로 작동하는 경우
		Fruit2 f1 = new Fruit2("apple", 1000);		// 객체 내부에서 new String("apple")를 통해 객체가 생성되어 같은 예제가 되는 것임
		Fruit2 f2 = new Fruit2("apple", 2000);		  
		System.out.println(f1.name == f2.name); 	// 주소비교 : 결과값 true
		System.out.println(f1.price == f2.price);	// 주소비교 : 결과값 false
		System.out.println();
		
		// case2와 같은 방식으로 작동하는 경우
		Fruit2 f3 = new Fruit2(new String("apple"), 1000);
		Fruit2 f4 = new Fruit2(new String("apple"), 2000);
		System.out.println(f3.name == f4.name); 	// 주소비교 : 결과값 false
		System.out.println(f3.price == f4.price);	// 주소비교 : 결과값 false
		System.out.println();
		
		System.out.println(f1.equals(f2));			// 내부의 값비교 : 결과값 true
	}
}

실행결과

true
false

true
false

false
false

true

2. Object 클래스의 toString() 메소드 오버라이딩 예시

class Fruit { // 모든 클래스는 Object 클래스를 자동으로 상속받음 "extends Object"
	private String name;
	int price;

	Fruit(String name, int price) {
		this.name = name;
		this.price = price;
	}

	String getName() {
		return this.name;
	}

	int getPrice() {
		return this.price;
	}
	
	// Object 클래스로부터 상속받은 toString() 메소드 오버라이딩
	public String toString() {
		return name + "," + price;
	}
}

public class Ex08_01_ToString {
	public static void main(String[] args) {
				
		Fruit f1 = new Fruit("apple", 1000);
		Fruit f2 = new Fruit("orange", 2000);
		
		System.out.println(f2.getName() + ":" + f2.getPrice());
		System.out.println();
		
		System.out.println(f1.toString());
		System.out.println();
		
		System.out.println(f1);				// 객체 출력을 시도하면 자동으로 객체의 toString() 메소드가 호출됨 
	}
}

실행결과

 
 
 
orange:2000

apple,1000

apple,1000
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Comments