이 프로그램은 사용자가 입력한 숫자가 무작위로 생성된 숫자와 일치하는지 확인하여 행운의 날인지 아닌지를 알려주는 기능을 가지고 있어요. 간단히 말하면, "행운의 숫자 맞추기 게임"이라고 할 수 있어요.

주요 기능

  1. 복잡한 과정 출력:

    • 프로그램은 "복잡한 과정 시작"과 "복잡한 과정 종료 후, 원하는 기능 실행" 등의 메시지를 출력하면서 복잡한 과정을 시뮬레이션합니다.
  2. 사용자 입력 받기:

    • 프로그램은 사용자에게 행운의 숫자를 입력하도록 요청합니다. 사용자가 숫자를 입력하면 그 숫자를 저장합니다.
  3. 행운의 숫자 생성 및 비교:

    • 프로그램은 무작위로 0부터 99 사이의 숫자를 세 번 생성합니다.
    • 생성된 숫자 중 하나라도 사용자가 입력한 숫자와 일치하면, "와우! 완전한 행운의 날입니다. 맞춘 행운의 번호는 [입력한 번호] 입니다."라는 메시지를 출력합니다.
    • 일치하지 않으면, "입력하신 번호는 불운의 번호이니 오늘은 피하세요. :)"라는 메시지를 출력합니다.

프로그램 동작 과정

  1. 프로그램이 시작되면, main 메서드가 실행됩니다.
  2. complicatedProgram 메서드가 호출되며, 복잡한 과정이 시작됨을 알리는 메시지가 출력됩니다.
  3. 사용자는 행운의 숫자를 입력합니다.
  4. 프로그램은 세 번의 무작위 숫자를 생성하고, 각각의 숫자가 사용자 입력과 일치하는지 확인합니다.
  5. 일치하는 숫자가 있으면 행운의 메시지를, 없으면 불운의 메시지를 출력합니다.
  6. 복잡한 과정이 다시 시작되고 종료됨을 알리는 메시지가 출력됩니다.
  7. 프로그램이 종료됩니다.

예시

  1. 프로그램 시작:
    • "복잡한 과정 시작"
    • "복잡한 과정 종료 후, 원하는 기능 실행"
  2. 사용자 입력:
    • "오늘의 행운 번호를 입력하세요 : " (사용자가 23을 입력)
  3. 무작위 숫자 생성 및 비교:
    • 무작위 숫자: 45, 23, 67
    • 사용자 입력(23)과 두 번째 무작위 숫자(23)가 일치
    • 출력: "와우! 완전한 행운의 날입니다. 맞춘 행운의 번호는 23 입니다."
  4. 복잡한 과정 종료:
    • "다시 복잡한 과정 시작"
    • "복잡한 과정 종료 후 프로그램 종료"

이 프로그램은 사용자가 입력한 숫자가 무작위로 생성된 숫자와 일치하는지 확인하여, 행운인지 불운인지를 알려주는 간단한 게임입니다.


Ex5Main.java

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("입력하신 번호는 불운의 번호이니 오늘은 피하세요. :) ");
           }
       });
   }
}

Fortunee.java

package Fortune; // Fortune이라는 이름의 패키지(파일 모음) 안에 있어요.

public **interface** Fortunee { // Fortunee라는 이름의 인터페이스(약속)을 만들어요.
     void run(); // run이라는 이름의 함수를 약속해요. 이 함수를 꼭 만들어야 해요.
}

for문에서의 return

for문에서의 return 키워드는 함수나 메서드의 실행을 중단하고, 해당 함수나 메서드를 호출한 곳으로 즉시 돌아가게 하는 역할을 한다.
return값은 반환할 수도 있고, 반환하지 않을 수도 있다.
for문 안에서 사용되는 경우, 반복문이 더 이상 실행되지 않고 함수나 메서드가 종료된다.

활용법

  1. 조기 종료:
    • for 문에서 특정 조건을 만족할 때 함수의 실행을 중단하고 즉시 종료하고 싶을 때 사용합니다.
    • 예를 들어, 원하는 값을 찾았을 때 더 이상 반복할 필요가 없을 경우.
  2. 조건에 따라 다른 값을 반환:
    • 반복문을 순회하면서 특정 조건을 만족하는 값을 찾았을 때 그 값을 반환합니다.

return의 기능

  1. 반복문 중단 : for문 안에서 return을 만나면, 반복문은 즉시 중단됨
  2. 함수 종료 : 함수는 즉시 종료되고, 호출한 곳으로 돌아감.
  3. 값 반환 : return 키워드 뒤에 값이 있으면 그 값을 반환한다. 그렇지 않으면 아무 값도 반환하지 않는다.

유의점

  1. 복잡성 증가:
    • for 문 안에서 return을 사용하는 경우, 함수의 흐름이 중간에 끊기기 때문에 코드가 복잡해질 수 있습니다. 적절히 주석을 달아 가독성을 유지해야 합니다.
    1. 코드 실행 중단:
      • return 키워드 이후의 코드는 실행되지 않으므로, 의도치 않게 중요한 코드가 실행되지 않을 수 있습니다.
    2. 적절한 사용:
      • return 키워드는 함수의 논리에 맞게 사용해야 합니다. 무분별한 사용은 코드의 가독성을 해칠 수 있습니다.

예시

값 반환 없이 return

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.” 메시지는 출력되지 않습니다.

값 반환과 함께 return

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을 반환합니다.

요약

• return은 함수나 메서드를 즉시 종료시키고 호출한 곳으로 돌아가게 합니다.

• for 문 안에서 사용하면 반복문을 중단시키고 함수를 종료시킵니다.

• return은 값을 반환할 수도 있고, 반환하지 않을 수도 있습니다.

• return을 사용할 때는 코드의 흐름과 가독성을 고려하여 적절하게 사용해야 합니다.


void와 return의 관계

void와 return의 관계를 이해하는게 중요.
void는 함수가 아무런 값을 반환하지 않느다는 것을 의미.
return 키워드는 함수의 실행을 종료하고 호출한 곳으로 돌아가게 한다.

void와 return의 관계

  1. void 함수란?
  • void함수는 반환값이 없는 함수. 즉,함수가 작업을 수행하지만, 결과값을 호출한 곳에 돌려주지 않는다.
  • void함수에서는 return키워드를 사용할 수 있지만, return 뒤에 값을 쓸 수는 없다.
  1. void함수에서의 return사용
  • void함수에서 return을 사용하는 것은 함수의 실행을 즉시 종료시키는 역할을 한다.
  • 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!"를 출력합니다.
        //** 여기서 함수가 자동으로 종료됩니다.**
    }
}

void 함수에서 return 사용

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 함수에서 사용됩니다.

요약

  1. void함수는 반환값이 없는 함수. 함수가 작업을 수행하지만 결과를 호출한 곳에 돌려주지 않는다.
  2. return키워드는 함수의 실행을 종료하고 호출한 곳으로 돌아가게 한다. void 함수에서는 return 뒤에 값을 쓸 수 없다.
  3. void함수에서도 return을 사용할 수 있지만, 이는 함수의 실행을 즉시 종료하기 위한 것이다.
  4. 반환값이 있는 함수는 return 키워드를 사용하여 값을 호출한 곳에 돌려준다.

이렇게 void함수와 return 키워드의 관계를 이해하면, 함수의 동작 방식을 보다 명확하게 이해할 수 있다.


인터페이스란?

인터페이스는 마치 여러 종류의 장난감이 있을 때, 그 장난감들이 모두 같은 방식으로 작동하도록 약속하는 것과 같ㅇ아요. 인터페이스는 "이 장난감은 이런 버튼을 눌러야 해"라고 말해주는 설명서 같은 역할을 해요.

인터페이스의 기능

1. 약속 만들기 :

인터페이스는 어떤 클래스(장난감)가 반드시 가져야 하는 기능(버튼)을 정해요.

2. 공통 사용 :

다양한 클래스(장난감)가 같은 인터페이스를 구현하면, 우리는 그 클래스들을 같은 방법으로 사용할수 있다. 예를 들어, 여러 종류의 로봇 장난감이 모두 "움직여!"라는 명령을 이해할 수 있게 해준다.

인터페이스의 장단점

장점 :

  1. 유연성: 여러 클래스가 같은 인터페이스를 구현한 수 있어서 다양한 종류의 객체를 같은 방법으로 사용 가능
  2. 확장성 : 새로운 클래스가 기존 인터페이스를 구현하며, 기존 코드를 변경하지 않고도 새로운 기능을 추가 가능.
  3. 다형성 : 인터페이스를 사용하면, 서로 다른 클래스의 객체들을 같은 인터페이스 타입으로 처리 가능. 예를 등ㄹ어 다양한 종류의 동물들이 모두 "소리 내기 " 기능을 갖게 할 수 있다.

단점 :

  1. 추가 코드 작성 : 인터페이스를 구현하기 위해 추가적인 코드 작성을 해야 한다.
  2. 강제성 : 인터페이스에 정의된 모든 메서드를 반드시 구현해야 한다.

언제 인터페이스를 사용하나?

  1. 여러 클래스가 같은 기능을 가져야 할 때:
    예를 들어, 다양한 동물 클래스가 모두 "소리 내기"기능을 가져야 한다면 인터페이스를 사용할 수 있다.

  2. 프로젝트가 커지면서 확장될 때:
    새로운 기능이나 클래스를 추가할 때,기존 코드를 변경하지 않고 쉽게 확장할 수 있다.

  3. 다형성을 활용하고 싶을 때:
    서로 다른 클래스의 객체들을 같은 방식으로 처리하고 싶을 때 유용.

    // 인터페이스 정의
    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 메서드를 호출하고, 그 결과로 특정 작업을 수행합니다.

0개의 댓글