상속의 목적

황상익·2023년 12월 15일

열혈 자바

목록 보기
13/30

상속이 도움이 될 때
연관된 일련의 클래스들에 대해 공통적 규약을 정의 할 수 있다.

class UnivFriend{
    private String name;
    private String major;
    private String phone;

    public UnivFriend(String name, String major, String phone) {
        this.name = name;
        this.major = major;
        this.phone = phone;
    }

    public void showInfo(){
        System.out.println("name = " + name);
        System.out.println("major = " + major);
        System.out.println("phone = " + phone);
    }
}

class ComFriend{
    private String name;
    private String department;
    private String phone;

    public ComFriend(String name, String department, String phone) {
        this.name = name;
        this.department = department;
        this.phone = phone;
    }

    public void showInfo(){
        System.out.println("name = " + name);
        System.out.println("department = " + department);
        System.out.println("phone = " + phone);
    }
}


public class MyFriends {
    public static void main(String[] args) {
        UnivFriend[] friend = new UnivFriend[5];
        int unct = 0;

        ComFriend[] friends = new ComFriend[5];
        int fcnt = 0;

        friend[unct++] = new UnivFriend("Lee", "Computer" , "010-1234-5678");
        friend[unct++] = new UnivFriend("kim", "bio" , "010-568-5678");

        friends[fcnt++] = new ComFriend("Hwang", "Computer", "01012345678");
        friends[fcnt++] = new ComFriend("lee", "Korean", "01012345678");

        for (int i = 0; i < unct; i++) {
            friend[i].showInfo();
            System.out.println();
        }

        for (int i = 0; i < fcnt; i++) {
            friends[i].showInfo();
            System.out.println();
        }
    }
}

인스턴스를 저장하는 배열이 2개
대학 동창의 정보를 저장하는 과정, 직장 동료의 정보를 저장
 저장에 필요한 배열과 변수가 다르기 때문
저장된 정보를 모두 출력할 때, 두개 for문을 작성
 배열과 변수가 다르기 때문
Main 메소드의 핵삼은 -> 배열이 2개 이므로, 무엇을 하던 그 과정이 둘로 나뉜다.
이를 상속으로 해결할 수 있다.

하나의 배열에 데이터를 저장, 하나의 메소드 또는 하나의 반복문으로 데이터의 삭제 및 검색이 가능

public class MyFriend2 {
    public static void main(String[] args) {
        Friend[] friend2 = new Friend[10];
        int cnt = 0;

        friend2[cnt++] = new Unifriend1("Hwang", "123456789", "bio");
        friend2[cnt++] = new Unifriend1("Seo", "123456789", "Korean");
        friend2[cnt++] = new ComFriend1("Seo", "123456789", "Korean");
        friend2[cnt++] = new ComFriend1("Seo", "123456789", "Korean");

        for (int i = 0; i < cnt; i++) {
            friend2[i].showInfo();
            System.out.println();
        }
    }
}

class Friend{
    protected String name;
    protected String phone;

    public Friend(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }

    public void showInfo(){
        System.out.println("name = " + name);
        System.out.println("phone = " + phone);
    }
}

class Unifriend1 extends Friend{
    private String major;

    public Unifriend1(String name, String phone, String major) {
        super(name, phone);
        this.major = major;
    }

    public void showInfo(){
        super.showInfo();
        System.out.println("major = " + major);
    }
}

class ComFriend1 extends  Friend{
    private String department;

    public ComFriend1(String name, String phone, String department) {
        super(name, phone);
        this.department = department;
    }

    @Override
    public void showInfo() {
        super.showInfo();
        System.out.println("department = " + department);
    }
}

UniFriend와 CompFriend를 Friend가 상속하게 함
 인스턴스를 저장하는 배열이 하나.
Friend 클래스를 상속하는 클래스가 더 추가되어도 변함없음
 정보를 저장하는 과정이 나뉘지 X
하나의 배열에 모든 인스턴스를 저장할 수 있다.
 저장된 정보를 모두 출력할 때 하나의 for문으로 충분
하나의 배열이 사용, 또 메소드 오버라이딩이 도움

Object 클래스와 final 선언 그리고 @Override
모든 클래스는 Object 클래스를 상속
모든 클래스는 Object 클래스에 모두 묶여있다.
자바의 모든 클래스는 Object 클래스를 직간접적으로 상속
모든 인스턴스는 위 메소드 인자가 될 수 있다. 메소드는 인자로 전달된 인스턴스의 다음 메소드를 호출. 이 메소드는 Object 클래스에 정의 되어 있는 메소드 이므로, 모든 인스턴스를 대상으로 호출이 가능.

public class Main1 {
    public static void main(String[] args) {
        Cake c1 = new Cake();
        Cake c2 = new CheeseCake();

        System.out.println(c1);
        System.out.println();

        System.out.println(c2);
        System.out.println();
    }
}

class Cake {
    public String toString(){
        System.out.println(super.toString());
        return "My birthday";
    }
}

class CheeseCake extends Cake{
    public String toString(){
        return "My birthday cheese cake";
    }
}

Object 클래스의 toString 메소드를 호출하여 문자열로 출력
클래스의 이름과 @의 뒤를 이어 이해할 수 없는 숫자 출력 -> 클래스를 정의할 때 toString 메소드를 가급적 오버라이딩 하라고 조언.

클래스와 메소드의 final 선언
해당 클래스를 다른 클래스가 상속하는 것을 원치 않는다면, final 사용.

@Override

public class Main2 {
    public static void main(String[] args) {
        ParentAdder adder = new ChildAdder();
        System.out.println(adder.add(3,4));
    }
}

class ParentAdder {
    public int add(int a, int b) {
        return a + b;
    }
}

class ChildAdder extends ParentAdder {
    public int add(double a, double b) {
        return (int) (a + b);
    }
}

잘못된 부분은 -> 매개변수와 반환형이 달랐기 때문. 이 상황을 방지하기 위함 = @Override를 사용.

profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글