휴먼교육센터 개발자과정 42일차

조하영·2022년 10월 4일
0

상속

1.슈퍼클래스, 서브클래스

서브클래스는 슈퍼클래스의 기능을 확장한다. 비슷한 의미로 서브클래스는 슈퍼클래스의 자원을 사용가능하다.

2. this: 자신의 객체의 주소

super: 슈퍼클래스 객체의 주소

3. 클래스의 계층화

부모와 자식의 관계를 클래스로 표현한다

부모는 하나
자식은 여러개 가능(남자와 여자로 세분화 한다면 남자와 여자 클래스를 따로 만든다.)
이때 자식 클래스는 여러개 만들필요가 없다, 자식은 공통된 속성과 메서드를 갖고 저장된 값만 다를 수도 있다.

조부모도 있을수 있다.

상속으로 클래스를 계층화 시킬 수 있다(많이 사용하는 이유)

실습1.

메인 클래스

package extends_ex1;

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {
        ArrayList<Child_M> cmList = new ArrayList<>();
        ArrayList<Child_W> cwList = new ArrayList<>();


        // 남자2, 여자 2명을 만든다
        Child_M cm1 = new Child_M();
        cm1.setName("David");
        cm1.setAge(39);
        cmList.add(cm1);

        Child_M cm2 = new Child_M();
        cm2.setName("Jhon");
        cm2.setAge(23);
        cmList.add(cm2);

        Child_W cw1 = new Child_W();
        cw1.setName("Elsa");
        cw1.setAge(26);
        cwList.add(cw1);

        Child_W cw2 = new Child_W();
        cw2.setName("Maria");
        cw2.setAge(36);
        cwList.add(cw2);

        for(int i =0; i < cmList.size(); i++) {
            System.out.println(cmList.get(i).getName());
            System.out.println(cmList.get(i).getAge());
        }

        for(int i =0; i < cwList.size(); i++) {
            System.out.println(cwList.get(i).getName());
            System.out.println(cwList.get(i).getAge());
        }
    }
}

남자아이 클래스

package extends_ex1;

public class Child_M extends Parent {

    public void eatting() {
        System.out.println("고기고기");
    }
}

여자 아이 클래스

package extends_ex1;

public class Child_W extends Parent{

    public void eatting() {
        System.out.println("다이어트 음식");
    }

}

부모 클래스

package extends_ex1;

public class Parent {
    String name;
    int age;
    String regNumber;
    int kg;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getRegNumber() {
        return regNumber;
    }
    public void setRegNumber(String regNumber) {
        this.regNumber = regNumber;
    }
    public int getKg() {
        return kg;
    }
    public void setKg(int kg) {
        this.kg = kg;
    }

}

실습2

삼송 핸드폰과 아이쿠 핸드폰이 있다
삼송 핸드폰은 모델명, 수량, 가격을 저장하고 전화걸기 전화받기 기능이 있다
아이쿠 핸드폰은 모델명, 수량, 가격을 저장하고 전화걸기 전화받기 차단 번호관리 기능이 있다.

메인 클래스

package extends_test;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SamsongPhone sm1 = new SamsongPhone();
        sm1.setName("겔럭시 S22");
        sm1.setCnt(23);
        sm1.setPrice(120);
        System.out.println(sm1.getName());
        System.out.println("재고 "+ sm1.getCnt()+"개");
        System.out.println("가격 "+sm1.getPrice()+"원");
        sm1.call();

        SamsongPhone sm2 = new SamsongPhone();
        sm2.setName("겔럭시 폴드2");
        sm2.setCnt(40);
        sm2.setPrice(150);
        sm2.answer();

        IcooPhone ic1= new IcooPhone();
        ic1.setName("아이쿠 13");
        ic1.setCnt(44);
        ic1.setPrice(135);
        ic1.block();

        IcooPhone ic2= new IcooPhone();
        ic2.setName("아이쿠 14");
        ic2.setCnt(54);
        ic2.setPrice(176);
        ic2.call();		

    }
}

폰클래스

package extends_test;

public class Phone {
    private String name;
    private int cnt;
    private int price;

    public void call() {
        System.out.println("뚜루루루루");
    }

    public void answer() {
        System.out.println("여보세요");

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getCnt() {
        return cnt;
    }

    public void setCnt(int cnt) {
        this.cnt = cnt;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

}

삼송폰 클래스

package extends_test;

public class SamsongPhone extends Phone {

}

아이쿠폰 클래스

package extends_test;

public class IcooPhone extends Phone {

    public void block() {
        System.out.println("차단 번호");
    }

}

실제 사용할때 계층화를 위해 상속을 할 수도 있지만 클래스의 특정 기능을 쓰기 위해서 상속 할수도있다.

질문
클래스를 참조해서 기능을 사용하는 것과 상속을해서 사용하는 것과 차이?
예를 들어 캔버스 클래스를 상속받아 사용하는것과 객체를 생성하고 참조해서 사용하는것의 차이.


결과적으로는 동일하다.
구조적으로 어떤 것을 사용할지를 결정하는 것.
이는 개발자 사이에서도 토론의 주제이기도 하다
참조해서 사용할 수 있는 것을 상속을 받아 사용할 필요가 있느냐?
이는 클래스는 대등하게 보는 is a의 관계 , 클래스를 계층으로 보는 has a의 관계에 따라 다르다.
pojo를 검색해 볼 것.

계층화 시키는 팁-내가 계층화 할 것인가? 새로운 계층을 설계할 것인가?의 관점에서
프로그램에서 표현하고자 하는 클래스를 먼저 생각
클래스를 구성하는 기분을 구체적이면서 실제표현 가능한 것으로 판별

4. 추상 메서드: 선언만 한 메서드. 구현을 하지 않았다.

추상 클래스: 추상 메서드가 1개 이상이면 추상 클래스로 선언해야 한다.

추상클래스는 객체로 만들 수 없다.
(객체는 실제 사용하려는 목적이기 때문에 메서드가 정확하게 기능이 구현되지 않았으니 객체가 되면 안된다.)

팁: 공통된 전역변수와 메서드로 슈퍼클래스를 정의하고 구현했는데 서브클래스가 공통으로 메서드의 기능은 필요하지만
세부적인 구현이 다를 경우 슈퍼클래스가 구현하지 않고 서브 클래스에서 구현하는 것이 더 적당하다.
이때 추상클래스와 추상 메서드를 사용.

그럼 굳이 왜 메서드 명만 있는 것을 추상 메서드를 만들어 상속을 하느냐?
->메서드명의 통일은 매우 중요하기 때문
만일 삼송폰과 아이쿠 폰에서 전화거는 기능의 메서드명이 다르다면
개발자는 두 클래스의 메서드명을 다 기억하고 있어야 한다.

5. 오버라이드(Override)

추상메서드는 상속받은 클래스에서 필수적으로 재정의 해야 한다.
이를 오버라이드라고 한다.
추상메서드가 아닌 경우도 오버라이드가 가능하지만 차이점은 필수냐 선택이냐이다.
이를 사용해서 개발자의 메서드를 통일 시킬 수 있다.

오버라이딩: 메서드를 재정의 하는것

6. 다형성 -객체 지향 언어의 특징

다형성은 하나의 변수로 다른 자료형의 데이터 값을 가질 수 있다.
상속으로 계층화된 구조에서 다형성을 이용하면 코드가 더 단순해진다.

예)

HP_super hp;

ArrayList<HP_super> pList = new ArrayList<>();

hp = new Sam();
hp.modelName="k9";
pList.add(hp);

hp = new Aii();
hp.modelName="i12";
pList.add(hp);

질문
다형성을 사용해서 하나의 리스트로 관리하면 특정 객체만 출력하고 싶을때 어떻게 하는지?


자료형을 비교하는 메서드 instanceof를 사용하면 한 리스트에서 특정 자료형만 출력도 가능하다.

오후 실습

상속과 추상화, 다형성을 사용하여 주차관리 프로그램을 만들기

메인 클래스

package parking;

public class Main {

    public static void main(String[] args) {
        System.out.println("주차관리 프로그램 시작 ");
        new ParkingManager();
        System.out.println("프로그램 종료 ");

    }

}

주차관리 클래스

package parking;

import java.util.ArrayList;
import java.util.Scanner;

public class ParkingManager {
    CarInfo car;
    Scanner in = new Scanner(System.in);
    ArrayList<CarInfo> cList = new ArrayList<>();

    ParkingManager() {

        for (;;) {
            System.out.println("--------------" );
            System.out.println("1. 자동차등록");
            System.out.println("2. 주차요금전체보기");
            System.out.println("3. 자동차조회");
            System.out.println("4. 프로그램종료");
            System.out.println("메뉴를 선택해주세요");

            String selMenu = in.nextLine();
            if (selMenu.equals("1")) {
                for (;;) {
                    System.out.println("--------------" );
                    System.out.println("1. 경차");
                    System.out.println("2. 소형차");
                    System.out.println("3. 대형차");
                    System.out.println("4. 이전메뉴");
                    System.out.println("메뉴를 선택해주세요");

                    String selMenu2 = in.nextLine();
                    if (selMenu2.equals("1")) {
                        car = new S_car();
                        car.setPrice(20000, 700);
                        addCar();
                    } else if (selMenu2.equals("2")) {
                        car = new M_car();
                        car.setPrice(40000, 1500);
                        addCar();
                    } else if (selMenu2.equals("3")) {
                        car = new L_car();
                        car.setPrice(70000, 2500);
                        addCar();
                    } else if (selMenu2.equals("4")) {
                        break;
                    } else {
                        System.out.println("잘못된 입력입니다.");
                    }
                }

            } else if (selMenu.equals("2")) {
                parkPrice();
            } else if (selMenu.equals("3")) {
                searchCar();
            } else if (selMenu.equals("4")) {
                break;
            } else {
                System.out.println("잘못된 입력입니다.");
            }
        }
    }

    private void searchCar() {
        System.out.println("--------------" );
        System.out.println("조회할 차량번호를 입력하세요.");
        String carNum = in.nextLine();
        boolean flag = true;
        for (CarInfo c : cList) {
            if (c.carNum.equals(carNum)) {
                c.prt();
                flag = false;
            }
        }
        if (flag) {
            System.out.println("차량번호 " + carNum + "이 없습니다.");
        }
    }

    private void parkPrice() {
        for (CarInfo c : cList) {
            System.out.println("--------------" );
            System.out.println("차량번호: " + c.getCarNum());
            System.out.println("주차요금 " );
            c.p_prt();
        }
    }

    private void addCar() {
        System.out.println("--------------" );
        System.out.println("차량이름을 입력하세요.");
        String name = in.nextLine();
        car.setName(name);
        System.out.println("차량번호를 입력하세요.");
        String carNum = in.nextLine();
        car.setCarNum(carNum);
        System.out.println("저공해여부(Y/N)");
        String clean = in.nextLine();
        clean = clean.toUpperCase();
        car.setClean(clean);
        car.discount();
        System.out.println("가족 구성원은 몇명인가요?");
        int family = in.nextInt();
        in.nextLine();
        car.setFamily(family);
        car.plusDis();
        System.out.println("등록일을 입력하세요.");
        System.out.println("예)20220901");
        String joinDate = in.nextLine();
        car.setJoinDate(joinDate);
        car.setpList();

        cList.add(car);
    }
}


자동차 정보 추상클래스

package parking;

import java.util.ArrayList;

public abstract class CarInfo {
    ArrayList<Integer> pList = new ArrayList<>();
    String name;
    String clean;
    String carNum;
    int price;
    int dPrice;
    int family;//가족구성원
    String joinDate;//등록일
    String today="20220930";//요금조회일


    public void setpList() {
        int j_month = Integer.parseInt(joinDate.substring(4, 6));
        int s_month = Integer.parseInt(today.substring(4, 6));
        int m_price = (s_month-j_month);
        int j_day = Integer.parseInt(joinDate.substring(6));
        int s_day = Integer.parseInt(today.substring(6));
        int d_price = (s_day-j_day-1);
        if(m_price==0) {
            pList.add(0,d_price*dPrice);
        }else if(m_price == 1){
            pList.add(0,(30-j_day-1)*dPrice);
        }else {
            pList.add(0,(30-j_day-1)*dPrice);
            for(int i =1; i<m_price; i++) {
                pList.add(price);
            }
        }
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price, int dPrice) {
        this.price = price;
        this.dPrice = dPrice;
    }

    public CarInfo() {

    }

    public abstract void plusDis();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCarNum() {
        return carNum;
    }
    public void setCarNum(String carNum) {
        this.carNum = carNum;
    }
    public String getClean() {
        return clean;
    }

    public void setClean(String clean) {
        this.clean = clean;
    }

    public String getJoinDate() {
        return joinDate;
    }

    public void setJoinDate(String joinDate) {
        this.joinDate = joinDate;
    }
    public int getFamily() {
        return family;
    }
    public void setFamily(int family) {
        this.family = family;
    }

    public void prt() {
        System.out.println("차량번호: "+ carNum);
        System.out.println("차량명: "+ name);
        System.out.println("저공해 여부: "+ clean);
        System.out.println("가족구성원: "+ family + "명");
        System.out.println("주차요금: ");
        p_prt();
        System.out.println("등록일: "+ joinDate);

    }

    public void discount() {
        if(clean.equals("Y")) {
            price = price/2;
            dPrice = dPrice/2;
        }
    }

    public void p_prt() {
        for(int i = 0; i<pList.size(); i++) {
            System.out.println(i+Integer.parseInt(joinDate.substring(4, 6)) + "월 요금: " + pList.get(i) + "원");
        }
    }

}

경차 클래스

package parking;

public class S_car extends CarInfo {

    @Override
    public void plusDis() {
        if(family>=3) {
            price = (int) (price*0.9);
            dPrice = (int) (dPrice * 0.9);
        }

    }
}

소형차 클래스

package parking;

public class M_car extends CarInfo {

    @Override
    public void plusDis() {
        if (family >= 4) {
            price = (int) (price * 0.9);
            dPrice = (int) (dPrice * 0.9);
        }

    }
}

대형차 클래스

package parking;

public class L_car extends CarInfo{
    @Override
    public void plusDis() {
        // TODO Auto-generated method stub

    }

}
profile
공부하는 개발자

0개의 댓글