상속문을 쓰기 전에는 항상 a extends b -> a is b이 성립하는지 확인
ex) 사자 extends 동물 // 사자는 동물이다. ( o )
사자 extends 사람 // 사자는 사람이다. ( x )
public class Main {
public static void main(String[] args) {
System.out.println("== 흰 고양이 ==");
흰고양이 a = new 흰고양이();
a.숨쉬다();
a.야옹();
a.목숨을_늘린다();
System.out.println("== 검은 고양이 ==");
검은고양이 b = new 검은고양이();
b.숨쉬다();
b.야옹();
b.미래를_예지하다();
System.out.println("== 붉은 고양이 ==");
붉은고양이 c = new 붉은고양이();
c.숨쉬다();
c.야옹();
c.빠르게_이동();
}
}
class 검은고양이 {
void 숨쉬다() {
System.out.println("숨쉬다!!");
}
void 야옹() {
System.out.println("야옹");
}
void 뛰어넘다() {
System.out.println("뛰어넘다");
}
void 미래를_예지하다() {
System.out.println("미래를_예지하다");
}
}
class 흰고양이 {
void 숨쉬다() {
System.out.println("숨쉬다!!");
}
void 야옹() {
System.out.println("야옹");
}
void 뛰어넘다() {
System.out.println("뛰어넘다");
}
void 목숨을_늘린다() {
System.out.println("목숨을_늘린다");
}
}
class 붉은고양이 {
void 숨쉬다() {
System.out.println("숨쉬다!!");
}
void 야옹() {
System.out.println("야옹");
}
void 뛰어넘다() {
System.out.println("뛰어넘다");
}
void 빠르게_이동() {
System.out.println("빠르게_이동");
}
}
중복이 많은 코드를 확인할 수 있다.
public class Main {
public static void main(String[] args) {
System.out.println("== 흰 고양이 ==");
흰고양이 a = new 흰고양이();
a.숨쉬다();
a.야옹();
a.목숨을_늘린다();
System.out.println("== 검은 고양이 ==");
검은고양이 b = new 검은고양이();
b.숨쉬다();
b.야옹();
b.미래를_예지하다();
System.out.println("== 붉은 고양이 ==");
붉은고양이 c = new 붉은고양이();
c.숨쉬다();
c.야옹();
c.빠르게_이동();
}
}
class 고양이 {
void 숨쉬다() {
System.out.println("숨쉬다!!!");
}
void 야옹() {
System.out.println("야옹");
}
void 뛰어넘다() {
System.out.println("뛰어넘다");
}
}
class 검은고양이 extends 고양이 {
void 미래를_예지하다() {
System.out.println("미래를_예지하다");
}
}
class 흰고양이 extends 고양이 {
void 목숨을_늘린다() {
System.out.println("목숨을_늘린다");
}
}
class 붉은고양이 extends 고양이 {
void 빠르게_이동() {
System.out.println("빠르게_이동");
}
}
중복을 없앤 코드를 볼 수 있다. 검은고양이, 흰고양이, 붉은고양이가 고양이에 상속된 모습이다.
여러 클래스에 동일한 문장이 있는 경우 추후 코드를 변경 할 때 야옹이라는 문장에 !!를 붙힌다고 가정할 때 3번을 바꿔야 한다. 하지만 바꾼 코드처럼 중복이 없는 코드를 사용하면 한번만 바꾸면 된다.
무기 a무기 = new 칼(); // 칼 리모콘이 무기 리모콘으로 변환
ex ) double d = 5; // 5가 5.0으로 형변환 하는 것과 같음
public class Main {
public static void main(String[] args) {
double d1 = 5;
무기 a무기 = new 칼(); // 칼이 무기에 맞춰 형변환 시도
a무기.공격();
// 출력 : 칼로 공격합니다.
}
}
무기 리모콘의 버튼 갯수 : 0개
칼 리모콘의 버튼 갯수 : 1개
class 무기 {
}
class 칼 extends 무기{
void 공격(){
System.out.println("칼로 공격합니다.");
}
}
칼의 버튼이 없어서 공격이 안됨, 따라서
abstract class 무기 {
abstract void 공격(); //리모콘 버튼용
}
class 칼 extends 무기{
void 공격(){
System.out.println("칼로 공격합니다.");
}
}
abstract를 이용하여 버튼을 생성, 혹은
public class Main {
public static void main(String[] args) {
double d1 = 5;
칼 a무기 = new 칼(); // 칼이 무기에 맞춰 형변환 시도
a무기.공격();
// 출력 : 칼로 공격합니다.
}
}
Main함수의 "무기" -> "칼"로 변경
public class Main {
public static void main(String[] args) {
사람 a사람 = new 사람();
a무기.자기소개(10, "20", true);
// 출력 : 저는 홍길동입니다.
}
}
class 사람 {
void 자기소개(int a, String b, boolean c){
System.out.println("저는 홍길동입니다.");
}
}
a무기.자기소개에 3가지 타입에 따라 void 자기소개에서 3가지를 작성한 모습