Language/Java

메소드

느낌표 공장장 2021. 4. 28. 17:34

01) main 메소드

public class HelloJava {
    public static void main(String[] args) {
        System.out.println("Hello, Java");
    }
}

 


02) main 메소드의 구조

1. public static : 여기서는 다루지 않고, 지금은 일단 메소드 앞에 "public static"을 적어야 한다고 기억하자 !

2. void : 메소드가 되돌려 주는 값, 즉 반환값의 자료형을 명시한다. (void는 메소드가 아무 값도 되돌려주지 않을 때 사용)

3. main : 메소드의 이름이다. 

4. (String[] args) : 메소드가 받을 수 있는 입력값을 정의한 것이다. 입력값을 필요로 하지 않는 메소드는 이를 생략할 수 있으며, 필요에 따라 입력값이 여러 개가 될 수 있다.

 

메소드의 네가지 형태

1. 입력값과 반환값이 모두 없는 경우

2. 입력값만 존재하는 경우

3. 반환값만 존재하는 경우

4. 입력값과 반환값이 모두 존재하는 경우


03) 메소드 정의와 메소드 호출

public class FunctionExample {

    public static void main(String[] args) {
        sayHello();
    }

    public static void sayHello() {
        System.out.println("Hello.");
    }
}

이렇듯 메소드라는 것은 코드를 중괄호로 묶어놓고 이름을 붙여놓은 것이다.

 

 

< 입력값이 존재하는 메소드 정의 >

public class FunctionExample {

    public static void main(String[] args) {
        sayHelloTo("Java");
    }

    public static void sayHelloTo(String name) {
        System.out.println("Hello, " + name);
    }
}


04) 매개변수

< 매개변수로 입력되는 데이터의 흐름 >


05) 여러 개의 매개변수

✔︎ 메소드의 인자를 매개변수라고 하는데, 이는 여러개가 될 수도 있다.

public class FunctionExample {

    public static void main(String[] args) {
        printSum(5, 8);
        // sum이라는 메소드가 값을 반환하기 때문에 이 값을 변수로 받아야함
        int result = sum(4, 6);
        System.out.println(result);
    }

    // 두 정수 더한 값을 반환하는 메소드 정의
    // 반환타입이 정수이기 때문에 int 넣어준다(void X)
    public static int sum(int a, int b) {
        return a + b;
    }

   // 두 수의 합을 출력하는 메소드 정의
    // 1 + 2 = 3의 형태로 덧셈을 출력한다.
    public static void printSum(int a, int b) {
        System.out.println(a + "+" + b + "=" + (a+b));
    }
}

 

두 수의 합을 출력하는 메소드에서 (a+b) 부분을 메소드를 사용하여 sum(a, b)로 바꿔 쓸 수 있다. 

public static void printSum(int a, int b) {
        System.out.println(a + "+" + b + "=" + sum(a, b));
    }

 

 

< 배열을 이용한 메소드 >

public class FunctionExample {

    public static void main(String[] args) {
        int[] sumAndProduct = addAndMultiply(2, 3);
        System.out.println("sum: " + sumAndProduct[0]);
        System.out.println("product: " + sumAndProduct[1]);
    }

    // 같은 타입의 값을 여러개 반환해보기
    // 정수형 배열을 반환값으로 삼기
    // 두 정수를 더한 값과 곱한 값을 반환하는 메소드 정의.
    public static int[] addAndMultiply(int a, int b) {
        int sum = a + b;
        int product = a * b;

        int[] result = {sum, product};

        return result;
    }
}

배열을 이용하는 방법은 순서대로 어떤 값이 들어가는지 외워두고 사용해야 하기 때문에 잘 사용하지 않는다.

 


06) 반환값

public class FunctionExample {

    public static void main(String[] args) {
        sayHola("자바");
    }

    // return에 대해 더 알아보기
    // sayHelloTo와 동일한 기능을 하는 메소드 정의
    public static void sayHola(String name) {
        if (name.equals("바보")) {
            System.out.println("바르고 고운말을 사용해주세요.");
        } else {
            System.out.println(name + "님, 안녕하세요?");
        }
    }
}

여기서 else문을 없애게 된다면 

"바보님, 안녕하세요?"까지 실행되는 것을 알 수 있다.

그런데 여기에서 return 키워드를 사용하게 되면 이 메소드의 실행을 중단시킬 수 있다.

public class FunctionExample {

    public static void main(String[] args) {
        sayHola("바보");
    }

    public static void sayHola(String name) {
        if (name.equals("바보")) {
            System.out.println("바르고 고운말을 사용해주세요.");
            // return 키워드를 이용해 메소드의 실행 중단 시키기
            return;
        }
        System.out.println(name + "님, 안녕하세요?");
    }
}

 이처럼 return은 중간에서 빠져나갈 수 있는 기능을 제공하는데, 이는 반환값이 없는 경우이기 때문이다.

 

만약 반환값이 있는 경우라면, 중간에 메소드를 빠져나간다고 하더라도 꼭 반환타입과 일치하는 타입의 값을 반환해야 한다.

메소드가 종료되었을 때 무조건 어떤 값을 반환해야한다. 

public class FunctionExample {

    public static void main(String[] args) {
        boolean saidHola = sayHola("바보");
    }

    /*
    인사를 했다면 true 를 반환하고
    그렇지 않다면 false를 반환한다.
     */
    public static boolean sayHola(String name) {
        if (name.equals("바보")) {
            System.out.println("바르고 고운말을 사용해주세요.");
            return false;
        }
        System.out.println(name + "님, 안녕하세요?");
        return true;
    }
}

 


07) 멤버변수(전역변수)와 지역변수

* 자바에서는 전역변수를 제공하지 않기 때문에 멤버변수라는 용어가 더 올바르다

위의 코드는 조금 비효율적임을 알 수 있다.

 

밑의 두 변수를 scanner를 인자로 받는 메소드로 변경하고, echoSomeInputs()에서 scanner를 한번만 생성해서 각 메소드들로 전달해주게 된다. 하지만 이 방법도 조금 불편한 점이 발생하게 된다. 매 메소드 호출시마다 스캐너를 인자로 입력해줘야 한다는 것이다.

 

이를 해결하기 위해 멤버변수라는 것을 이용할 수 있다.

멤버변수는 ① 처럼 메소드 바깥에서 선언된 변수이다.

변수들은 자신이 속한 메소드 안에서만 사용될 수 있는데,  여기 scanner(①)는 각 메소드들의 중괄호 블록보다 바깥에서 선언되었기 때문에 각각의 메소드 안에서도 사용할 수 있는 것이다. 

 

import java.util.Random;
import java.util.Scanner;

public class UpAndDownWithMethod {

    // 랜덤하게 생성된 숫자를 전역에서 사용하기 위해 멤버변수로 변수 선언
    public static int randomNumber;
    /*
    scanner와 같이 사용자 입력을 받는 인터페이스는
    프로그램이 실행될때부터 한번만 생성해놓고 계속해서 재사용할 수 있는 것이므로
    멤버변수로 선언해준다.
     */
    public static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        // random number 초기화
        Random random = new Random();
        randomNumber = random.nextInt(256);

        // 시도 횟수 변수
        int attempt = 0;

        while (attempt < 8) {
            boolean isCorrect = play();

            if (isCorrect) {
                break;
            }

            attempt = attempt + 1;
            System.out.println(attempt + "회 시도하였습니다.");
        }

        System.out.println("게임을 종료합니다.");
    }

    public static boolean play() {
        System.out.println("숫자를 입력하세요.");
        // 사용자로부터 숫자 입력받기
        int input = scanner.nextInt();

        if (input == randomNumber) {
            System.out.println("정답입니다.");
            return true;
        } else if (input > randomNumber) {
            System.out.println("더 작은 값입니다.");
        } else {
            System.out.println("더 큰 값입니다.");
        }
        // else if와 else에 각각 사용해주지 않고 종료부분에 한번만 사용해줄 수 있다.
        return false;
    }
}

이렇게 프로그램의 세세한 로직은 별개의 메소드로 빼고, 메인 메소드에서는 전체적인 프로그램의 흐름만 관리하도록 만들면 조금 더 흐름은 파악하기 쉽고, 관리하기 용이한 코드를 작성할 수 있다.

 

 

 

 

유투브 "초간단 자바"님 영상을 통해 공부한 내용입니다 !
www.youtube.com/watch?v=uU_3yofIyNo

'Language > Java' 카테고리의 다른 글

static import  (0) 2021.06.05
  (0) 2021.04.29
파일 읽고 쓰기  (0) 2021.04.02
숫자 맞추기 게임 만들기  (0) 2021.03.31
배열  (0) 2021.03.31