본문 바로가기
Programming Languages/Java

Chapter 17. 상속

by 더 이프 2023. 1. 13.
728x90

목차

    1. 상속

    ■ 상속이란?

    • 자식 클래스가 부모 클래스의 멤버를 물려받는 것
    • 부모 클래스를 재사용해 자식 클래스를  빠르게 개발 가능
    • extends는 자식 클래스가 상속할 부모 클래스를 지정하는 키워드
    • 자바는 단일 상속으로 하나의 부모 클래스를 상속받음

    ■ 장점

    • 반복된 코드 중복을 줄임
    • 유지 보수가 편리함
    • 객체 다형성 구현 가능

     

    2. 오버라이드(Override)

    ■ 오버라이드란?

    • 오버라이드는 재정의를 뜻하며 부모 클래스의 메소드를 자식 클래스에서 새롭게 정의하는 것을 뜻함
    • 재정의 시 부모 클래스의 주소를 끊고 새로운 주소로 정의함
    • 재정의 시 메소드의 선언부는 기존 메소드와 같아야 함
    • 재정의를 하지 않을 경우에는 부모 클래스를 참조함

     

    3. 예시

    ■ Car

    package j13_상속;
    
    public class Car {
    	private String company;
    	private String model;
    	private int price;
    
    	public Car() {
    		System.out.println("부모");
    	}
    
    	public String getCompany() {
    		return company;
    	}
    
    	public void setCompany(String company) {
    		this.company = company;
    	}
    
    	public String getModel() {
    		return model;
    	}
    
    	public void setModel(String model) {
    		this.model = model;
    	}
    
    	public int getPrice() {
    		return price;
    	}
    
    	public void setPrice(int price) {
    		this.price = price;
    	}
    
    	public int discountPrice(int percentage) {
    		return price - (price * percentage / 100);
    	}
    }

    ■ HyundaiCar

    package j13_상속;
    
    public class HyundaiCar extends Car {
    
    	private boolean premium;
    }

    ■ KiaCar

    package j13_상속;
    
    public class KiaCar extends Car {
    
    	public KiaCar() {
        	// super는 상위 객체를 의미함
            // 부모 클래스의 생성자를 출력함
            // 부모 클래스가 먼저 생성되어야 함
    		super(); 
    		System.out.println("자식");
    	}
    
    	// 정의하지 않으면 부모 클래스에 있는 걸 직접적으로 가져옴
    	@Override
    	public int discountPrice(int percentage) {
    		return super.discountPrice(percentage);
    	}
    }

    ■ ExtendsMain

    package j13_상속;
    
    public class ExtendsMain {
    
    	public static void main(String[] args) {
        
    		KiaCar kiaCar = new KiaCar();
    
    		kiaCar.setPrice(30000000);
    
    		System.out.println(kiaCar);
    
    		System.out.println(kiaCar.getPrice());
    		System.out.println(kiaCar.discountPrice(20));
    	}
    }

    ■ View

    package j13_상속.casting;
    
    public class View {
    
    	public void show() {
    	}
    
    	public boolean menu(String select) {
    		return false;
    	}
    }

    ■ MainView

    package j13_상속.casting;
    
    public class MainView extends View {
    
    	@Override
    	public void show() {
    		System.out.println("[메인메뉴]");
    		System.out.println("1. [메인] 메뉴 1번");
    		System.out.println("2. [메인] 메뉴 2번");
    		System.out.println("3. 수정 메뉴 이동");
    		System.out.println("exit. 영역 종료");
    		System.out.println("======================");
    	}
    
    	@Override
    	public boolean menu(String select) {
    
    		if (select.equals("exit")) {
    			System.out.println("해당 영역 종료");
    			return false;
    		}
    
    		if (select.equals("1")) {
    			System.out.println("[메인] 메뉴에서 1번 선택");
    		} else if (select.equals("2")) {
    			System.out.println("[메인] 메뉴에서 2번 선택");
    		} else if (select.equals("3")) {
    
    			Controller updateController = new Controller(new UpdateView());
    			updateController.run();
    
    		} else {
    			System.out.println("다시 입력하세요.");
    		}
    
    		return true;
    	}
    }

    ■ UpdateView

    package j13_상속.casting;
    
    public class UpdateView extends View {
    
    	@Override
    	public void show() {
    		System.out.println("[수정메뉴]");
    		System.out.println("1. [수정] 메뉴 1번");
    		System.out.println("2. [수정] 메뉴 2번");
    		System.out.println("exit. 영역 종료");
    		System.out.println("======================");
    	}
    
    	@Override
    	public boolean menu(String select) {
    
    		if (select.equals("exit")) {
    			System.out.println("해당 영역 종료");
    			return false;
    		}
    
    		if (select.equals("1")) {
    			System.out.println("[수정] 메뉴에서 1번 선택");
    		} else if (select.equals("2")) {
    			System.out.println("[수정] 메뉴에서 2번 선택");
    		} else {
    			System.out.println("다시 입력하세요.");
    		}
    
    		return true;
    	}
    }

    ■ Controller

    package j13_상속.casting;
    
    import java.util.Scanner;
    
    public class Controller {
    
    	private View view;
    	private Scanner scanner;
    
    	public Controller(View view) {
    		this.view = view;
    		scanner = new Scanner(System.in);
    	}
    
    	public void run() {
    		boolean flag = true;
    		String select = null;
    
    		while (flag) {
    			view.show();
    			System.out.print("명령 입력 : ");
    			select = scanner.nextLine();
    			flag = view.menu(select);
    			System.out.println();
    		}
    	}
    }

    ■ Main

    package j13_상속.casting;
    
    public class Main {
    
    	public static void main(String[] args) {
    
    		Controller controller = new Controller(new MainView());
    		controller.run();
    
    		System.out.println("프로그램 종료");
    	}
    }