Java 코드연습/추상 클래스. 메소드

[뉴렉처] 추상 메소드(Abstract Method) 구현하기

양상추상츄 2021. 10. 31. 15:28

공통되는 기능인 move()는 공통적으로 바로 사용 가능하지만

paint()의 경우엔 각각의 개체에서 재정의한 후 사용 가능하다.

 

추상메소드(뼈대)를 부모클래스에 올려놓고 자식클래스에서 오버라이드함(재정의)

 

total(), avg()는 구현으로는 자체가(안의 코드가) 공통은 아니지만 서비스(자료형)는 공통이다.

 

추상메소드를 선언하면 추상메소드를 가져다 쓰는 자식들은 반드시 추상메소드를 구현해야한다.

 


지금 모두 같은 패키지이름이지만 프로젝트는 다름

package Exam_1.추상화;

import java.util.Scanner;

public abstract class Exam_1 {

	public static void main(String[] args) {
		ExamConsole list = new ExamConsole();
		//ExamList.init();
		
		int menu;
		boolean keepLoop = true;
		
		while(keepLoop) {
			
			menu = inputMenu();
			
			switch(menu) {
			case 1:
				//ExamList.inputList(list);
				list.inputList();
				break;
			case 2:
				//ExamList.printList(list);
				list.printList();
				break;
			case 3:
				System.out.println("bye~");
				
				keepLoop = false;
				break;
			default:
				System.out.println("잘못된 값을 입력하셨습니다.");
			}
		}
	}

	private static int inputMenu() {
		Scanner scan = new Scanner(System.in);
		int num;
		
		System.out.println("--------------------");
		System.out.println("메인메뉴");
		System.out.println("메뉴를 선택해주세요");
		System.out.println("\t1. 성적입력");
		System.out.println("\t2. 성적출력");
		System.out.println("\t3. 나가기");
		System.out.print("\t>>>");
		
		num = scan.nextInt();
		if(num<1||3<num) {
			System.out.println("1~3의 숫자만 입력해주세요");
		}
		return num;
	}

}

추상클래스 설정한 코드


package Exam_1.추상화;

public abstract class Exam {
	private int kor;
	private int eng;
	private int math;
	
	public Exam() {
		this(0, 0, 0);
	}
	
	public Exam(int kor, int eng, int math) { 
		// 다른 생성자가 있으면 자동적으로 기본생성자가 생성이 안되기 때문에 
		// 따로 기본생성자를 생성해줘야함
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}

	public int getKor() {
		return kor;
	}

	public int getEng() {
		return eng;
	}

	public int getMath() {
		return math;
	}
	
	public void setKor(int kor) {
		this.kor = kor;		
	}

	public void setEng(int eng) {
		this.eng = eng;
		
	}

	public void setMath(int math) {
		this.math = math;
		
	}

	public abstract int total(); //{
		//return kor + eng + math; // this 생략
	//} //자식에게 구현할 것을 강요
	
	protected int onTotal() {
		return kor + eng + math;
	}// 자식에게만 보여지는 protected

	public abstract float avg(); //{
		//return total() / 3.0f; // this 생략
	//} //자식에게 구현할 것을 강요

	
}

추상메소드 설정한 코드

 

여기까지 같은 프로젝트



여기부터 다른 프로젝트

package Exam_1.추상화;

public class NewlecExam extends Exam{
	private int com; // 새로추가할 com
	
	public NewlecExam() {
		this(0,0,0,0);
	}
	
	public NewlecExam(int kor, int eng, int math, int com) {
		super(kor, eng, math); //부모클래스의 자료 가져옴
		this.com = com;
	}
	
	public int getCom() {
		return com;
	}

	public void setCom(int com) {
		this.com = com;
	}

	@Override
	public int total() { // Protected를 통해 부모클래스에서 kor + eng + math 를 받아옴
		int total = onTotal() + com;
		return total;
	}
	
	@Override
	public float avg() {
		return total()/4.0f;
	}
}

Protected는 자식클래스에서만 보임

@Override는 추상메소드를 재정의함


package Exam_1.추상화;

public class Program {

	public static void main(String[] args) {
		

	}

}

아직 구성안한 메인 클래스


추상메소드는 공통 자료형인 추상클래스가 가지고 있는 공통 서비스이다.