본문 바로가기
JAVA/JAVA Note

[JAVA Note] 17. 추상화

by objade 2022. 11. 6.

 

1. 클래스 실습 - 학생 관리 프로그램 만들기

1) 추상클래스 Student

 

~ 필드

 : 이름, 과목(국어, 영어, 수학), 점수 총합, 평균

public abstract class Student {

	protected String name;
	protected int kor;		
	protected int eng;
	protected int mat;
	protected int sum;
	protected double avg;

protected같은 패키지를 포함하며, 다른 패키지라고 하더라도 상속관계에 있다면 접근을 허용함

 

 

~ 생성자

public Student(String name, int kor, int eng, int mat) {

	this.name = name;
	this.kor = kor;
	this.eng = eng;
	this.mat = mat;
}

 

~ 추상메서드

public abstract int getSum();
public abstract double getAvg();
public abstract void showInfo(); 	// 이름, 합계, 평균을 한 줄에 출력 (목록에서 사용)
public abstract void showDetail();	// 모든 속성값을 각 한 줄마다 출력 (검색에서 사용)


~ getter/setter

public String getName() {
	return name;
}

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

public int getKor() {
	return kor;
}

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

public int getEng() {
	return eng;
}

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

public int getMat() {
	return mat;
}

public void setMat(int mat) {
	this.mat = mat;
}

 

2) Student 클래스를 상속받는 EnglishLinguisticStudent(영어영문학과) 학생 클래스

 

~ 필드

private int literature;		// 문학(영문학)
private int translation;	// 번역

 

~ 생성자

 - Student 클래스를 상속받았기 때문에 name, kor, eng, mat가 포함되어있음

public EnglishLiguisticStudent(String name, int kor, int eng, 
				int mat, int literature, int translation) {
	
    super(name, kor, eng, mat);
	this.literature = literature;
	this.translation = translation;
		
	// 상속받아서 내가 가지고 있으니까, this로 접근 가능
	this.sum = kor + eng + mat + literature + translation;
		
	// 슈퍼클래스에서 만들어진 필드이니까 super로 접근 가능
	super.avg = this.sum / 5.0;
		
	}

 

~ 추상메서드

 - Student 클래스에서 상속받은 showInfo()showDetail()을 오버라이딩함

@Override
public void showInfo() {
	System.out.printf("[영어 영문학] 이름 : %s, 합계 : %d, 평균 : %.2f\n", name, sum, avg);
}

@Override
public void showDetail() {
	System.out.println("[영어 영문학] " + name);
	System.out.println("국어 : " + kor);
	System.out.println("영어 : " + eng);
	System.out.println("수학 : " + mat);	
	System.out.println("문학 : " + literature);
	System.out.println("번역 : " + translation);
	System.out.println("합계 : " + sum);
	System.out.printf("평균 : %.2f\n", avg);
	System.out.println();
}

 

3) Student 클래스를 상속받는 ComputerScienceStudent(컴퓨터공학과) 학생 클래스

 

~ 필드

public class ComputerScienceStudent extends Student{

	private int java;
	private int network;
	private int linux;

~ 생성자

public ComputerScienceStudent(String name, int kor, int eng, int mat, int java,
 				int network, int linux) {
		super(name, kor, eng, mat);
		this.java = java;
		this.network = network;
		this.linux = linux;	
}

→ 생성자에서 합계 평균을 구하지 않고, getter를 요청받을 때 합계와 평균을 계산하여 반환

 

~ 추상메서드의 내용을 구성함

Student 클래스에서 상속받은 showInfo()showDetail(), getSum(), getAvg()을 오버라이딩함

 

① 학생의 간단한 정보를 출력하는 메서드 showInfo()

@Override
public void showInfo() {
	System.out.printf("[컴퓨터 공학] 이름 : %s, 합계 : %d, 평균 : %.2f\n", 
name, getSum(), getAvg());		
}

② 학생의 자세한 정보를 출력하는 메서드 showDetail()

@Override
public void showDetail() {
	System.out.println("[컴퓨터 공학] " + name);
	System.out.println("국어 : " + kor);
	System.out.println("영어 : " + eng);
	System.out.println("수학 : " + mat);
	System.out.println("자바 : " + java);
	System.out.println("네트워크 : " + network);
	System.out.println("리눅스 : " + linux);
	System.out.println("함계 : " + getSum());
	System.out.printf("평균 : %.2f\n", getAvg());
	System.out.println();
}

③ 성적의 총합을 반환하는 메서드 getSum()

@Override
public int getSum() {
	sum =  kor + eng + mat + java + network + linux;
	return sum;
}

④ 성적의 평균을 계산하여 반환하는 메서드 getAvg()

@Override
public double getAvg() {
	avg = sum / 6.0;
	return avg;
}

 

~ 과목별 성적의 값을 반환할 getter/setter

public int getJava() {
return java;
}

public void setJava(int java) {
	this.java = java;
}

public int getNetwork() {
	return network;
}

public void setNetwork(int network) {
	this.network = network;
}

public int getLinux() {
	return linux;
}

public void setLinux(int linux) {
	this.linux = linux;
}

 

4) 프로그램의 기능을 구성하는 Handler 클래스

 

~ 다른 패키지(model)에 있는 Student 클래스를 import 하고, 값을 저장할 배열 준비함

import model.Student;

public class Handler {

	private Student[] arr = new Student[10];

~ 목록에 추가 기능 구현

public int insert(Student st) {
	for(int i = 0; i < arr.length; i++) {
		if(arr[i] == null) {
			arr[i] = st;
			return 1;
		}
	}
	return 0;
}

~ 목록 출력 기능 구현

public void showList() {
	for(int i = 0; i < arr.length; i++) {
		if(arr[i] != null) {
			arr[i].showInfo();
		}
	}
	System.out.println();
}

~ 검색 기능 구현

public Student find(String find) {
	for(int i = 0; i < arr.length; i++) {	
		if(arr[i] != null) {	
			if(arr[i].getName().equals(find)) {	
				return arr[i]; 	
			}
		}
	}
	return null;
}

배열을 다룰 때에는 배열의 자료형을 확인하고 진행할 것.

Student의 배열이므로, 각 배열의 칸(arr[i])에는 학생 객체가 담길 수 있음

→ 빈칸이 아닌 곳의 학생의 이름이 전달받은 이름과 일치하면 그 학생(Student)객체를 반환함

 

~ 삭제 기능 구현

전달받은 객체의 이름과 arr[i] 객체의 이름을 비교하여 일치하면 arr[i]를 삭제하는 방식

public int delete(Student st) {
	for(int i = 0; i < arr.length; i++) {
		if(arr[i] != null) {
			if(arr[i].getName().equals(st.getName())) {
				arr[i] = null;
				return 1;
			}
		}
	}
	return 0; 
}

② 기존에 만든 find() 메서드를 이용하여 전달받은 객체가 arr[i]와 같으면 arr[i]를 삭제하는 방식

public int delete2(Student st) {
	for(int i = 0; i < arr.length; i++) {
		if(arr[i] == st) {		
			arr[i] = null;
			return 1;	
			}
		}
		return 0; 
	}

== 연산자는 NullPointerException 을 발생시키지 않음

. 왼쪽이 null이면, NullPointerException 이 발생함

 

find는 객체를 반환하지만, indexOf는 객체가 위치하는 배열의 index를 반환하게 만듦.

public int indexOf(String name) {
	for(int i = 0; i < arr.length; i++) {
		if(arr[i] != null && arr[i].getName().equals(name)) {
			return i;
		}
	}
	return -1;
}

index번째의 객체가 있으면 객체를 제거하고 1을 반환함

public int delete(int index) {
	if(arr[index] != null) {
		arr[index] = null;	
		return 1;
	}
	return 0;		
}

 

5) 사용자와 상호작용하는 Main 클래스 작성

~ Handler 클래스의 함수를 호출할 handler 객체 생성

import java.util.Scanner;
import model.ComputerScienceStudent;
import model.EnglishLiguisticStudent;
import model.Student;

public class Main {
	
	private static Handler handler = new Handler();

static 을 사용해서 main 클래스의 모든 객체가 공유하도록 함

 

~ 필요한 지역변수 생성

Scanner sc = new Scanner(System.in);
		
	Student st = null;
	int select;
	int row;
	String name;

 

~ 메뉴 출력 및 사용자 입력

do {
	System.out.println("\n\t학생 관리 프로그램\n");

	System.out.println("1. 목록");
	System.out.println("2. 추가");
	System.out.println("3. 검색");
	System.out.println("4. 삭제");
	System.out.println("0. 종료");
	System.out.print("선택 : ");
			
	select = Integer.parseInt(sc.nextLine());

~ 사용자 입력에 따른 Handler 기능 호출

① 목록 출력

switch(select) {
	case 1 :
		handler.showList();
		break;

② 목록에 추가

case 2 :
	System.out.print("학생 유형을 선택하세요 (1. 영문과 | 2. 컴공과) : ");
	select = Integer.parseInt(sc.nextLine());
				
	if(select == 1) st = makeEnglishLinguisticStudent(sc);
	if(select == 2) st = makeComputerScienceStudent(sc);
				
	row = handler.insert(st); 
	System.out.println(row == 1 ? "추가 성공" : "추가 실패");
	break;

③ 목록에서 검색

case 3 : 
	System.out.print("검색할 학생의 이름을 입력하세요 : ");
	name = sc.nextLine();
	st = handler.find(name);	// 이름을 전달하여 일치하는 학생을 찾기

	if(st != null) st.showDetail();
	else		   System.out.println(name + " 학생을 찾을 수 없습니다.");
	break;

 

목록에서 삭제

- 이름을 전달받아서, 이름이 일치하는 학생 객체를 반환하고, 그 학생을 전달하여 배열에서 제거

case 4 :
	System.out.print("삭제할 학생의 이름을 입력하세요 : ");
	name = sc.nextLine();
	st = handler.find(name);		
	row = handler.delete(st);	
	System.out.println(row == 1 ? "삭제 성공" : "삭제 실패");
	break;
}

- 인덱스를 이용하는 방법 (, 이 경우에는 지역 변수에 index를 선언해줘야함.)

int index;

case 4 :
	System.out.print("삭제할 학생의 이름을 입력하세요 : ");
	name = sc.nextLine();
	index = handler.indexOf(name);
	row = handler.delete(index);
	System.out.println(row == 1 ? "삭제 성공" : "삭제 실패");
	break;
}

⑤ 사용자가 0을 입력하면 프로그램을 종료

} while(select != 0);
		sc.close();
		System.out.println("종료");
	}

 

6) 사용자의 필요한 정보를 입력을 받아 객체를 생성하는 메서드

 

~ 컴퓨터 공학과 학생

private static Student makeComputerScienceStudent(Scanner sc) {
		
	String name;
	int kor, eng, mat, java, network, linux;
		
	System.out.print("이름 : ");
	name = sc.nextLine();
	System.out.print("국어 : ");
	kor = Integer.parseInt(sc.nextLine());
	System.out.print("영어 : ");
	eng = Integer.parseInt(sc.nextLine());
	System.out.print("수학 : ");
	mat = Integer.parseInt(sc.nextLine());
	System.out.print("자바 : ");
	java = Integer.parseInt(sc.nextLine());
	System.out.print("네트워크 : ");
	network = Integer.parseInt(sc.nextLine());
	System.out.print("리눅스 : ");
	linux = Integer.parseInt(sc.nextLine());
		
	Student st = new ComputerScienceStudent(name, kor, eng, mat, java, network, linux);
		
	return st;
}

 

~ 영어영문과 학생

private static Student makeEnglishLinguisticStudent(Scanner sc) {
		
	String name;
	int kor, eng, mat, literature, translater;
		
	System.out.print("이름 : ");
	name = sc.nextLine();
	System.out.print("국어 : ");
	kor = Integer.parseInt(sc.nextLine());
	System.out.print("영어 : ");
	eng = Integer.parseInt(sc.nextLine());
	System.out.print("수학 : ");
	mat = Integer.parseInt(sc.nextLine());
	System.out.print("문학 : ");
	literature = Integer.parseInt(sc.nextLine());
	System.out.print("번역 : ");
	translater = Integer.parseInt(sc.nextLine());
		
	Student st = new EnglishLiguisticStudent(name, kor, eng, mat, literature, translater);
		
	return st;
}

 

7) 결과

목록에 추가

 

목록 보기
목록에 추가
목록 보기
검색
목록에서 삭제
목록 확인
프로그램 종료

 

'JAVA > JAVA Note' 카테고리의 다른 글

[JAVA Note] 19. Collection  (1) 2022.11.16
[JAVA Note] 18. Object  (0) 2022.11.06
[JAVA Note] 16. 추상클래스  (0) 2022.11.02
[JAVA Note] 15. 상속  (0) 2022.11.02
[JAVA Note] 14. 접근 제한자  (0) 2022.10.30

댓글