From 921f40a342b0ab311c2acdbab64fb4b9ba132d74 Mon Sep 17 00:00:00 2001 From: jun-hy Date: Fri, 9 May 2025 16:45:47 +0900 Subject: [PATCH 1/6] chap9 --- "\354\244\200\355\230\201/chapter_9.md" | 51 +++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 "\354\244\200\355\230\201/chapter_9.md" diff --git "a/\354\244\200\355\230\201/chapter_9.md" "b/\354\244\200\355\230\201/chapter_9.md" new file mode 100644 index 0000000..1ffdb8a --- /dev/null +++ "b/\354\244\200\355\230\201/chapter_9.md" @@ -0,0 +1,51 @@ +## 11. 기본 클래스 +### 11-1 Object 클래스 +> 모든 클래스의 최상위 클래스 + +컴파일 과정에서 모든 클래스는 Object 클래스를 상속한다. + +Object 클래스는 자바에서 사용되는 클래스의 여러 기본적인 메서드를 제공. 그러나 모든 메서드를 재정의 할 수 있지는 않다. + +#### Object 클래스의 기본 메서드 +- toString() : 인스턴스의 정보를 문자열로 반환, 재정의가 가능하다. +- equals() : 인스턴스의 물리적인 주소가 `boolean`으로 반환하는 메서드, 재정의가 가능하다. + 재정의시 매개변수로 받은 obj 클래스를 같은 클래스로 형변환해서 사용한다. +- hashCode() : 인스턴스의 주소값을 반환하는 메서드, 재정의가 가능하다. +- clone() : 인스턴스를 복제하는 메서드. + +## 11-2 String 클래스 + +선언방법 + +```java +String str = new String("문자열"); +``` + +String 클래스의 value 는 불변하다. final을 사용하여 선언되었다. + +변경이 가능한 String 클래스를 선언하기 위해선 `StringBuffer` 클래스나 `StringBuilder` 클래스를 이용하자. + +`StringBuilder` 클래스는 문자열이 안전하게 변경되는 것을 보장하지 않지만 실행 속도가 빠르기 때문에 싱글 스레드 프로그램에서 유용하다. + +## 11-3 Wrapper 클래스 + +기본 자료형을 위한 클래스 + +int, boolean 같은 기본 자료형이 아닌 `Integer`, `Boolean` 같은 클래스형으로 선언한다. + +```java +Integer i = new Integer(100); +``` + +- 언박싱 : Wrapper 클래스를 기본 자료형으로 형변환 +- 오토박싱 : 기본 자료형을 Wrapper 클래스로 형변환 + +## 11-4 Class 클래스 + +클래스나 인터페이스에 대한 변수, 메서드, 생성자 등의 정보를 가짐 + +```java +String str = new String(); +Class cls = s.getClass(); +Class c = String.Class; +``` \ No newline at end of file From 794e4cfb8431cb1e12ec7dfed54176cfbf5521d7 Mon Sep 17 00:00:00 2001 From: jun-hy Date: Fri, 9 May 2025 16:46:01 +0900 Subject: [PATCH 2/6] chap10 --- "\354\244\200\355\230\201/chapter_10.md" | 60 ++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 "\354\244\200\355\230\201/chapter_10.md" diff --git "a/\354\244\200\355\230\201/chapter_10.md" "b/\354\244\200\355\230\201/chapter_10.md" new file mode 100644 index 0000000..4bf93b1 --- /dev/null +++ "b/\354\244\200\355\230\201/chapter_10.md" @@ -0,0 +1,60 @@ +## 12. 컬렉션 프레임워크 +### 12-1 제네릭 +여러 참조 자료형을 사용할 수 있도록 프로그래밍 하는 것 + +제네릭 + +```java +// 제너릭 클래스의 선언 +public class Generic { + // 제너릭 타입의 멤버변수 + private T i; + + // 제너릭 타입의 매개변수 + public void setI(T i) { + this.i = i; + } + + // 제너릭 타입을 반환하는 함수 + public T getI() { + return i; + } +} +``` + +제네릭 클래스의 사용 + +```java +Generic i = new Generic(); +i.setI(new Integer(100)); +Integer j = i.getI(); +``` + +제너릭 타입을 특정 자료형으로 제한할 수 있다 +```java +public class Generic +``` + +### 12-2 컬렉션 프레임워크 + +자바에서 제공하는 자료구조 라이브러리 + +`Collection` 인터페이스와 `Map` 인터페이스을 기반으로 구성되어 있음 + +- `Collection` 인터페이스 + - `List` 인터페이스 + - `Set` 인터페이스 +- `Map` 인터페이스 + - `key`와 `value`를 가짐 + +### 12-3 List 인터페이스 +- ArrayList 클래스 : 객체 배열을 구현한 클래스, 컬렉션 인터페이스와 List 인터페이스를 구현 +- LinkedList 클래스 : 링크드 리스트를 클래스를 구현한 클래스 + +### 12-4 Set 인터페이스 +- HashSet 클래스 : 집합 자료 구조를 구현하고 중복을 허용하지 않음 +- TreeSet 클래스 : 자료의 중복을 허용하지 않으면서 출력 결과 값을 정렬하는 클래스 + +### 12-5 Map 인터페이스 +- HashMap 클래스 : Hash 형태로 자료를 관리하는 Map 인터페이스를 구현한 클래스 +- TreeMap 클래스 : 이진 검색 트리로 구성된 key 값으로 자료를 정렬한 클래스 \ No newline at end of file From 5f0cccda59837b01cd63d94420ef6346373990d1 Mon Sep 17 00:00:00 2001 From: jun-hy Date: Fri, 9 May 2025 16:46:07 +0900 Subject: [PATCH 3/6] chap11 --- "\354\244\200\355\230\201/chapter_11.md" | 99 ++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 "\354\244\200\355\230\201/chapter_11.md" diff --git "a/\354\244\200\355\230\201/chapter_11.md" "b/\354\244\200\355\230\201/chapter_11.md" new file mode 100644 index 0000000..fdd891c --- /dev/null +++ "b/\354\244\200\355\230\201/chapter_11.md" @@ -0,0 +1,99 @@ +## 13. 내부 클래스, 람다식, 스트림 +### 13-1 내부 클래스 + +> 클래스 내부에 선언된 클래스 + +```java +class outer { + class inner {} +} +``` + +- 익명 내부 클래스 +```java +class outer { + type getType() { + return new type() { + @override + public void run() { + // todo + } + }; + } +} +``` + +### 13-2 람다식 + +> 익명 함수 + +```java +(int x, int y) -> {return x + y}; +``` + +- 괄호 생략 문법 (매개변수가 2개 이상인 경우 불가) +```java +str -> {System.out.println(str);} +``` + +- 중괄호 생략 문법 (구현이 한 줄일 경우만 가능) +```java +str -> System.out.println(str); +``` + +- return 예약어 생략 문법 +```java +(x, y) -> x + y; +str -> str.length(); +``` + +- 함수형 인터페이스 생성 시 내부 메서드는 하나만 존재해야한다. +```java +@FuntionalInterface // 함수형 인터페이스에 2개 이상의 메서드 선언을 막기위한 어노테이션 +interface Inter { + int add (int a, int b); +} + +public class a { + public static void main(string[] args) { + int a = 1; + int b = 2; + // 람다식 사용 시 인터페이스를 정의하는 클래스없이 바로 인스턴스를 만들어 사용한다. + Inter inter = (x, y) -> {return x + y}; + System.out.println(inter.add(a, b)); + } +} +``` + +### 13-3 스트림 + +> 여러 자료 처리에 대한 기능을 구현해 놓은 클래스 + +```java +int[] arr = {1,2,3,4,5}; +// stream을 이용해 배열의 요소를 하나씩 출력하는 foreach문 +Arrays.stream(arr).foreach(n -> System.out.println(n)); +``` + +- 스트림 연산 + - 중간 연산 + ```java +// filter 연산 +sList.stream().filter(s -> s.length() >= 5).foreach(s -> System.out.println(s)); +// map 연산 +customerList.stream().map(c -> c.getName()).foreach(s -> System.out.println(s)); + ``` + + - 최종 연산 +```java +Arrays.stream(arr).sum(); // 요소의 총합 +Arrays.stream(arr).count(); // 요소의 개수(long 타입) +Arrays.stream(arr).foreach(n -> System.out.println(n)); +// 등등... +``` + +#### 스트림 특징 +- 대상과 관련없이 동일한 연산 수행 +- 재사용 불가 +- 기존 자료 변경 X +- 중간 연산과 최종 연산이 존재함 \ No newline at end of file From da5693c18a9ecb1a192ad36a77c568a756b1bd0e Mon Sep 17 00:00:00 2001 From: jun-hy Date: Fri, 9 May 2025 19:44:04 +0900 Subject: [PATCH 4/6] chap12 --- "\354\244\200\355\230\201/chapter_12.md" | 152 ++++++++++++++++++ "\354\244\200\355\230\201/img/chapter_12.png" | Bin 0 -> 42230 bytes 2 files changed, 152 insertions(+) create mode 100644 "\354\244\200\355\230\201/chapter_12.md" create mode 100644 "\354\244\200\355\230\201/img/chapter_12.png" diff --git "a/\354\244\200\355\230\201/chapter_12.md" "b/\354\244\200\355\230\201/chapter_12.md" new file mode 100644 index 0000000..4692e10 --- /dev/null +++ "b/\354\244\200\355\230\201/chapter_12.md" @@ -0,0 +1,152 @@ +## 14. 예외 처리 +### 14-1 예외 클래스 + +> 예외 클래스의 계층 구조 +> ![](./img/chapter_12.png) + +### 14-2 예외 처리하기 + +- try-catch 문 +```java +try { + // 예외가 발생할 수 있는 코드 구현 +} catch(예외 타입 e) { + // 예외가 발생했을 때 예외를 처리할 코드 +} +``` + +- 예외 처리 실습 +```java +public static void main(String[] args) { + int[] arr = new int[5]; + // ArrayIndexOutOfBoundsException 예외 발생 + try { + for (int i = 0; i <= 5; i++) { + arr[i] = i; + } + } catch (ArrayIndexOutOfBoundsException e) { + System.out.println(e); + } + System.out.println("프로그램 종료"); +} +``` + +```bash +# 결과 +java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5 +프로그램 종료 +``` + +- finally 실습 +```java +public static void main(String[] args) { + int[] arr = new int[5]; + // ArrayIndexOutOfBoundsException 예외 발생 + try { + for (int i = 0; i <= 5; i++) { + arr[i] = i; + } + } catch (ArrayIndexOutOfBoundsException e) { + System.out.println(e); + } finally { + System.out.println("예외 여부 관계 없이 항상 실행"); + } +} +``` + +```bash +# 결과 +java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5 +예외 여부 관계 없이 항상 실행 +``` + +- try-with-resources문 + 시스템 리소스를 close 하지 않아도 try 내부에서 열린 리소스를 자동으로 닫아줌 (python `with`랑 비슷한 듯) +```java +try(ReSrc obj = new ReSrc()) { +} catch { +} +``` + +### 14-3 예외 처리 미루기 + +- throw 사용하기 +```java +// throws 를 사용하여 예외 상황 정의 +public Class loadClass(String s1, String s2) throws FileNotFoundException, ClassNotFoundException { + FileInputStream fis = new FileInputStream(s1); + Class c = Class.forName(s2); + return c; +} + +public static void main(String[] args) { + day11 test = new day11(); + try { + test.loadClass("a.txt", "java.lang.String"); + // 예외 처리 + } catch (FileNotFoundException | ClassNotFoundException e) { + System.out.println(e); + } +} +``` + +- 다중 예외 처리 + catch를 여러번 넣으면서 예외 처리를 여러번 할 수 있다. +```java +try { +} catch(FileNotFoundException e) { +} catch(ClassNotFoundException e) { +} catch(Exception e) { +} +``` + +### 14-4 사용자 정의 예외 + +- 상속을 통한 예외 상황 정의 +```java +class IDFormatException extends Exception { +    public IDFormatException(String message) { +        super(message); +    } +} +``` + +- 실습 코드 작성 +```java +private String userId; + +String getUserId() { + return userId; +} + +void setUserId(String userId) throws IDFormatException { + if (userId == null) { + throw new IDFormatException("ID는 비울 수 없습니다."); + } else if (userId.length() < 8 || userId.length() > 20) { + throw new IDFormatException("아이디는 8자 이상 20자 이하여야 합니다."); + } + this.userId = userId; +} + +public static void main(String[] args) { + day11 day11 = new day11(); + String userid = null; + try { + day11.setUserId(userid); + } catch(IDFormatException e) { + System.out.println(e); + } + userid = "aaaa"; + try { + day11.setUserId(userid); + } catch(IDFormatException e) { + System.out.println(e); + } +} +``` + +```bash +# 결과 +IDFormatException: ID는 비울 수 없습니다. +IDFormatException: 아이디는 8자 이상 20자 이하여야 합니다. +``` diff --git "a/\354\244\200\355\230\201/img/chapter_12.png" "b/\354\244\200\355\230\201/img/chapter_12.png" new file mode 100644 index 0000000000000000000000000000000000000000..bd1f6623a7485bdcdd3692af32e45cbfb5ee5fd3 GIT binary patch literal 42230 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 Date: Sun, 11 May 2025 03:53:17 +0900 Subject: [PATCH 5/6] chap13 --- "\354\244\200\355\230\201/chapter_13.md" | 70 ++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 "\354\244\200\355\230\201/chapter_13.md" diff --git "a/\354\244\200\355\230\201/chapter_13.md" "b/\354\244\200\355\230\201/chapter_13.md" new file mode 100644 index 0000000..da05934 --- /dev/null +++ "b/\354\244\200\355\230\201/chapter_13.md" @@ -0,0 +1,70 @@ +## 15. 자바 입출력 +### 15-1 자바 입출력과 스트림 +- 입출력 장치의 호환성을 보장하기 위해 만들어진 스트림 +- 입력, 출력, 바이트, 문자, 기반, 보조 스트림이 존재함 + +### 15-2 표준 입출력 +- `System.out` : 표준 출력 스트림 +- `System.in` : 표준 입력 스트림 +- `System.err` : 표준 오류 스트림 + +그 외 클래스 + +- `Scanner` : `java.util` 에서 제공하는 입력 스트림 클래스 +- `Console` : 입력 스트림 클래스 + +### 15-3 바이트 단위 스트림 + +- `InputStream` : 바이트 단위로 읽는 스트림 중 최상위 +- `FileInputStream` : 파일 읽기 +```java +public static void main(String[] args) { + FileInputStream fis = null; + try { + fis = new FileInputStream("input.txt"); + System.out.println(fis.read()); + } catch(IOException e) { + System.out.println(e); + } finally { + try { + fis.close(); + } catch(IOException e) { + System.out.println(e); + } catch(NullPointerException e) { + System.out.println(e); + } + System.out.println("end"); + } +} +``` +- `OutputStream` +- `FileOutputStream` + +### 15-4 문자 단위 스트림 + +- `Reader` +- `FileReader` +- `Writer` +- `FileWriter` + +### 15-5 보조 스트림 + +- `FilterInputStream`, `FilterOutputStream` : 보조 스트림의 상위 클래스 +- `BufferdStream` : 버퍼 기능을 추가해 더 빠른 입출력을 제공 +- `Data[Input, Output]Stream` : 메모리에 저장된 0, 1 상태를 그대로 읽고 씀. + +### 15-6 직렬화 + +> 인스턴스의 순간 상태를 그대로 저장하거나 네트워크를 통해 전송하는 것. + +- 역직렬화 : 저장된 내용이나 전송받은 내용을 다시 복원하는 것 + +생성자 + +- `ObjectInputStream` +- `ObjectOutputStream` + +### 15-7 그 외 입출력 클래스 + +- `File` 클래스 +- `RandomAccessFile` 클래스 From c9ee0f3a9873e76630893fbf6651f149eb60c5c8 Mon Sep 17 00:00:00 2001 From: jun-hy Date: Mon, 12 May 2025 00:16:45 +0900 Subject: [PATCH 6/6] chap14 --- "\354\244\200\355\230\201/chapter_14.md" | 392 +++++++++++++++++++++++ 1 file changed, 392 insertions(+) create mode 100644 "\354\244\200\355\230\201/chapter_14.md" diff --git "a/\354\244\200\355\230\201/chapter_14.md" "b/\354\244\200\355\230\201/chapter_14.md" new file mode 100644 index 0000000..7733977 --- /dev/null +++ "b/\354\244\200\355\230\201/chapter_14.md" @@ -0,0 +1,392 @@ +## 최종 프로젝트 - 학점 산출 프로그램 만들기 + +- 학생 클래스 +```java +class Student { + private int studentId; + private String studentName; + private Subject majorSubject; + + private ArrayList scoreList = new ArrayList<>(); + + public Student(int studentId, String studentName, Subject majorSubject) { + this.studentId = studentId; + this.studentName = studentName; + this.majorSubject = majorSubject; + } + + public void addSubjectScore(Score score) { + scoreList.add(score); + } + + public int getStudentId() { + return studentId; + } + + public void setStudentId(int studentId) { + this.studentId = studentId; + } + + public String getStudentName() { + return studentName; + } + + public void setStudentName(String studentName) { + this.studentName = studentName; + } + + public Subject getMajorSubject() { + return majorSubject; + } + + public void setMajorSubject(Subject subject) { + this.majorSubject = subject; + } + + public ArrayList getScoreList() { + return scoreList; + } + + public void setScoreList(ArrayList arr) { + this.scoreList = arr; + } +} +``` + +- 강의 클래스 +```java +class Subject { + private String subjectName; + private int subjectId; + private int gradeType; + + private ArrayList studentList = new ArrayList<>(); + + public Subject(String subjectName, int subjectId, int gradeType) { + this.subjectName = subjectName; + this.subjectId = subjectId; + this.gradeType = Define.AB_TYPE; + } + + public String getSubjectName() { + return subjectName; + } + + public void setSubjectName(String subjectName) { + this.subjectName = subjectName; + } + + public int getSubjectId() { + return subjectId; + } + + public void setSubjectId(int subjectId) { + this.subjectId = subjectId; + } + + public ArrayList getStudentList() { + return studentList; + } + + public void setStudentList(ArrayList studentList) { + this.studentList = studentList; + } + + public int getGradeType() { + return gradeType; + } + + public void setGradeType(int gradeType) { + this.gradeType = gradeType; + } + + public void register(Student student) { + studentList.add(student); + } +} +``` + +- 점수 클래스 +```java +class Score { + int studentId; + Subject subject; + int point; + + public Score(int studentId, Subject subject, int point) { + this.studentId = studentId; + this.subject = subject; + this.point = point; + } + + public int getStudentId() { + return studentId; + } + + public void setStudentId(int studentId) { + this.studentId = studentId; + } + + public Subject getSubject() { + return subject; + } + + public void setSubject(Subject subject) { + this.subject = subject; + } + + public int getPoint() { + return point; + } + + public void setPoint(int point) { + this.point = point; + } + + public String toString() { + return "학번 : " + studentId + ", " + subject.getSubjectName() + " : " + point; + } +} +``` + +- 상수 클래스 +```java +class Define { + public static final int KOREAN = 1001; + public static final int MATH = 2001; + + public static final int AB_TYPE = 0; + public static final int SAB_TYPE = 1; +} +``` + +- 점수 산출 인터페이스 및 기능 구현 클래스 +```java +interface GradeEvaluation { + public String getGrade(int point); +} + +// 일반 과목 +class BasicEvaluation implements GradeEvaluation { + @Override + public String getGrade(int point) { + String grade; + + if (point >= 90 && point <= 100) grade = "A"; + else if (point >= 80) grade = "B"; + else if (point >= 70) grade = "C"; + else if (point >= 55) grade = "D"; + else grade = "F"; + return grade; + } +} + +// 전공 과목 +class MajorEvaluation implements GradeEvaluation { + @Override + public String getGrade(int point) { + String grade; + if (point >= 95 && point <= 100) grade = "S"; + else if (point >= 90) grade = new String("A"); + else if (point >= 80) grade = "B"; + else if (point >= 70) grade = "C"; + else if (point >= 60) grade = "D"; + else grade = "F"; + return grade; + } +} + +// 이후 PF 강의 평가 클래스 추가가 +``` + +- 결과 출력 클래스 +```java +class GenerateGradeReport { + School school = School.getInstance(); + public static final String TITLE = " 수강생 학점 \t\t\n"; + public static final String HEADER = " 이름 | 학번 |필수과목|점수 \n"; + public static final String LINE = "-------------------------------------\n"; + private StringBuffer buffer = new StringBuffer(); + + public String getReport() { + ArrayList subjectList = school.getSubjectList(); + for (Subject subject : subjectList) { + makeHeader(subject); + makeBody(subject); + makeFooter(); + } + return buffer.toString(); + } + + public void makeHeader(Subject subject) { + buffer.append(GenerateGradeReport.LINE); + buffer.append("\t"+subject.getSubjectName()); + buffer.append(GenerateGradeReport.TITLE); + buffer.append(GenerateGradeReport.HEADER); + buffer.append(GenerateGradeReport.LINE); + } + + public void makeBody(Subject subject) { + ArrayList studentList = subject.getStudentList(); + + for (int i = 0; i < studentList.size(); i++) { + Student student = studentList.get(i); + buffer.append(student.getStudentName()); + buffer.append(" | "); + buffer.append(student.getStudentId()); + buffer.append(" | "); + buffer.append(student.getMajorSubject().getSubjectName() + "\t"); + buffer.append(" | "); + + getScoreGrade(student, subject.getSubjectId()); + + buffer.append("\n"); + buffer.append(LINE); + } + } + + public void getScoreGrade(Student student, int subjectId) { + ArrayList scoreList = student.getScoreList(); + int majorId = student.getMajorSubject().getSubjectId(); + + // 평가 클래스 추가 + GradeEvaluation[] gradeEvaluations = {new BasicEvaluation(), new MajorEvaluation()}; + + for (int i = 0; i < scoreList.size(); i++) { + Score score = scoreList.get(i); + if (score.getSubject().getSubjectId() == subjectId) { + String grade; + if (score.getSubject().getSubjectId() == majorId) + grade = gradeEvaluations[Define.SAB_TYPE].getGrade(score.getPoint()); + else + grade = gradeEvaluations[Define.AB_TYPE].getGrade(score.getPoint()); + + buffer.append(score.getPoint()); + buffer.append(" : "); + buffer.append(grade); + buffer.append(" | "); + } + } + } + + public void makeFooter() { + buffer.append("\n"); + } +} +``` + +- 학교 클래스 +```java +class School { + private static School instance = new School(); + + private static String SCHOOL_NAME = "Good School?"; + private ArrayList studentList = new ArrayList<>(); + private ArrayList subjectList = new ArrayList<>(); + + private School() {} + + public static School getInstance() { + if (instance == null) + instance = new School(); + return instance; + } + + public ArrayList getStudentList() { + return studentList; + } + + public void addStudent(Student student) { + studentList.add(student); + } + + public void addSubject(Subject subject) { + subjectList.add(subject); + } + + public ArrayList getSubjectList() { + return subjectList; + } + + public void setSubjectList(ArrayList subjectList) { + this.subjectList = subjectList; + } +} +``` + +- 테스트 프로그램 작성 +```java + School sh = School.getInstance(); + Subject korean; + Subject math; + GenerateGradeReport gradeReport = new GenerateGradeReport(); + + public static void main(String[] args) { + Test test = new Test(); + + test.createStudent(); + test.createSubject(); + + String report = test.gradeReport.getReport(); + System.out.println(report); + } + + public void createSubject() { + // 전공 객체 생성 + korean = new Subject("국어", Define.KOREAN); + math = new Subject("수학", Define.MATH); + + // PF 평가 방식의 강의의 경우 정책 지정정 + + // 학교 객체에 전공 추가 + sh.addSubject(korean); + sh.addSubject(math); + } + + public void createStudent() { + Student student1 = new Student(111111, "aaa", korean); + Student student2 = new Student(222222, "bbb", math); + Student student3 = new Student(333333, "ccc", korean); + Student student4 = new Student(444444, "ddd", korean); + Student student5 = new Student(555555, "eee", math); + + sh.addStudent(student1); + sh.addStudent(student2); + sh.addStudent(student3); + sh.addStudent(student4); + sh.addStudent(student5); + + korean.register(student1); + korean.register(student2); + korean.register(student3); + korean.register(student4); + korean.register(student5); + + math.register(student1); + math.register(student2); + math.register(student3); + math.register(student4); + math.register(student5); + + addScoreForStudent(student1, korean, 95); + addScoreForStudent(student1, math, 56); + + addScoreForStudent(student2, korean, 95); + addScoreForStudent(student2, math, 95); + + addScoreForStudent(student3, korean, 100); + addScoreForStudent(student3, math, 88); + + addScoreForStudent(student4, korean, 89); + addScoreForStudent(student4, math, 95); + + addScoreForStudent(student5, korean, 85); + addScoreForStudent(student5, math, 56); + } + + public void addScoreForStudent(Student student, Subject subject, int point) { + Score score = new Score(student.getStudentId(), subject, point); + student.addSubjectScore(score); + } +} +``` \ No newline at end of file