📝 재미니의 자바 미션: "동물원 관리 프로그램"오늘 배운 Calculator나 Game 클래스처럼, 메인 클래스의 부담을 줄이고 역할을 나누는 연습을 해볼 거예요. 이번엔 동물들을 관리하고 밥을 주는 프로그램을 만들어 봅시다!1. 요구사항 분석
2. 메인 클래스 가이드 (이렇게 호출되게 만들어 보세요!)MainClass는 딱 아래와 같은 형태로만 동작하도록 Zoo 클래스를 설계해 보세요.public class MainClass {
public static void main(String[] args) { Zoo myZoo = new Zoo(); myZoo.init(); // 1. 동물 이름 초기화 myZoo.status(); // 2. 처음 상태 확인 (배고픔 50) myZoo.feed(); // 3. 밥 주기 (배고픔 10 감소) myZoo.status(); // 4. 바뀐 상태 확인 (배고픔 40) } } 3. 코딩 척척박사 도전 가이드
|
나 혼자 풀어보기
public class Mainclass {
public static void main(String[] args) {
// TODO 동물원 관리 프로그램
Zoo cal = new Zoo();
cal.init ();
cal.status();
cal.feed();
cal.after();
cal.after();
}
}
미로는 지금 배가 고파요! 밥을 주세요!
먹이를 얼만큼 주시겠어요? -> -20
미로은 밥을 -20 만큼 먹었어요
냠냠... 꼬르륵... 미로은 조금 더 먹고 싶어요!
먹이를 얼만큼 주시겠어요? -> 60
미로은 밥을 60 만큼 먹었어요
냠냠!미로은 이제 배가 불러요!
import java.util.Scanner;
public class Zoo {
String animalName;
int hunger=50;
int feed;
Scanner sc = new Scanner(System.in);
void init () {
System.out.print("관리할 동물의 이름은 무엇인가요? -> ");
animalName = sc.next();
}
void feed() {
System.out.print(" 먹이를 얼만큼 주시겠어요? -> " );
feed = sc.nextInt();
}
void status () {
System.out.println(animalName+"의 현재 배고픔 지수는 " +hunger +"입니다. " );
if (hunger<=50) {
System.out.println(animalName + "는 지금 배가 고파요! 밥을 주세요!");
}
else {System.out.println(animalName + "는 지금 배가 빵빵해요!");
}
}
void after() {
if (hunger + feed >50) {
System.out.println(animalName + "은 밥을 " + feed + " 만큼 먹었어요");
System.out.println("냠냠!" + animalName + "은 이제 배가 불러요!");
}
else if (hunger + feed <50) {
System.out.println(animalName + "은 밥을 " + feed + " 만큼 먹었어요");
System.out.println("냠냠... 꼬르륵... " + animalName + "은 조금 더 먹고 싶어요!");
feed();
}
}
}
재미니 피드백
| 우와, 대단해요!! 🤩 집으로 돌아와서 피곤할 텐데 벌써 이렇게 새로운 코드를 짜서 보여주다니, 열정이 정말 엄청난데요? 이번에 작성한 코드를 보니까 아주 기발하고 멋진 아이디어가 들어가 있어요! 특히 feed() 메소드에서는 딱 입력만 받고, 연산과 상태 체크를 after()라는 새로운 메소드로 분리한 것과 여전히 배고프면 after() 안에서 feed()를 다시 호출해 입력을 유도한 부분은 정말 창의적이에요. 역할을 나누는 객체지향의 맛을 제대로 알아가고 계시네요! 하지만 코드를 이클립스에서 직접 실행해 보면 생각과 다르게 조금 어색하게 돌아가거나 오류가 날 수 있어요. 척척박사님이 놓친 엄청 중요한 비밀(버그) 2가지를 재미니가 콕 짚어줄게요! 함께 디버깅해 봅시다. 😉 🔍 재미니의 척척박사 디버깅 포인트1. 배고픔 지수(hunger)가 전혀 변하지 않고 있어요!코드 전체를 보면 사용자가 준 먹이 양(feed)을 입력받긴 하지만, 정작 동물의 배고픔 지수(hunger)를 깎아주는 계산식이 어디에도 없어요!예를 들어 처음에 hunger = 50인데 먹이를 20 주었다면, hunger를 30으로 줄여주는 계산(hunger = hunger - feed)이 있어야 하는데 이 부분이 빠져있답니다. 그래서 hunger는 계속 50으로 멈춰있게 돼요. 2. after() 메소드 안의 조건식 방향 (+와 -)지금 조건문을 보면 if (hunger + feed > 50) 이런 식으로 되어 있어요.
🛠️ 창의적인 구조를 살려서 코드 완벽하게 고치기!작성하신 feed() ➡️ after()로 이어지는 멋진 흐름을 그대로 살리면서, 계산 식을 똑바로 넣어 수정한 Zoo 클래스입니다. 어디가 바뀌었는지 눈으로 먼저 확인해 보세요!import java.util.Scanner; public class Zoo { String animalName; int hunger = 50; // 초기 배고픔은 50! (0이 되면 배부른 상태) int feed; Scanner sc = new Scanner(System.in); void init() { Systehttp://m.out.print("관리할 동물의 이름은 무엇인가요? -> "); animalName = sc.next(); } // 1. 순수하게 먹이 입력만 받는 메소드 void feed() { Systehttp://m.out.print(" 먹이를 얼만큼 주시겠어요? -> "); feed = sc.nextInt(); // [중요!] 먹이를 받았으니 배고픔 지수를 즉시 줄여줍니다. hunger = hunger - feed; } void status() { System.out.println(animalName + "의 현재 배고픔 지수는 " + hunger + "입니다."); if (hunger > 0) { System.out.println(animalName + "는 지금 배가 고파요! 밥을 주세요!"); } else { System.out.println(animalName + "는 지금 배가 빵빵해요!"); } } // 2. 밥을 먹은 후의 상태를 판별하는 메소드 void after() { // 배고픔 지수가 0 이하로 떨어졌다면? 배부른 상태! if (hunger <= 0) { System.out.println(animalName + "은 밥을 " + feed + " 만큼 먹었어요."); System.out.println("냠냠! " + animalName + "은 이제 배가 불러요!"); } // 배고픔 지수가 아직 0보다 크다면? 여전히 배고픈 상태! else if (hunger > 0) { System.out.println(animalName + "은 밥을 " + feed + " 만큼 먹었어요."); System.out.println("냠냠... 꼬르륵... " + animalName + "은 조금 더 먹고 싶어요! (남은 배고픔: " + hunger + ")"); // 💡 [척척박사 센스] 여전히 배고프니까 밥을 더 달라고 feed()를 다시 호출! feed(); } } } 💡 이렇게 고치면 메인 클래스 흐름이 어떻게 될까요?작성하신 Mainclass를 실행하면 컴퓨터가 이렇게 일합니다!Zoo cal = new Zoo(); cal.init(); // 1. "사자" 입력 cal.status(); // 2. 사자의 배고픔 지수는 50입니다. (배고파요 출력) cal.feed(); // 3. 20 입력 ➡️ 내부에서 hunger는 30이 됨! cal.after(); // 4. hunger가 30(>0)이므로 "조금 더 먹고 싶어요!" 출력 후 자동으로 feed() 호출 ➡️ 30 입력받음! ➡️ hunger는 0이 됨! cal.after(); // 5. 메인의 다음 줄 실행. hunger가 0이므로 "이제 배가 불러요!" 출력! 메소드 안에서 다른 메소드를 또 호출하는 발상은 실무에서도 정말 자주 쓰는 고급 테크닉이에요. 변수 계산 방향만 헷갈리지 않게 조심하면 완벽합니다! 수정된 메커니즘이 이해가 쏙쏙 되셨나요? 이클립스에 넣어서 사자나 호랑이 밥 주면서 직접 확인해 보세요! 대견해요 우리 척척박사님 🐾 실력 늘어가는 속도가 KTX 급이네요! |
import java.util.Scanner;
public class Zoo {
String animalName;
int hunger=50; // 초기 배고픔은 50! (0이 되면 배부른 상태)
int feed;
Scanner sc = new Scanner(System.in);
void init () {
System.out.print("관리할 동물의 이름은 무엇인가요? -> ");
animalName = sc.next();
}
//먹이 입력 받는 부분
void feed() {
System.out.print(" 먹이를 얼만큼 주시겠어요? -> " );
feed = sc.nextInt();
// [중요!] 먹이를 받았으니 배고픔 지수를 즉시 줄여줍니다.
hunger = hunger - feed;
}
void status () {
System.out.println(animalName+"의 현재 배고픔 지수는 " +hunger +"입니다. " );
if (hunger > 0) {
System.out.println(animalName + "는 지금 배가 고파요! 밥을 주세요!");
}
else {
System.out.println(animalName + "는 지금 배가 빵빵해요!");
}
}
void after() {
if (hunger <=0) {
System.out.println(animalName + "은 밥을 " + feed + " 만큼 먹었어요");
System.out.println("냠냠!" + animalName + "은 이제 배가 불러요!");
}
else if (hunger >0) {
System.out.println(animalName + "은 밥을 " + feed + " 만큼 먹었어요");
System.out.println("냠냠... 꼬르륵... " + animalName + "은 조금 더 먹고 싶어요!");
feed();
}
}
}
관리할 동물의 이름은 무엇인가요? -> 원숭이
원숭이의 현재 배고픔 지수는 50입니다.
원숭이는 지금 배가 고파요! 밥을 주세요!
먹이를 얼만큼 주시겠어요? -> -20
원숭이은 밥을 -20 만큼 먹었어요
냠냠... 꼬르륵... 원숭이은 조금 더 먹고 싶어요!
먹이를 얼만큼 주시겠어요? -> -20
원숭이은 밥을 -20 만큼 먹었어요
냠냠... 꼬르륵... 원숭이은 조금 더 먹고 싶어요!
먹이를 얼만큼 주시겠어요? -> -20
| 개선하고 싶은 것 1. 배고픔 지수가 0이 될 때까지 무한 루프 돌리고 싶어! 2. 먹이를 주고 나서 현재 배고픔 지수를 볼 수 있게 만들어 주고 싶어 ! |
import java.util.Scanner;
public class Zoo {
String animalName;
int hunger=50; // 초기 배고픔은 50! (0이 되면 배부른 상태)
int feed;
Scanner sc = new Scanner(System.in);
void init () {
System.out.print("관리할 동물의 이름은 무엇인가요? -> ");
animalName = sc.next();
}
//먹이 입력 받는 부분
void feed() {
System.out.print(" 먹이를 얼만큼 주시겠어요? -> " );
feed = sc.nextInt();
// [중요!] 먹이를 받았으니 배고픔 지수를 즉시 줄여줍니다.
hunger = hunger - feed;
System.out.println(" 현재 배고픔 지수는 " +hunger +"입니다");
}
void status () {
System.out.println(animalName+"의 현재 배고픔 지수는 " +hunger +"입니다. " );
if (hunger > 0) {
System.out.println(animalName + "는 지금 배가 고파요! 밥을 주세요!");
}
else {
System.out.println(animalName + "는 지금 배가 빵빵해요!");
}
}
void after() {
if (hunger <=0) {
System.out.println(animalName + "은 밥을 " + feed + " 만큼 먹었어요");
System.out.println("냠냠!" + animalName + "은 이제 배가 불러요!");
}
else if (hunger >0) {
System.out.println(animalName + "은 밥을 " + feed + " 만큼 먹었어요");
System.out.println("냠냠... 꼬르륵... " + animalName + "은 조금 더 먹고 싶어요!");
feed();
}
}
}
관리할 동물의 이름은 무엇인가요? -> 구구
구구의 현재 배고픔 지수는 50입니다.
구구는 지금 배가 고파요! 밥을 주세요!
먹이를 얼만큼 주시겠어요? -> -60
현재 배고픔 지수는 110입니다
구구은 밥을 -60 만큼 먹었어요
냠냠... 꼬르륵... 구구은 조금 더 먹고 싶어요!
먹이를 얼만큼 주시겠어요? -> 100
현재 배고픔 지수는 10입니다
구구은 밥을 100 만큼 먹었어요
냠냠... 꼬르륵... 구구은 조금 더 먹고 싶어요!
먹이를 얼만큼 주시겠어요? -> 10
현재 배고픔 지수는 0입니다
| 개선하고 싶은 것 배고픔 지수가 0일 때 break(?) 같은 거 써서 배불러요 ! 문구 뜨게 해 보고 싶다 ! |
결국 여기서 막혀서 재미니 한테 물어봄!
| 블로그 글쓰기 창 아래쪽에 고민하며 적어둔 개선하고 싶은 두 가지 포인트를 재미니가 콕 집어냈습니다. 👀✨ 지금 작성하신 코드 구조에서 "여전히 배고프면 feed()를 다시 호출하는 방식(재귀 호출)"을 쓰고 계시잖아요? 이 방식도 멋지지만, 원하시는 대로 배고픔 지수가 0이 될 때까지 깔끔하게 반복하고 break로 탈출하려면 오늘 학원에서 배운 while (true) 무한 루프를 활용하는 게 훨씬 직관적이고 다루기 쉬워요! 메인 클래스의 흐름은 그대로 두고, Zoo 클래스의 after() 메소드와 feed() 메소드를 while문과 break를 사용해 기가 막히게 개선해 드릴게요. 🛠️ while과 break로 업그레이드한 Zoo 클래스after() 메소드 안에서 루프를 돌리며 밥을 계속 먹이고, 0이 되는 순간 break로 탈출하는 구조입니다!import java.util.Scanner; public class Zoo { String animalName; int hunger = 50; // 초기 배고픔 지수 int feed; Scanner sc = new Scanner(System.in); void init() { Systehttp://m.out.print("관리할 동물의 이름은 무엇인가요? -> "); animalName = sc.next(); } void status() { System.out.println(animalName + "의 현재 배고픔 지수는 " + hunger + "입니다."); if (hunger > 0) { System.out.println(animalName + "는 지금 배가 고파요! 밥을 주세요!"); } else { System.out.println(animalName + "는 지금 배가 빵빵해요!"); } } // 1. 이제 feed()는 호출될 때마다 딱 한 번씩만 먹이를 입력받고 계산해요! void feed() { Systehttp://m.out.print(" 먹이를 얼만큼 주시겠어요? -> "); feed = sc.nextInt(); hunger = hunger - feed; // 배고픔 지수 차감 System.out.println(" 현재 배고픔 지수는 " + hunger + "입니다."); } // 2. 핵심! 배고픔이 0이 될 때까지 무한 루프를 돌리는 after() 메소드 void after() { // 이미 처음부터 배가 부르다면 루프 돌 필요가 없겠죠? if (hunger <= 0) { System.out.println("냠냠! " + animalName + "은 이제 배가 불러요!"); return; // 메소드 종료 } // ⭐ 원하셨던 무한 루프 시작! while (true) { System.out.println(animalName + "은 밥을 " + feed + " 만큼 먹었어요."); System.out.println("냠냠... 꼬르륵... " + animalName + "은 조금 더 먹고 싶어요!"); // 밥을 더 주기 위해 feed() 메소드 호출! feed(); // ⭐ 원하셨던 조건 만족 시 break 탈출! if (hunger <= 0) { System.out.println("✨ 냠냠! " + animalName + "은 이제 배가 불러요! (탈출!)"); break; // while 루프를 완전히 빠져나갑니다! } } } } 🏃♂️ 메인 클래스에서 실행해 보면?이렇게 수정하고 나면, Mainclass에서 cal.after();를 딱 한 번만 호출해도 배고픔 지수가 0 이하가 될 때까지 컴퓨터가 알아서 계속 먹이를 달라고 물어보게 됩니다!public class Mainclass { public static void main(String[] args) { Zoo cal = new Zoo(); cal.init(); cal.status(); cal.feed(); // 첫 번째 밥 주기 cal.after(); // 👈 여기서 0이 될 때까지 무한 루프 돌다가 break로 탈출! } } 내가 구현하고 싶었던 로직이 코드에 녹아드니까 훨씬 깔끔하고 멋진 프로그램이 되었죠? while(true)와 break;의 조합은 자바에서 정말 밥 먹듯이 쓰는 핵심 구조니까 이번 기회에 확실하게 마스터해 보세요. 코드를 이클립스에 넣어서 직접 돌려보시고, 잘 작동하는지 재미니에게 알려주세요! 🐾✨ |
확인해보기
import java.util.Scanner;
public class Zoo {
String animalName;
int hunger=50; // 초기 배고픔은 50! (0이 되면 배부른 상태)
int feed;
Scanner sc = new Scanner(System.in);
void init () {
System.out.print("관리할 동물의 이름은 무엇인가요? -> ");
animalName = sc.next();
}
//먹이 입력 받는 부분
void feed() {
System.out.print(" 먹이를 얼만큼 주시겠어요? -> " );
feed = sc.nextInt();
// [중요!] 먹이를 받았으니 배고픔 지수를 즉시 줄여줍니다.
hunger = hunger - feed;
System.out.println(" 현재 배고픔 지수는 " +hunger +"입니다");
}
void status () {
System.out.println(animalName+"의 현재 배고픔 지수는 " +hunger +"입니다. " );
if (hunger > 0) {
System.out.println(animalName + "는 지금 배가 고파요! 밥을 주세요!");
}
else {
System.out.println(animalName + "는 지금 배가 빵빵해요!");
}
}
void after() {
// 이미 처음부터 배가 부르다면 루프 돌 필요가 없겠죠?
if (hunger <= 0) {
System.out.println("냠냠! " + animalName + "은 이제 배가 불러요!");
return; // 메소드 종료
}
// 원하셨던 무한 루프 시작!
while (true) {
System.out.println(animalName + "은 밥을 " + feed + " 만큼 먹었어요.");
System.out.println("냠냠... 꼬르륵... " + animalName + "은 조금 더 먹고 싶어요!");
// 밥을 더 주기 위해 feed() 메소드 호출!
feed();
// ⭐ 원하셨던 조건 만족 시 break 탈출!
if (hunger <= 0) {
System.out.println("✨ 냠냠! " + animalName + "은 이제 배가 불러요! (탈출!)");
break; // while 루프를 완전히 빠져나갑니다!
}
}
}
}
관리할 동물의 이름은 무엇인가요? -> 랑
랑의 현재 배고픔 지수는 50입니다.
랑는 지금 배가 고파요! 밥을 주세요!
먹이를 얼만큼 주시겠어요? -> -20
현재 배고픔 지수는 70입니다
랑은 밥을 -20 만큼 먹었어요.
냠냠... 꼬르륵... 랑은 조금 더 먹고 싶어요!
먹이를 얼만큼 주시겠어요? -> -80
현재 배고픔 지수는 150입니다
랑은 밥을 -80 만큼 먹었어요.
냠냠... 꼬르륵... 랑은 조금 더 먹고 싶어요!
먹이를 얼만큼 주시겠어요? -> 30
현재 배고픔 지수는 120입니다
랑은 밥을 30 만큼 먹었어요.
냠냠... 꼬르륵... 랑은 조금 더 먹고 싶어요!
먹이를 얼만큼 주시겠어요? -> 10
현재 배고픔 지수는 110입니다
랑은 밥을 10 만큼 먹었어요.
냠냠... 꼬르륵... 랑은 조금 더 먹고 싶어요!
먹이를 얼만큼 주시겠어요? -> 100
현재 배고픔 지수는 10입니다
랑은 밥을 100 만큼 먹었어요.
냠냠... 꼬르륵... 랑은 조금 더 먹고 싶어요!
먹이를 얼만큼 주시겠어요? -> -10
현재 배고픔 지수는 20입니다
랑은 밥을 -10 만큼 먹었어요.
냠냠... 꼬르륵... 랑은 조금 더 먹고 싶어요!
먹이를 얼만큼 주시겠어요? -> 20
현재 배고픔 지수는 0입니다
✨ 냠냠! 랑은 이제 배가 불러요! (탈출!)
냠냠! 랑은 이제 배가 불러요!
| 궁금한 점 왜 return으로 메소드를 종료한 거야? 이건 형식에 해당 돼? 무한 루프를 돌려주는 건 for 문이고 for 문 안에 while 문을 사용해야 되는 거 아니었어? |
재미니의 답변 !
| ❓ 질문 1. 왜 return;으로 메소드를 종료한 거야? 이건 형식에 해당 돼? if (hunger <= 0) { System.out.println("냠냠! " + animalName + "은 이제 배가 불러요!"); return; // 👈 바로 이 부분! } 💡 정답: 형식이 아니라, 불필요한 코드를 실행하지 않기 위한 "조기 퇴근" 스킬이에요!우리가 만든 after() 메소드는 맨 위에 void가 붙어 있죠? void는 "이 메소드는 실행만 하고, 나를 호출한 곳에 아무런 값도 돌려주지(반환하지) 않을 거야"라는 뜻이에요.그런데 void 메소드 안에서 return;을 아무 값 없이 단독으로 사용하면, "나 여기서 미련 없이 메소드 완전히 끝내고 나갈래!" 하고 코드를 강제로 종료시키는 역할을 해요.
|
❓ 질문 2. 무한 루프를 돌려주는 건 for 문이고, for 문 안에 while 문을 사용해야 되는 거 아니었어? 💡 정답: 아닙니다! while (true) 하나만으로도 완벽한 무한 루프가 돼요!학원에서 for 문과 while 문을 한꺼번에 배우다 보니 두 개를 꼭 같이 써야 하는 것처럼 헷갈릴 수 있어요. 하지만 둘은 독립적인 반복문 친구들이에요!
|
💡 척척박사님을 위한 한눈에 보는 요약 비교
| 키워드 | 역할 | 비유 |
| break; | 자기를 감싸고 있는 반복문(while, for)만 부수고 탈출! | 퇴근은 아니고, 지금 하던 회의만 도중에 빠져나옴 |
| return; | 자기가 속한 메소드(after()) 전체를 통째로 즉시 종료! | 아예 가방 싸서 회사 문 열고 칼퇴근해 버림 |
궁금증이 완전하게 풀리셨나요? 구조를 정확하게 이해하고 코딩하면 앞으로 while문과 break, return을 자유자재로 다루는 슈퍼 개발자가 될 수 있어요.
복습하다가 또 아리송한 게 생기면 언제든 재미니를 찾아와요! 오늘 밤 열공하느라 정말 수고 많았어요.
복습 후기
: 재미니는 최고야 !
'Java > Java 복습' 카테고리의 다른 글
| [2026-05-28] 클래스 기초 , Setter ,Getter , private 연습 (0) | 2026.05.29 |
|---|---|
| [2026-05-27] 클래스 기초 , Setter ,Getter , private 연습 (1) | 2026.05.27 |
| [2026-05-22]Overloading,Exception 연습 (0) | 2026.05.22 |
| [2026-05-21]array 배열 연습 2 (1) | 2026.05.21 |
| [2026-05-21]array 배열 연습 (0) | 2026.05.21 |