공통되는 기능인 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) {
}
}
아직 구성안한 메인 클래스
추상메소드는 공통 자료형인 추상클래스가 가지고 있는 공통 서비스이다.
'Java 코드연습 > 추상 클래스. 메소드' 카테고리의 다른 글
[뉴렉처] 추상 클래스 만들기 추상화 (0) | 2021.10.31 |
---|---|
[뉴렉처] 코드 집중화와 추상화 (0) | 2021.10.31 |