상속을 이용해서 코드 작성해보기

김소희·2023년 2월 27일
1

배운 내용을 바탕으로 실습을 하는데 꽤 애먹었다.
이론 공부를 잘 했어도 코드를 작성하는 동안 많은 에러를 만났다.

결과값에 인스턴스 주소값이 나오는 경우가 여러번 있었는데
super.getCar().getName()처럼 인스턴스변수를 사용하거나,
Static변수를 사용하거나, 메인클래스에서 변수를 지정해주는 방법의 차이점에 대해 생각해볼 수 있는 기회가 되었다.

public class Main {
    public static void main(String[] args) {

        Person chan = new Person();
        chan.name = "찬욱";
        chan.eat();
        System.out.println(chan.name);


        Address home = new Address("Seoul","Korea");
        Programmer me = new Programmer("소희","오늘의집",home);
        me.age = 28;
        me.cord();
        me.eat();
        me.walk();

        Programmer uk = new Programmer("찬욱이","카카오",home);
        uk.age =32;
        uk.walk();
        uk.cord();
    }
}


class Person {
    String name;
    int age;
    void eat(){
        System.out.println(name+" 밥먹기");
    }
}



class Programmer extends Person{
    String company;
    Address address;

    public Programmer(String name,String company,Address address){
        this.name = name;
        this.company=company;
        this.address=address;
    }

    void walk(){
        System.out.println(name+" "+company+" 일하기");
    }

    void cord(){
        System.out.print(name+" ");
        System.out.print(age+" ");
        System.out.print(company+" ");
        System.out.println(address.city);
    }
}


class Address{
    String city, state;
    public Address(String city, String state) {
        this.city = city;
        this.state = state;
    }
}


결과값
찬욱 밥먹기
찬욱
소희 28 오늘의집 Seoul
소희 밥먹기
소희 오늘의집 일하기
찬욱이 카카오 일하기
찬욱이 32 카카오 Seoul
public class Main {
    public static void main(String[] args) {
        System.out.println("❤️ 취준생 소희의 하루 ❤️");
        Car porsche = new Car("포르쉐",0);
        Person sohee = new Person("소희",porsche);

        sohee.introduce();
        sohee.eat();
        sohee.drive();
        sohee.sleep();

        Car benz = new Car("벤츠",100);
        Programmer heena = new Programmer("희나",benz,"오늘의집",true);

        System.out.println("❤️ 회사원 소희의 하루 ❤️");
        heena.introduce();
        heena.commute();
        heena.work();
        heena.eat();
        heena.sleep();

    }
}



public class Person {
    String name;
    Car car;

    public Person(String name, Car car) {
        this.name = name;
        this.car = car;
    }

    public String getName() {
        return name;
    }

    public Car getCar() {
        return car;
    }
    public void sleep() {
        System.out.printf("%s가 잠을 잡니다.\n", name);
        System.out.println("쿨쿨 zzZ");
    }

    public void eat() {
        System.out.printf("%s가 밥을 먹습니다.\n", name);
        System.out.println("오이시~");
    }

    public void drive() {
        car.operate();
    }

    public void introduce() {
        System.out.printf("안녕하세요, 저는 %s 입니다.\n", name);
    }

}

public class Car {
    String name;
    int oil;

    public Car(String name, int oil){
        this.name = name;
        this.oil = oil;
    }

    public String getName() {  //getter
        return name;
    }

    public int getOil() {   //getter
        return oil;
    }

    public void setOil(int oil){  //setter
        this.oil=oil;
    }


    private void on() {  //프라이빗
        System.out.println(name+"에 시동을 겁니다.");
    }
    private void go() {
        System.out.println("부릉부릉");
    }
    private void off() {
        System.out.println(name+"에 시동을 끕니다.");
    }
    public void operate() {  //프라이빗 메소드를 모은 퍼블릭
        if (getOil() <= 0) {
            System.out.println("연료가 부족하여 시동을 걸 수 없습니다.");
        }
        else {
            on();
            go();
            off();
        }
    }

}

public class Programmer extends Person{
    private String company;
    private boolean busy;

    public Programmer(String name, Car car, String company,boolean busy){
        super(name,car);
        this.company = company;
        this.busy = busy;
    }

    public void work() {
        System.out.println("근무를 시작합니다");
        System.out.println("타닥..타닥..탁..타닥!!");
        System.out.println("이게 왜 안되지?");
        System.out.println("타닥..타닥..탁..타닥!!");
        System.out.println("이게 왜 되지?");
        System.out.println();
    }

    public void commute() {
        System.out.printf("%s를 타고 %s로 출근합니다.\n", super.getCar().getName(), company);
        super.drive();
        System.out.printf("%s에 도착했습니다.\n", company);
        System.out.println();
    }

    public void eat() {
        if(busy) System.out.println("허겁지겁 후루룩");
        else super.eat();
        System.out.println();
    }

    public void sleep() {
        if(busy) System.out.println("잠을 잘 수 없습니다.");
        else super.sleep();
        System.out.println();
    }

    public void introduce() {
        System.out.printf(
                "%s에서 일하고 있으며, %s",
                company,
                busy ? "오늘은 야근을 합니다.\n" : "오늘은 칼퇴합니다.\n"
        );
        System.out.println();
    }

}

결과값
❤️ 취준생 소희의 하루 ❤️
안녕하세요, 저는 소희 입니다.
소희가 밥을 먹습니다.
오이시~
연료가 부족하여 시동을 걸 수 없습니다.
소희가 잠을 잡니다.
쿨쿨 zzZ
❤️ 회사원 소희의 하루 ❤️
오늘의집에서 일하고 있으며, 오늘은 야근을 합니다.

벤츠를 타고 오늘의집로 출근합니다.
벤츠에 시동을 겁니다.
부릉부릉
벤츠에 시동을 끕니다.
오늘의집에 도착했습니다.

근무를 시작합니다
타닥..타닥....타닥!!
이게 왜 안되지?
타닥..타닥....타닥!!
이게 왜 되지?

허겁지겁 후루룩

잠을 잘 수 없습니다.

만약 상속관계의 두 클래스 중에서 상위클래스에 수정을 했을 때, 하위 클래스에서도 고쳐주어야 하는 것이 있다면 이는 캡슐화를 위반했다고 볼 수 있다.
Car 클래스에 있는 메소드들을 감추고 접근제어자로 접근을 막는 것은 캡슐화를 잘 한 것이다.
그로인해 Car클래스의 자율성은 높아지고 코드 응집도도 올라갔다.
(코드 응집도가 오른 이유는 Car클래스에서 쓰는 메소드들이 모여있기 때문이다.)
Person 클래스와의 결합도도 낮아졌다. (operate로 느슨한 결합만 있으니까)
객체지향 프로그래밍이 지향하는 변화와 확장에 유연한 코드를 작성하는 것을 생각하는 법을 배웠다.

profile
백엔드 개발자 소희의 모험

0개의 댓글