프로그래밍

[자바 기초] day10 : 상속 심화(오버라이딩 점 예제) 본문

자바/자바 기초

[자바 기초] day10 : 상속 심화(오버라이딩 점 예제)

시케 2023. 5. 18. 11:15
728x90
반응형

2023.05.16.화

오버라이딩

오버라이딩은 메서드를 재정의 하는 것이다

오버라이딩을 통해 기존에 있던 메서드를 원하는 기능으로 바꾸어 쓸 수 있다

오버라이딩

다음 코드는 해당 두 객체의 이름(name)이 같으면 알을 획득했다는 메세지가 출력되며

같지 않으면 "..."이라는 메세지가 출력되는 프로그램이다

package class01;

// [ 상속 - 심화 ]
class Pokemon{
   String name;
   
   Pokemon(){
      this("포켓몬");
   }
   
   Pokemon(String name){
      this.name=name;
   }
   
   void printInfo() {
      System.out.println("이 포켓몬은 "+this.name+"입니다.");
   }  
}

class Pika extends Pokemon{
   Pika(){   
      super("피카츄");
   }
}

class Charmander extends Pokemon{
   Charmander(){
      super("파이리");
   }
}

public class Test01 {

   public static void main(String[] args) {
      
      Pika p1=new Pika();
      Pika p2=new Pika();
      Charmander c1=new Charmander();
      
      if(p1.equals(c1)) {
         System.out.println("알을 획득했습니다!");
      }
      else {
         System.out.println(".....");
      }  
      
   }

}

 

위의 코드로 실행을 시켰을때 이름이 같음에도 "..."이라고 출력되는 결과를 볼 수 있다

해당 문제가 발생하는 이유는 연산의 대상객체가 될 수 없기 때문이다

우린 이런 일을 String 비교에서도 볼 수 있다

String은 == 비교연산자로 비교가 불가능하며 equals를 사용해야 한다

 

그렇다면 equals를 사용해도 오류가 나는 이유는 무엇일까?

해당 코드처럼 작성할시 비교하는 것은 두 객체의 이름이 아닌 주소이다

그렇기에 같지 않다고 나온다

 

이러한 현상을 해결하기 위해

오버라이딩을 해보자

 

 

다음 코드는 Pokemon 클래스 안에 있다

   @Override
   public boolean equals(Object obj) {
	   
	   Pokemon pokemon = (Pokemon)obj;	// 강제 형변환, 명시적 형변환, 다운 캐스팅
      
      if(this.name.equals(pokemon.name)) {
         return true;
      }
      
      return false;
   }

 

원래 equals()는 자바에서 기본 제공해주는 최상위 클래스, Object 클래스의 것이다

우린 명시적 형변환(강제 형변환, 다운캐스팅)을 통해 pokemon의 클래스 것으로 바꾸었다

그 후 두 객체의 이름끼리 비교한 뒤 같으면 true, 다르면 false로 출력한다

 

[ 연습 문제 ]

점 클래스 Point가 있다.
int x,int y(좌표)를 멤버변수로 가지고 있다.

x,y의 좌표가 같다면 같은 점으로 인식할 수 있도록 하여라
main(){
   Point[] data=new Point[3];
   data[0]에는 점(10,20)
   data[1]에는 점(123,20)
   data[2]에는 점(10,20)
      이 저장되어있다.
   data[0]과 data[1],
   data[0]과 data[2]를 비교
}

package class01;

class Point { // 점 클래스
	int x;
	int y;

	// 생성자 x, y 모두 입력받음
	Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
	
	// 오버라이딩
	@Override
	public boolean equals(Object obj) {
		Point point = (Point) obj;	// 명시적 형변환

		if ((this.x == point.x) && (this.y == point.y)) { // 같으면 true
			return true;
		}
			
		return false;
	}
}

//색깔 점 클래스 (점 클래스 상속)
class ColorPoint extends Point {
	String color;	// 부모에 없는 멤버변수

	//생성자 x, y, 색깔 모두 입력 받음
	ColorPoint(int x, int y, String color) {
		super(x, y);
		this.color = color;
	}
	
	// 오버라이딩
	@Override
	public boolean equals(Object obj) {
		ColorPoint colorPoint = (ColorPoint) obj; // 명시적 형변환

		// x, y, 색깔 모두 같으면 true
		if ((this.x == colorPoint.x) && (this.y == colorPoint.y) && (this.color.equals(colorPoint.color))) {
			return true;
		}
		return false;
	}
}

public class Test03 {

	public static void main(String[] args) {
		//점 클래스 객체 배열
		Point[] data = new Point[3];
		data[0] = new Point(10, 20);
		data[1] = new Point(123, 20);
		data[2] = new Point(10, 20);

		//색깔 점 클래스 객체 배열
		ColorPoint[] data2 = new ColorPoint[3];
		data2[0] = new ColorPoint(10, 20, "blue");
		data2[1] = new ColorPoint(10, 20, "blue");
		data2[2] = new ColorPoint(10, 20, "red");
		

		// 점 객체 비교
		if (data[0].equals(data[1])) {
			System.out.println("O");
		} else {
			System.out.println("X");
		}

		if (data[0].equals(data[2])) {
			System.out.println("O");
		} else {
			System.out.println("X");
		}
		

		// 색깔 점 객체 비교
		if (data2[0].equals(data2[1])) {
			System.out.println("O");
		} else {
			System.out.println("X");
		}

		if (data2[0].equals(data2[2])) {
			System.out.println("O");
		} else {
			System.out.println("X");
		}

	}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
Comments