JAVA/개념정리

[상속] Object

Itchild 2024. 4. 6. 14:20
728x90
반응형

코드 먼저 살펴보자

 

package class01;

// [상속]
class Poketmon2{
	String name;
	Poketmon2(){
		this("포켓몬");
	}
	Poketmon2(String name){
		this.name = name;
	}
	void printInfo() {
		System.out.println("이 포켓몬은 " +  this.name + "입니다.");
	}
	// 최상위 클래스 Object 로부터 상속받은 메서드인 equals()를 
	// 살짝 바꿔서 내입맛에 맞춰서 사용하고 싶음!
	// -> 오버라이딩 (하려면 메서드 시그니처가 같아야 함 )
	// -> 메서드 재정의 -> 메서드 시그니처
	
	//예)
//	  void func(double d) { // int 10이 인자로 설정됨
//	      d=10.0;
//	      int i=(int)d; // 형변환(캐스팅)
//	   }
	   
	@Override // 어노테이션 : 프로그램이 인지하는 주석
	public boolean equals(Object obj) { // Object의 equals를 재정의
		// equals 라는 메서드 
		double d = 3; // 3.0
		// 자동형변환
		// 업캐스팅
		
		Poketmon2 poketmon2 = (Poketmon2)obj;
		// 명시적형변환 (강제 형변환)
		// 다운 캐스팅
		// 명시적 형변환 시에는 명시를 해줘야 한다
		
		
		
		// 현재 Object 는 포켓몬 이름을 가지고 있는 상황이 아니다 
		if(this.name.equals(poketmon2.name)) {// 내 이름이랑 비교할 대상의 이름이랑 같아 ?
			return true;
		}
		
		return false;
	}
	 
}

class Pika extends Poketmon2{
	Pika(){
		super("피카츄"); // 아무것도 없는 생성자에서 포켓몬으로 들어가는게 맘에 안들땐?
	}
}

class Charmander extends Poketmon2{
	Charmander(){
		super("파이리");
	}
}
public class Test01 {

	public static void main(String[] args) {

	Pika p1 = new Pika();	// 애초에 객체 비교시에 본질적으로 두개의 객체가 같니?
							// 라고 물어보면 안됨 독립된 객체기 때문에
	Pika p2 = new Pika();	// 두개의 객체가 같은 주소야 ? xxxx
	Charmander c1 = new Charmander();	
		
	// 예를 들어 포켓몬을 키워주는 키우미집이 있다.	
	// : 포켓몬1마리 , 포켓몬 2마리를 키워준다. 
	// -> 피카츄 피카츄 -> 알 o
	// -> 파이리 피카츄 -> 알 x
	
	// 두 포켓몬의 종류가 같니 ? 물어보기 
	// p1, c1을 키우미집에 맡겼다! 
	// p1==c1이 에러 나는 이유 : 연산자와 대상이 객체가 될수 없음!
	// ex) 문자열
	// equals()메서드는(객체비교시에 쓴다) 두개의 객체가 같은 주소일때만 True 가 뜬다. 
	// p1.equals(p1) -> o
	// p1.equals(p2) -> x
	// 객체를 비교하는 상황이라 연산자는 못씀 // equals를 사용
	if(p1.equals(p2)) {//이 질문이 같은 주소니 ? 물어보는 질문이라 같지않다 // p1과 c1이 같은 포켓몬이야?
		// equals 라는 메서드를 쓴것 
		// 다시 돌아와서 비교하면 p1과 p2가 같아진다.
		System.out.println("알을 획득했습니다!");
	}else {
		System.out.println("......");
	}
	
	// ※ Object 클래스
	// JAVA에서 기본제공해주는 최상위 클래스 
	}

}
 

코드 에서 볼 수 있듯이 p1 , p2는 서로 다른 독립된 객체 이기 때문에 같니? 라고 물어볼 수 없다.

둘을 같게 만들어 줘야 할땐 일단 처음 우리는 모두 Object 라는 클래스 안에 상속되어 있다고 생각 할 수 있다 !

Object 안에 있는 두 객체 이므로 object의 메서드를 우리가 원하는 조건으로 바꿔주는 오버라이딩을 사용하여

두 객체가 같다라고 다시 재정의 해준다 !


[ 실습문제 ]

실습 1) 점 클래스 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]를 비교해주세요!~~

}

실습 2) 색깔점 클래스 ColorPoint가 있습니다.

int x,int y,String color를 멤버변수로 가지고있습니다.

점색깔

x,y의 좌표가 같아도 색이 다르면 다른 점으로 인식할수있도록

main(){

ColorPoint[] data=new ColorPoint[3];

data[0]에는 파랑(10,20)

data[1]에는 파랑(10,20)

data[2]에는 빨강(10,20)

이 저장되어있습니다.

data[0]과 data[1],

data[0]과 data[2]를 비교해주세요!~~

}

package class01;

class Point {
	int x;
	int y; // 멤버변수

	Point(int x, int y) {
		this.x = x; // 생성자에서 초기화
		this.y = y;
	}

	@Override // 오버라이딩
	public boolean equals(Object obj) {

		Point p = (Point) obj; // 다운캐스팅 Point 타입으로 변환

		if (this.x == p.x) { // 인덱스 0번과 같으면 정답이야
			if (this.y == p.y) { // x,y가 모두 같다면 
				return true;
			}
		}
		return false;
	}

}

class ColorPoint extends Point { //자식클래스 Color Point
	String color;

	ColorPoint(String color) {
		// this로 끌어다 쓸때에는 3가지 인자 다쓸것. 다 초기화 시켜줘야함
		this(0,0,color); //인자가 가장 많은것들을 써놓고 나머지가 this()를 쓴다. 
	}

	ColorPoint(int x, int y) {
		this(x,y,"검정"); // x,y 만 받았지만 this()로 묶기위해 초기화로 검정이라 기입했다.
	}

	ColorPoint(int x, int y, String color) {
		super(x, y); // 부모클래스에서 받아왔을때 super로 써준다
		this.color = color; // 초기화 안한 인자 초기화
	}

	@Override
	public boolean equals(Object obj) {

		ColorPoint cp = (ColorPoint) obj; // 다운캐스팅 obj를 
									// ColorPoint타입으로 바꾸기

		if (this.color.equals(cp.color)) { // 색깔이 서로 같니 ?
			return true; // 지금 내 컬러가 cp의 컬러와 같니 
		}
		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);

			if (data[0].equals(data[1])) { // 인덱스 0 과 인덱스 1 이 같니?
				System.out.println("o"); // 같으면 o
			} else {
				System.out.println("x"); // 다르면 x
			}
			if (data[0].equals(data[2])) {// 인덱스0 과 인덱스2 가 같니?
				System.out.println("o");
			} else {
				System.out.println("x");
			}

			ColorPoint[] datas = new ColorPoint[3];
			datas[0] = new ColorPoint(10, 20, "파랑");
			datas[1] = new ColorPoint(10, 20, "파랑");
			datas[2] = new ColorPoint(10, 20, "빨강");

			if (datas[0].equals(datas[1])) { // 인덱스 0 과 인덱스 1 이 같니?
				System.out.println("o"); // 같으면 o
			} else {
				System.out.println("x"); // 다르면 x
			}
			if (datas[0].equals(datas[2])) {// 인덱스0 과 인덱스2 가 같니?
				System.out.println("o");
			} else {
				System.out.println("x");
			}
		}
	}
 
 

 

 

728x90
반응형