자바의 상속

임유빈·2023년 10월 23일

개발자

목록 보기
8/26

상속문을 쓰기 전에는 항상 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 무기 {
        
}

classextends 무기{
     void 공격(){
         System.out.println("칼로 공격합니다.");
     }
} 

칼의 버튼이 없어서 공격이 안됨, 따라서

abstract class 무기 {
        abstract void 공격(); //리모콘 버튼용
}

classextends 무기{
     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가지를 작성한 모습

profile
주변 사람들과의 소통을 적극적으로 하는 친근한 개발자가 되기를 희망합니다.

0개의 댓글