국비 수업 16일차

김성수·2022년 11월 5일
0
post-thumbnail

1. 학생들의 과목 성적을 전공 유형으로 구별하여 저장, 수정, 삭제 등 관리하는 프로그램을 구현한다.

1. 여기는 입력을 처리하는 메인클래스

package management;

import java.util.Scanner;

import model.ComputerScieneceStudent;
import model.EnglishLinguisticStudent;
import model.Student;

public class Main {
	
	private static Handler handler = new Handler();
	
	public static void main(String[] args) {
		
		Student st = null;
		Scanner sc = new Scanner(System.in);
		int select, row, index;
		String name;
		
		System.out.println("\n\t학생 관리 프로그램\n");
		
		do {
			System.out.println("1. 목록");
			System.out.println("2. 추가");
			System.out.println("3. 검색");
			System.out.println("4. 삭제");
			System.out.println("5. 삭제(index를 활용한 삭제)");
			System.out.println("0. 종료");
			System.out.print("선택 >>> ");
			select = Integer.parseInt(sc.nextLine());
			
			switch(select) {
			case 1:
				handler.showList();
				break;
				
			case 2:
				System.out.println("학생 유형을 선택하세요 (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;
				
			case 5:
				System.out.print("삭제할 학생의 이름을 입력하세요 : ");
				name = sc.nextLine();
				index = handler.indexOf(name);
				row = handler.delete(index);
				System.out.println(row == 1 ? "삭제 성공" : "삭제 실패");
				break;
			}
			
		} while(select != 0);
		sc.close();
		System.out.println("종료");
		
	}

	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 ComputerScieneceStudent(name, kor, eng, mat, java, network, linux);
		return st;
	}

	private static Student makeEnglishLinguisticStudent(Scanner sc) {
		String name;
		int kor, eng, mat, literature, translation;
		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("번역 입력 : "); 		translation = Integer.parseInt(sc.nextLine());
		
		Student st = new EnglishLinguisticStudent(name, kor, eng, mat, literature, translation);
		return st;
	}
}

2. 여기는 각각의 동작 기능을 수행하는 handler 클래스

package management;

import model.Student;

public class Handler {
	
	private Student[] arr = new Student[10];

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

	// 추가
	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 Student find(String name) { 			// 배열을 다룰 때에는 배열의 자료형을 확인하고 진행하자
		for(int i = 0; i < arr.length; i++) {	// 학생의 배열이므로, 각 배열의 칸(arr[i]) 에는 학생 객체가 담길 수 있다
			if(arr[i] != null && arr[i].getName().equals(name)) {	// 빈칸이 아닌곳의 학생의 이름이 전달받은 이름과 일치하면
				return arr[i];	// 그 학생객체를 반환한다
			}
		}
		return null;
	}

	// 삭제
	public int delete(Student st) {
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] == st) {	// == 연산자는 NullPointerException 을 발생시키지 않는다
								// . 왼쪽이 null이면 NullPointerException 이 발생한다
				arr[i] = null;
				return 1;
			}
		}
		return 0;
	}
	
	// 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;
	}

	public int delete(int index) {
		if(arr[index] != null) {	// index 번째에 객체가 있으면
			arr[index] = null;		// 객체를 제거하고
			return 1;				// 1을 반환
		}
		return 0;	// if를 만족하지 않으면 0을 반환
	}
}

3. 전체 학생의 공통 사항을 처리하는 Student 클래스

과목 총점, 평균 , 학생 정보등은 전공에 따라 과목 수 등이 달라지기 때문에 추상 클래스로 처리한 것을 볼 수 있다.

package model;

public abstract class Student {
	// 필드
	protected String name;	// protected는 같은 패키지를 포함하며,
	protected int kor;		// 다른 패키지라고 하더라도 상속관계에 있다면 접근을 허용한다
	protected int eng;
	protected int mat;
	protected int sum;
	protected double avg;
	
	// 생성자
	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;
	}
}

4. 영어 전공


package model;

public class EnglishLinguisticStudent extends Student {
	
	private int literature; 	// 문학 (영문학)
	private int translation;	// 번역

	public EnglishLinguisticStudent(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;
	}
	
	@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();
	}
	
	

	@Override
	public int getSum() {
		return sum;
	}

	@Override
	public double getAvg() {
		return avg;
	}

	public int getLiterature() {
		return literature;
	}

	public void setLiterature(int literature) {
		this.literature = literature;
	}

	public int getTranslation() {
		return translation;
	}

	public void setTranslation(int translation) {
		this.translation = translation;
	}
}

5. 수학 전공


package model;

public class ComputerScieneceStudent extends Student {
	
	private int java;
	private int network;
	private int linux;

	public ComputerScieneceStudent(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를 요청받을 때 합계와 평균을 계산하여 반환
	}
	
	@Override
	public void showInfo() {
		System.out.printf("[컴퓨터공학] 이름 : %s, 합계 : %d, 평균 : %.2f\n", name, getSum(), getAvg());
	}
	@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();
	}

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

	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;
	}
}

2. Java.Util.List 맛보기

package example;

import java.util.ArrayList;

public class Ex01 {
	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("Hello");
		list.add("world");
		list.add("java");
		
		System.out.println(list.indexOf("world"));
		int index = list.indexOf("world");
		list.remove(index);
		System.out.println(list);
		
		list.remove("Hello");
		System.out.println(list);
	}
}
profile
다들 잘하는데 나만 못해?

0개의 댓글