Java/Java 복습

[2026-05-28] 클래스 기초 , Setter ,Getter , private 연습

jamk-diary 2026. 5. 29. 00:35

 

 

[수강일지_14] 학생정보 관리 프로그램 만들기

studentCount++;프로그램을 짜는 경우 1. Main Class 안에 있는 Main (), 메뉴가 있다 2. human 프로그램 구축해보기 1. 프로그램 기획 UML 사용하기 Flowchart Maker & Online Diagram SoftwareFlowchart Maker and Online Diagram Sof

jamk-diary.tistory.com

 

[수강일지_14]를 바탕으로 재미니한테 과제 받기 

👑 과제: 우리 반 과목별 총점 & 평균 계산기 조립하기

🏃‍♂️ 미션 패스 가이드라인 (이 순서대로 조립해 봐!)

1단계: 유저한테 "무슨 과목 볼래?" 물어보기

  • 화면에 "원하시는 과목을 입력해 주세요 = 국어(1), 수학(2), 영어(3)"라고 먼저 띄우기.
  • 유저가 숫자를 입력하면 int sub라는 상자에 저장하기!

2단계: 점수만 따로 모아둘 5칸짜리 '점수 상자' 만들기

  • 학생이 총 5명까지 들어올 수 있으니까, 점수만 따로 쏙쏙 골라 담을 5칸짜리 정수형 배열 sub_Total_araay를 선언하기!

3단계: 유저가 고른 과목 점수만 배열에 채워 넣기 (안전장치 꼭!)

  • if (sub == 1) 이면 국어 점수 가져오기!
  • for문을 돌려서 0번 방부터 4번 방까지 검사하는데, 방이 비어있을 수 있으니 if (students[i] != null)이라는 안전장치를 꼭 걸어주고, 빈 칸이 아닐 때만 sub_Total_araay[i]에 국어 점수(getKor())를 채워 넣기!
  • (수학이랑 영어도 if (sub == 2), if (sub == 3)으로 똑같이 만들어주기!)

4단계: 총점 더하고, 진짜 학생 수 세기 (두 로봇 출동!)

  • 계산하기 전에 총점 담을 그릇 sub_Total = 0;이랑 진짜 학생 수 셀 studentCount = 0; 상자를 0으로 세팅하기.
  • 다시 for문(1번 이동 로봇)을 돌려서 방을 하나씩 열어보자!
  • 진짜 학생이 들어있는 방이라면? sub_Total에 점수를 계속 더해주고, studentCount++(2번 카운터 로봇)을 딸깍! 눌러서 학생 한 명 추가하기!

5단계: 실수형 평균 구하고 멋지게 출력하기

  • 평균은 소수점이 나와야 하니까 double sub_Result; 그릇을 준비하기.
  • sub_Total / studentCount를 계산할 건데, 자바가 소수점을 버리지 못하게 총점 앞에 (double) 마법 부려주기!
  • 마지막으로 System.out.println을 사용해 총점과 평균을 화면에 출력하면 미션 컴플리트!

💡 재미니의 꿀팁!

아까 물어본 것처럼 "블로그 절대 안 보고" 이 5단계 순서만 머릿속으로 그리면서 이클립스에 코드를 직접 타이핑해 봐!
만약 치다가 3번이나 4번에서 로봇들이 고장 나거나 기억이 안 나면, 그때 질문자님의 비밀 치트키(블로그)를 슬쩍 열어서 "아, 맞다! studentCount++는 여기 넣는 거였지!" 하고 확인하면 돼. 그 막히는 순간이 진짜 실력이 늘어나는 타이밍이야!
준비 완료됐다면 조심히 퇴근하고, 집에서 재밌는 코딩 게임 한 판 즐기고 와! 화이팅! 🚀

 

Main Class

package Main;

 

import java.util.Scanner;

 

import Dao.Dao;

 

public class MainaClass {

 

public static void main(String[] args) {

// TODO // 👑 우리 반 과목별 총점 & 평균 계산기 조립하기

/*

[목표]

Total()이라는 이름의 메서드(그릇)를 만들고,

사용자가 "국어"를 고르면 학생들의 국어 총점과 평균을 구해서 화면에 보여주는 프로그램

*/

/* 프라이빗 변수/자료타입

학생이름 / String

국어 점수 /int

수학 점수 /int

영어 점수 */

 

Dao D=new Dao();

 

 

D.User_WantTotal();

 

 

 

 

 

 

}

 

}

Dao

package Dao;

 

import java.util.Scanner;

 

import Dto.Dto;

 

public class Dao {

Dto Dt=new Dto();

 

 

 

Scanner sc = new Scanner(System.in);

int sub;

int sub_total;

double sub_Result;

String sub_name;

 

 

//더미 데이터 넣을 배열 생성

private Dto Score_array [] = {

 

new Dto("홍길동", 90, 80, 85),

new Dto("성춘향", 100, 90, 95),

new Dto("일지매", 85, 75, 90),

null,

null,

};

 

//2단계: 점수만 따로 모아둘 5칸짜리 '점수 상자' 만들기

/* 자료형 배열이름 [] = new 자료형 [칸수 기입] */

int sub_Total_araay[] = new int [5];

 

 

public void User_WantTotal () {

 

//1단계: 유저한테 "무슨 과목 볼래?" 물어보기

System.out.print("원하시는 과목의 번호를 입력해 주세요 [ 국어- (1), 수학- (2), 영어- (3) ] => ");

int sub = sc.nextInt();

 

//3단계: 유저가 고른 과목 점수sub만 배열sub_Total_araay[]에 채워 넣기 (안전장치 꼭!)

 

 

if(sub == 1) {

sub_name="국어";

for (int i = 0; i < Score_array.length; i++) {

if (Score_array[i] != null) {

sub_Total_araay [i]= Score_array[i].getKor();

}

}

 

}

 

if(sub == 2) {

sub_name="수학";

for (int i = 0; i < Score_array.length; i++) {

if (Score_array[i] != null) {

sub_Total_araay [i]= Score_array[i].getMath();

}

}

 

}

 

if(sub == 3) {

sub_name="영어";

for (int i = 0; i < Score_array.length; i++) {

if (Score_array[i] != null) {

sub_Total_araay [i]= Score_array[i].getEng();

}

}

 

}

 

sub_total=0;

for (int i = 0; i < sub_Total_araay.length; i++) {

sub_total=sub_total + sub_Total_araay[i];

 

}

 

int studentCount = 0;

for (int i = 0; i < Score_array.length; i++) {

studentCount++;

}

 

sub_Result= sub_total/studentCount;

 

System.out.println(sub_name +" 의 총점은 " + sub_total + " 입니다 ");

 

System.out.println (sub_name + "의 평균은 " + sub_Result + "입니다");

}

 

Dto

package Dto;

 

 

 

public class Dto {

// 프라이빗 변수/자료타입

/*학생이름 */ private String Name;

/*국어 점수*/ private int Kor;

/*수학 점수 */private int Math;

/*영어 점수*/ private int Eng;

 

//기본 생성자

public Dto() {

 

}

 

//Using

public Dto(String name, int kor, int math, int eng) {

super();

Name = name;

Kor = kor;

Math = math;

Eng = eng;

}

//Getter & Setter

public String getName() {

return Name;

}

 

public void setName(String name) {

Name = name;

}

 

public int getKor() {

return Kor;

}

 

public void setKor(int kor) {

Kor = kor;

}

 

public int getMath() {

return Math;

}

 

public void setMath(int math) {

Math = math;

}

 

public int getEng() {

return Eng;

}

 

public void setEng(int eng) {

Eng = eng;

}

 

//to String

@Override

public String toString() {

return "Dto [학생이름= " + Name + ", 국어점수= " + Kor + ", 수학점수 =" + Math + ", 영어점수 =" + Eng + "]";

}

 

 

 

}

 

출력결과 

원하시는 과목의 번호를 입력해 주세요 [ 국어- (1), 수학- (2), 영어- (3) ] => 1

국어 의 총점은 275 입니다

국어의 평균은 55.0입니다


과제  오류 확인 및  해결책 
올려주신 최종 코드를 제가 아주 꼼꼼하게 검사해 봤어요.
결론부터 말씀드리면, "원하시는 과목의 점수들을 쏙쏙 뽑아와서 배열에 담고, 총점을 누적하는 흐름"까지는 100점 만점에 100점입니다! 국어, 수학, 영어 조건문이랑 안전장치(!= null)도 완벽하게 기억해 내서 적으셨어요.
하지만! 실행 결과 스크린샷을 보니 평균이 55.0으로 나왔죠? 원래 3명의 국어 총점은 275점이니까 275 / 3을 하면 91.666...이 나와야 하거든요. 왜 평균이 다르게 나왔는지, 컴퓨터의 시선에서 딱 2가지 숨은 버그를 찾아 드릴게요!

🔍 재미니가 찾은 숨은 버그 2가지

1번 버그 🐛 : 학생 수를 세는 로봇이 빈 방까지 다 세어버렸어요!

질문자님이 학생 수를 세는 코드를 이렇게 짜셨어요.

int studentCount = 0;
for (int i = 0; i < Score_array.length; i++) {
    studentCount ++; // 👈 안전장치 없이 무조건 딸깍!
}

  • 이유: 이렇게 짜면 1번 이동 로봇이 0번 방부터 4번 방까지 총 5번을 도는 동안, 빈 방(null)인 3번, 4번 방에서도 studentCount++를 무조건 실행해 버려요.
  • 그래서 진짜 시험을 본 사람은 3명인데, 저금통 안에는 숫자 5가 들어가 버린 거랍니다! 그래서 275 / 5 = 55라는 평균이 나온 거예요.
  • 해결책: 점수 더할 때처럼 여기도 꼭 안전장치를 걸어주어야 해요!

    if (Score_array[i] != null) { // 진짜 학생 방이 맞을 때만!
        studentCount++;          // 딸깍 세어라!
    }


    2번 버그 🐛 : 자바의 '정수 나누기' 버그가 발동했어요! 평균을 계산하는 식을 볼까요? `

    sub_Result = sub_total / studentCount;

  • 이유: sub_total도 정수(int)고, studentCount도 정수(int)죠? 자바는 정수끼리 나누면 소수점을 지독하게 버려버리는 버그가 있어요. 나중에 학생 수를 3명으로 고쳐도 275 / 3 = 91.666이 아니라 딱 91.0으로 소수점이 잘려서 나오게 됩니다.
  • 해결책: 우리가 아까 배웠던 (double) 마법을 총점 앞에 슥 붙여주셔야 소수점까지 예쁘게 살아납니다!

    sub_Result = (double)sub_total / studentCount;




오류 수정한 코드 최종본 
🛠️ 최종 완벽하게 고쳐진 마무리 코드 모양
`Dao` 클래스의 맨 밑바닥 계산 부분을 요렇게 딱 두 군데만 수정해 주면 이번 미션은 진짜 완벽한 마스터입니다! `

``java

//  진짜 학생이 있는 방만 카운트하기!
int studentCount = 0;
for (int i = 0; i < Score_array.length; i++){
if (Score_array[i] != null) { // 👈 안전장치 장착!
studentCount++;
}
}

// 소수점 지켜내기 위해 (double) 형변환 마법 쓰기!

sub_Result = (double)sub_total / studentCount;

System.out.println(sub_name + " 의 총점은 " + sub_total + " 입니다 ");
System.out.println(sub_name + "의 평균은 " + sub_Result + "입니다");

총평

 

💡 오늘의 총평!

혼자서 빈 화면에 이만큼의 대형 코드를 기억해 내서 타이핑하고, 에러 없이 실행까지 성공시킨 것 자체가 이미 엄청난 실력 향상이에요! 55.0이라는 숫자가 나온 건 틀린 게 아니라, "컴퓨터가 내 의도와 다르게 방을 세었구나!"를 배울 수 있는 최고의 경험이랍니다.
요 두 부분만 이클립스에서 슥 고쳐서 다시 실행해 보세요. 그럼 질문자님이 원하던 눈부신 소수점 결과(91.66666...)를 만나실 수 있을 거예요. 얼른 고쳐보고 성공하면 또 알려줘요! 🚀

MainaClass.java
0.00MB
Dao.java
0.00MB
Dto.java
0.00MB