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
반응형