처음부터 차근차근

[Java] Method 본문

Language/Java

[Java] Method

HangJu_95 2023. 12. 15. 18:15
728x90

Javascript에서 자주 사용하는 함수, 그러나 Java는 Class 기반 언어입니다.

어떻게 함수를 사용할 수 있을까요??

메서드를 사용한다.

자바에서는 함수 대신 메서드를 사용합니다.

(주관적 생각이지만, 자바는 Class 기반이기 때문에 메서드만 쓸 수 있는게 아닐까..)

 

간단한 예시를 하나 만들어봤습니다.

package method;

public class Method1Ref {
    public static void main(String[] args) {
        int sum1 = add(5, 10);
        System.out.println("결과1 출력:" + sum1);
        int sum2 = add(15, 20);
        System.out.println("결과2 출력:" + sum2);
    }
    //add 메서드
    public static int add(int a, int b) {
        System.out.println(a + "+" + b + " 연산 수행");
        int sum = a + b;
        return sum;
    }
}

여기서 add 메서드는 간단하게 덧셈을 해주는 메서드입니다.

메서드 구조 분석

메서드는 크게 선언부분과 본문 부분으로 나옵니다.

제어자 반환타입 메서드이름(매개변수 목록) {
	메서드 본문
}

 

  • 메서드 본문
    • 제어자(Modifier) : public, static과 같은 부분입니다. 제어자는 다음시간에 입력하며, 메서드를 함수처럼 이용하고 싶다면 public static키워드를 항상 적자.
    • 반환타입(Return Type) : 메서드가 실행된 후 반환하는 데이터의 타입을 지정한다. 만약 메서드가 값을 반환하지 않는 경우, 없다는 뜻의 void를 사용해야 한다.
    • 메서드 이름 : 메서드의 이름이며, 변수처럼 사용할 수 있다.
    • 매개변수(parameter) : 입력 값으로, 메서드 내부에서 사용할 수 있는 변수입니다. 매개변수는 옵션이며, 필요없을 경우 적지 않아도 무방하다.
  • 메서드 본문
    • 실제 메서드 내에서 동작할 코드가 위치한다.

여기서 간단하게 public과 static을 알고 가자면

  • public : 다른 클래스에서 호출할 수 있는 메서드라는 뜻이다.
  • static : 객체를 생성하지 않고 호출할 수 있는 정적 메서드라는 뜻이다.

메서드 호출과 용어 정리

메서드를 호출할 때는 다음과 같이 메서드에 넘기는 값과 매개변수(파라미터)의 타입이 맞아야 합니다. 그리고 넘기는 값과 매개변수 순서와 갯수도 맞아야 합니다.

호출: call("hello", 20)
메서드 정의: int call(String str, int age)

 

인수(Argument)

여기서 "hello"20 처럼 넘기는 값을 영어로 Argument(아규먼트), 한글로 인수 또는 인자라 한다.

실무에서는 Argument, Args, 인수, 인자라는 용어를 모두 사용한다.

 

매개변수(Parameter)

메서드를 정의할 때 선언한 변수인 String str, int age를 매개변수, 파라미터라 한다.

메서드를 호출할 때 인수를 넘기면, 그 인수가 매개변수에 대입된다.

실무에서는 매개변수, 파라미터 용어를 모두 사용한다.

반환 타입

반환 타입이 있는 메서드는 반드시 return을 사용해서 값을 반환해야 합니다.

그러나 반환 타입이 void인 경우 return이 없어도 무방합니다.

 

이 부분은 특히 조건문과 함께 사용할 때 유의해야 하며, 다음과 같은 예시가 있습니다.

package method;

public class MethodReturn1 {
    public static void main(String[] args) {
        boolean result = odd(2);
        System.out.println(result);
    }
    public static boolean odd(int i) {
        if (i % 2 == 1) {
        return true;
   		}
    }
}

이 코드에서 `if` 조건이 만족할 때는 `true` 가 반환되지만, 조건을 만족하지 않으면 어떻게 될까? 조건을 만족하지 않은 경우에는 `return` 문이 실행되지 않는다. 따라서 이 코드를 실행하면 `return` 문을 누락했다는 다음과 같은 컴파일 오류가 발생한다.

java: missing return statement

 

따라서 else문을 추가시켜 조건을 만족시켜줘야 합니다.

return 문을 만나면 그 즉시 메서드를 빠져나가는 특징

package method;

public class MethodReturn2 {
    public static void main(String[] args) {
        checkAge(10);
        checkAge(20);
    }
    public static void checkAge(int age) {
        if (age < 18) {
            System.out.println(age + "살, 미성년자는 출입이 불가능합니다.");
            // return을 만나면 그 즉시 해당 메서드를 나간다.
            return;
        }
        System.out.println(age + "살, 입장하세요.");
    }
}

메서드 반환 값 무시

반환 타입이 있는 메서드를 호출했는데, 만약 반환 값이 필요없다면 사용하지 않아도 무방합니다.

자바의 중요한 대원칙

자바는 항상 변수의 값을 복사해서 대입합니다.
int num2 = num1;
  • 이 부분은 생각해보면 `num1` 에 있는 값 `5` 를 복사해서 `num2` 에 넣는 것이다.
    • 복사한다고 표현한 이유는 `num1` 의 값을 읽어도 `num1` 에 있는 기존 값이 유지되고, 새로운 값이 `num2` 에들어가기 때문이다. 마치 `num1` 의 값이 `num2` 에 복사가 된 것 같다.
    • `num1` 이라는 변수 자체가 `num2` 에 들어가는 것이 아니다. `num1` 에 들어있는 값을 읽고 복사해서 `num2`에 넣는 것이다.
    • 간단하게 `num1` 에 있는 값을 `num2` 에 대입한다고 표현한다. 하지만 실제로는 그 값을 복사해서 대입하는 것이다.

이것은 메서드에도 적용이 됩니다.

public class MethodValue1 {
    public static void main(String[] args) {
        int num1 = 5;
        System.out.println("1. changeNumber 호출 전, num1: " + num1);
        changeNumber(num1);
        System.out.println("4. changeNumber 호출 후, num1: " + num1);
    }
    public static void changeNumber(int num2) {
        System.out.println("2. changeNumber 변경 전, num2: " + num2);
        num2 = num2 * 2;
        System.out.println("3. changeNumber 변경 후, num2: " + num2);
    }
}

그림을 통해 확인해보겠습니다.

메서드 호출 시점
메서드 실행 중
최종 결과

이는 같은 이름의 변수(메서드가 다른)에도 적용됩니다.

메서드 형변환

메서드를 호출할 때도 형 변환이 적용됩니다.

큰 값에서 작은 값으로 대입할 경우, 명시적으로 형 변환을 해주고,

작은 값에서 큰 값을 대입할 경우에는 자동 형변환이 가능합니다.

메서드 오버로딩

이름이 같고 매개변수가 다른 메서드를 여러개 정의하는 것을 메서드 오버로딩(Overloading)이라 합니다.

오버로딩 규칙

// 오버로딩 성공
add(int a, int b)
add(int a, int b, int c)
add(double a, double b)

// 오버로딩 실패
int add(int a, int b)
double add(int a, int b)
int add(int c, int d)

매서드의 이름이 같아도 매개변수의 타입 및 순서가 다르면 오버로딩을 할 수 있습니다.

단, 반환 타입은 인정하지 않으며, 매개변수의 변수명이 다르다는 것 또한 인정하지 않습니다.

이는 메서드 시그니처 때문에 이러한 결과가 만들어지는 것입니다.

메서드 시그니처

메서드 시그니쳐 = 메서드 이름 + 매개변수 타입(순서)

메서드 시그니처는 자바에서 메서드를 구분할 수 있는 고유한 식별자나 서명을 뜻한다. 메서드 시그니처는 메서드의 이름과 매개변수 타입(순서 포함)으로 구성되어 있다. 쉽게 이야기해서 메서드를 구분할 수 있는 기준이다. 자바 입장에서는 각각의 메서드를 고유하게 구분할 수 있어야한다. 그래야 어떤 메서드를 호출 할 지 결정할 수 있다.
따라서 메서드 오버로딩에서 설명한 것 처럼 메서드 이름이 같아도 메서드 시그니처가 다르면 다른 메서드로 간주한다. 반환 타입은 시그니처에 포함되지 않는다. 방금 오버로딩이 실패한 두 메서드를 보자. 두 메서드는 add(int a, int b) 로 메서드 시그니처가 같다. 따라서 메서드의 구분이 불가능하므로 컴파일 오류가 발생한다.

간단한 메서드 오버로딩 예제

덧셈 메서드를 오버로딩해보겠습니다.

package overloading;
public class Overloading1 {
    public static void main(String[] args) {
        System.out.println("1: " + add(1, 2));
        System.out.println("2: " + add(1, 2, 3));
    }
    // 첫 번째 add 메서드: 두 정수를 받아서 합을 반환한다.
    public static int add(int a, int b) {
        System.out.println("1번 호출");
        return a + b;
    }
    // 두 번째 add 메서드: 세 정수를 받아서 합을 반환한다.
// 첫 번째 메서드와 이름은 같지만, 매개변수 목록이 다르다.
    public static int add(int a, int b, int c) {
        System.out.println("2번 호출");
        return a + b + c;
    }
}

 

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

[Java] 기본형과 참조형  (1) 2023.12.21
[Java] Class와 데이터  (1) 2023.12.21
[Java] Array  (1) 2023.12.15
[Java] Scanner  (0) 2023.12.15
[Java] 형변환  (0) 2023.12.15