상속에 대하여

ghltjd369·2023년 2월 23일
0
class 고양이 {
    void 숨쉬다() { }
    void 야옹() { }
    void 뛰어넘다() { }
}

class 검은고양이 extends 고양이 {
    void 미래를_예지하다() { }
}

class 흰고양이 extends 고양이 {
    void 목숨을_늘린다() { }
}

class 점박이고양이 extends 고양이 {
    void 춤춘다() { }
}

흰고양이 a = new 흰고양이();
a.숨쉬다();
a.야옹();
a.미래를_예지하다();

검은고양이 b = new 검은고양이();
b.숨쉬다();
b.야옹();
b.목숨을_늘린다();

점박이고양이 c = new 점박이고양이();
c.숨쉬다();
c.야옹();

extends를 is로 읽어주면 이해하기 편하다.

  • class 흰고양이 extends 고양이 => 흰고양이 is 고양이(O)
  • class 고양이 extends 흰고양이 => 고양이 is 흰고양이(X)

객체를 만드는 것은 리모컨을 만드는 것

  • 흰고양이 a = new 흰고양이(); => 흰고양이 리모컨 생성

이런식으로 리모컨을 생성하는 것도 가능하다.

부모 부 = new 부모(); //  가능
부모 부 = new 자손(); //  가능
자손 자 = new 부모(); //  불가능

두 번째에 있는
부모 부 = new 자손(); 의 경우 부모가 가진 기능들은 자손이 모두 사용가능하지만 (오버라이딩 했을 경우 자손에 적힌 기능으로 사용됨.) 부모는 가지지 못하고 자식만 가진 고유의 기능은 사용할 수 없다.

많이 헷갈렸던 부분

double a = 5.0;
int b = a;

이 코드는 왜 오류가 날까?
데이터를 버리면서 손실이 발생하기 때문에 오류가 나는 것이라고 생각했다.
근데 5.5를 5로 바꾸는 것은 손실이 발생하지만 5.0을 5로 바꾸는 것은 손실이 없지 않나??

이에 대한 대답
자바 컴파일러는 바보라서 a가 5.0인지 5.5인지 모른다.
거기까지는 생각 안하고 그냥 실수를 정수로 바꿀 때 손실이 생길 수도 있고 안생길 수도 있고 그런 불안함이 있으니까 아예 못하게 해버리는 것.
반면에 정수를 실수로 바꾸는 것은 이러나 저러나 가능하니까 오케이.
따라서 double을 int로 바꾸려면

double a = 5.0;
int b = (int) a;

이런 식으로 수동 형변환을 해주어야 함.

이를 활용하여

//자동차는 페라리의 부모
자동차 a자동차 = new 페라리();
페라리 a페라리 = a자동차;

왜 안될까??
위에서 설명한 이유와 마찬가지이다.
현재 자동차에는 페라리 리모컨이 설정되어 있다.
근데 자바는 뭐라고?
굉장히 바보다.
지금 a자동차의 객체가 페라리인지 스파크인지 모른다.
그러니까 페라리 리모컨으로 a자동차를 조종할 수 있을지 없을지 모른다는 것.
이런 불안함이 있으니까 아예 못하게 막아버린 것이다.

자동차 a자동차 = new 페라리();
페라리 a페라리 = (페라리) a자동차;

이런 식으로 수동 형변환을 해주어야 한다.

당연한 이야기지만

자동차 a자동차 = new 스파크();
페라리 a페라리 = (페라리) a자동차;

는 불가능! 페라리랑 스파크랑은 관련이 없으므로 페라리 리모컨으로 스파크를 조종할 수는 없다.

마찬가지로

자동차 a자동차 = new 자동차();
페라리 a페라리 = (페라리) a자동차;

도 불가능하다. 위와 같은 이유로 페라리 리모컨으로 자동차를 조종할 수는 없으니까..

부모 부 = new 부모(); //  가능
부모 부 = new 자손(); //  가능
자손 자 = new 부모(); //  불가능

이걸 생각하면 쉬움!!!

0개의 댓글