
이 프로그램은 사용자가 입력한 숫자가 무작위로 생성된 숫자와 일치하는지 확인하여 행운의 날인지 아닌지를 알려주는 기능을 가지고 있어요. 간단히 말하면, "행운의 숫자 맞추기 게임"이라고 할 수 있어요.
복잡한 과정 출력:
사용자 입력 받기:
행운의 숫자 생성 및 비교:
main 메서드가 실행됩니다.complicatedProgram 메서드가 호출되며, 복잡한 과정이 시작됨을 알리는 메시지가 출력됩니다.이 프로그램은 사용자가 입력한 숫자가 무작위로 생성된 숫자와 일치하는지 확인하여, 행운인지 불운인지를 알려주는 간단한 게임입니다.
package Fortune; //Fortune이라는 이름의 패키지(파일 모음) 안에 있어요.
import java.util.Random; // 무작위 숫자를 만들기 위한 도구를 가져와요.
import java.util.Scanner; // 사용자가 입력한 내용을 받기 위한 도구를 가져와요.
public class Ex5Main { // Ex5Main이라는 이름의 클래스를 만들어요.
public static void complicatedProgram(Fortunee fortune){
//complicatedProgram이라는 이름의 함수를 만들어요.
//**이 함수는 Fortunee라는 타입의 변수를 받아요.**
System.out.println("복잡한 과정 시작");
System.out.println("복잡한 과정 종료 후, 원하는 기능 실행");
** fortune.run(); //fortune이라는 변수의 run 함수를 실행해요.**
System.out.println("다시 복잡한 과정 시작");
System.out.println("복잡한 과정 종료 후 프로그램 종료");
}
public static void main(String[] args){
//프로그램이 처음 시작되는 main함수를 만들어요.
complicatedProgram(**new Fortunee(){
//complicatedProgram 함수를 호출해요.
//여기서는 새로운 Fortunee라는 것을 만들어줘요.
@Override
//다음에 나오는 함수가 Fortunee 인터페이스에서 정의된 함수임을 표시해요.
public void run() {
//run이라는 이름의 함수를 만들어요.
Random random = new Random();
//무작위 숫자를 만드는 도구를 새로 만들어요.
Scanner scanner = new Scanner(System.in);**
//사용자가 입력한 내용을 받는 도구를 새로 만들어요.
System.out.print("오늘의 행운 번호를 입력하세요 : ");
int input = scanner.nextInt();
//사용자가 입려간 숫자를 읽어서 input이라는 변수에 저장해요.
for(int i = 0; i < 3; i++) {
// 0부터 2까지 3번 반복.
int lucky = random.nextInt(100);
// 0부터 99까지의 무작위 숫자를 만들어 lucky라는 변수에 저장.
if (lucky == input) {
// 만약 lucky와 input이 같다면
System.out.println("와우! 완전한 행운의 날입니다. 맞춘 행운의 번호는 " + input + " 입니다.");
return;
//함수를 끝내요.
}
}
System.out.println("입력하신 번호는 불운의 번호이니 오늘은 피하세요. :) ");
}
});
}
}
package Fortune; // Fortune이라는 이름의 패키지(파일 모음) 안에 있어요.
public **interface** Fortunee { // Fortunee라는 이름의 인터페이스(약속)을 만들어요.
void run(); // run이라는 이름의 함수를 약속해요. 이 함수를 꼭 만들어야 해요.
}
for문에서의 return 키워드는 함수나 메서드의 실행을 중단하고, 해당 함수나 메서드를 호출한 곳으로 즉시 돌아가게 하는 역할을 한다.
return값은 반환할 수도 있고, 반환하지 않을 수도 있다.
for문 안에서 사용되는 경우, 반복문이 더 이상 실행되지 않고 함수나 메서드가 종료된다.
public class Example {
public static void main(String[] args) {
checkNumbers();
}
public static **void **checkNumbers() {
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
if (number == 3) {
System.out.println("Found 3, stopping the check.");
**return; **// **여기서 함수가 종료됩니다.**
}
System.out.println("Checking number: " + number);
}
System.out.println("This line will not be printed if 3 is found.");
}
}
위 코드에서 checkNumbers 함수는 숫자 배열을 순회하며 숫자를 확인합니다. 숫자가 3이면, “Found 3, stopping the check.”
메시지를 출력하고 return 키워드를 사용하여 함수가 종료됩니다.
3을 찾은 후에는 “This line will not be printed if 3 is found.” 메시지는 출력되지 않습니다.
public class Example {
public static void main(String[] args) {
int result = findFirstEvenNumber();
System.out.println("The first even number is: " + result);
}
public static int findFirstEvenNumber() {
int[] numbers = {1, 3, 5, 8, 10};
for (int number : numbers) {
if (number % 2 == 0) {
return number; // 첫 번째 짝수를 찾으면 반환합니다.
}
}
**return -1; // 짝수를 찾지 못하면 -1을 반환합니다.**
}
}
위 코드에서 findFirstEvenNumber 함수는 숫자 배열을 순회하며 첫 번째 짝수를 찾습니다.
짝수를 찾으면 그 숫자를 return하여 반환합니다.
배열에 짝수가 없다면 -1을 반환합니다.
void와 return의 관계를 이해하는게 중요.
void는 함수가 아무런 값을 반환하지 않느다는 것을 의미.
return 키워드는 함수의 실행을 종료하고 호출한 곳으로 돌아가게 한다.
public class Example {
public static **void** main(String[] args) {
greet(); // greet 함수를 호출합니다.
}
public static void greet() {
System.out.println("Hello, world!"); // "Hello, world!"를 출력합니다.
//** 여기서 함수가 자동으로 종료됩니다.**
}
}
public class Example {
public static **void** main(String[] args) {
greet(); // greet 함수를 호출합니다.
}
public static void greet() {
System.out.println("Hello, world!"); // "Hello, world!"를 출력합니다.
**return; // 함수의 실행을 종료합니다.
// 이 뒤의 코드는 실행되지 않습니다.**
}
}
위 두 예시는 둘 다 정상적으로 작동합니다.
두 번째 예시에서는 return 키워드를 사용하여 명시적으로 함수의 실행을 종료하고 있습니다.
하지만 void 함수에서는 return을 생략해도 함수가 끝까지 실행된 후 자동으로 종료됩니다.
public class Example {
public static **void **main(String[] args) **{**
int sum = add(5, 3); // add 함수를 호출하고, 반환된 값을 sum에 저장합니다.
System.out.println("Sum: " + sum); // "Sum: 8"을 출력합니다.
}
public static int add(int a, int b) {
**return a + b;** // 두 숫자의 합을 반환합니다.
**}**
}
위 예시에서 add 함수는 두 정수를 더한 값을 반환합니다. 반환된 값은 main 함수에서 사용됩니다.
이렇게 void함수와 return 키워드의 관계를 이해하면, 함수의 동작 방식을 보다 명확하게 이해할 수 있다.
인터페이스는 마치 여러 종류의 장난감이 있을 때, 그 장난감들이 모두 같은 방식으로 작동하도록 약속하는 것과 같ㅇ아요. 인터페이스는 "이 장난감은 이런 버튼을 눌러야 해"라고 말해주는 설명서 같은 역할을 해요.
인터페이스는 어떤 클래스(장난감)가 반드시 가져야 하는 기능(버튼)을 정해요.
다양한 클래스(장난감)가 같은 인터페이스를 구현하면, 우리는 그 클래스들을 같은 방법으로 사용할수 있다. 예를 들어, 여러 종류의 로봇 장난감이 모두 "움직여!"라는 명령을 이해할 수 있게 해준다.
여러 클래스가 같은 기능을 가져야 할 때:
예를 들어, 다양한 동물 클래스가 모두 "소리 내기"기능을 가져야 한다면 인터페이스를 사용할 수 있다.
프로젝트가 커지면서 확장될 때:
새로운 기능이나 클래스를 추가할 때,기존 코드를 변경하지 않고 쉽게 확장할 수 있다.
다형성을 활용하고 싶을 때:
서로 다른 클래스의 객체들을 같은 방식으로 처리하고 싶을 때 유용.
// 인터페이스 정의
public **interface** Animal {
void **makeSound()**; // **모든** 동물들은 이 기능을 가져야 해요.
}
// Dog 클래스가 Animal 인터페이스를 구현
public class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("멍멍!");
}
}
// Cat 클래스가 Animal 인터페이스를 구현
public class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("야옹!");
}
}
// 사용 예시
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog(); // Dog 객체를 Animal 타입으로 사용
Animal myCat = new Cat(); // Cat 객체를 Animal 타입으로 사용
myDog.**makeSound()**;
// "멍멍!" 출력
myCat.**makeSound()**; // "야옹!" 출력
}
}
## 유의점
1. 모든 메서드 구현 :
인터페이스를 구현하는 크래스는 인터페이스에 정의된 모든 메서드를 구현해야 한다.
2. 일관성 유지 :
인터페이스를 사용하여 코드의 일관성을 유지하고, 동일한 기능을 제공하도록 해야 한다.
3. 과도한 사용 피하기 :
필요하지 않은 곳에 인터페이스를 사용하면 오히려 코드가 복잡해질 수 있다. 꼭 필요한 경우에만 사용 가능.
인터페이스는 프로그램이 더 유연하고 확장 가능하게 만들어주는 중요한 도구.
올바르게 사용하면 큰 장점을 누릴 수 있지만, 과도하게 사용하면 복잡해질수 있으니 적절하게 사용하는게 중요.
------------------------------------------------------------------------
public static void complicatedProgram(Fortunee fortune){
}
## <매개변수(parameter)의 역할>
(Fortunee fortune)는 complicatedProgram 함수의 매개변수이다.
매개변수는 함수가 호출될 때 전달되는 값을 받기 위한 변수이다.
#### 1. 타입 지정:
- Fortunee는 매개변수 fortune의 타이니다. 즉, fortune은 Fortunee 인터페이스를 구현한 객체여야 한다.
- 이는 complicatedProgram함수가 Fortunee 타입의 객체를 인자로 받아서 사용할 것임을 나타낸다.
#### 2. 변수 이름:
- fortune은 매개변수의 이름이다. 이 이름을 사용하여 함수 내에서 전달된 객체를 참조할 수 있다.
## <매개변수의 역할 예시>
함수를 호출할 때 매개변수로 전달된 객체를 사용하여 함수 내에서 특정 작업을 수행한다.
예시 : complicatedProgram 함수 호출
complicatedProgram(new Fortunee() {
@Override
public void run() {
System.out.println("오늘의 행운의 날입니다.");
}
});
위 예시에서 complicatedProgram 함수는 Fortunee 인터페이스를 구현한 익명 클래스를 인자로 받는다. 이 익명 클래스는 run 메서드를 구현하고 있다.
예시 : complicatedProgram 함수 내 동작
public static void complicatedProgram(Fortunee fortune) {
System.out.println("복잡한 과정 시작");
System.out.println("복잡한 과정 종료 후, 원하는 기능 실행");
fortune.run(); // 전달된 객체의 run 메서드를 호출
System.out.println("다시 복잡한 과정 시작");
System.out.println("복잡한 과정 종료 후 프로그램 종료");
}
위 함수는 fortune 매개변수를 사용하여 다음과 같은 작업을 수행한다.
1. "복잡한 과정 시작"이라는 메시지를 출력.
2. "복잡한 과정 종료 후, 원하는 기능 실행"이라는 메시지를 출력.
3. fortune.run()을 호출하여 fortune객체의 run메서드를 실행한다. 이 때 전달된 객체가 실제로 run메서드에서 어떤 작업을 수행하는지에 따라 동작이 결정됨.
4. "다시 복잡한 과정 시작"이라는 메시지를 출력.
5. "복잡한 과정 종료 후 프로그램 종료"라는 메시지를 출력.
#### 요약
• 괄호 안에 있는 Fortunee fortune은 함수가 호출될 때 전달되는 Fortunee 타입의 객체를 받기 위한 매개변수입니다.
• 이 매개변수를 사용하여 함수 내에서 전달된 객체의 run 메서드를 호출하고, 그 결과로 특정 작업을 수행합니다.