공부/Java

자바 메서드

Stair 2024. 8. 26. 16:02
반응형

 

 

위와 같은 계산은 둘 다 변수를 두개 선언하고 어떤 연산을 수행하는지 출력하고, 두 변수를 더해서 결과를 구하게 된다. 만약 프로그램의 여러곳에서 이와 같은 계산을 반복해야한다면, 같은 코드를 여러번 반복해서 작성해야하할 것이다.

 

더 나아가 부분 수정이 이루어지면 전체의 코드를 수정해야하는 문제점도 발생하게 된다.

 

 

이러한 문제를 깔끔하게 해결하기 위해 메서드를 사용한다.

함수를 만들어 두고, 필요한 입력 값을 넣어서 해당 함수를 호출하면 된다. 그러면 계산된 결과가 나온다.

 

함수는 마치 블랙박스와 같다. 함수를 호출할 때는 외부에서는 필요한 값만 입력하면 된다. 그러면 계산된 결과가 출력된다. 같은 함수를 다른 입력 값으로 여러번 호출할 수 있고, 한번 정의해두면 계속해서 재사용할 수 있다.

 

 

public static int add ~~ 부분이 메서드이다.

 

메서드는 수학의 함수와 유사하게 생겼다. 함수에 값을 입력하면, 어떤 연산을 처리한 다음에 결과를 반환한다.

 

메서드는 크게 메서드 선언과 메서드 본문으로 나눌 수 있다.

 

public static int add (int a, int b)

메서드의 선언 부분으로 메서드 이름, 반환타입, 매개변수 목록을 포함한다.

이름 그대로 이런 메서드가 있다고 선언하는 것이다. 메서드 선언정보를 통해 다른 곳에서 해당 메서드를 호출할 수 있다.

 

int add(int a, int b)

int : 반환 타입을 정의한다. 메서드의 실행 결과를 반환할 때 사용할 반환 타입을 지정한다.

add :메서드에 이름을 부여한다. 이 이름으로 메서드를 호출할 수 있다.

(int a, int b)메서드를 호출할 때 전달하는 입력 값을 정의한다. 이 변수들은 해당 메서드 안에서만 사용된다. 이렇게 메서드 선언에 사용되는 변수를 영어로 파라미터, 한글로 매개변수라 한다.

 

{

int sum = a + b;

return sum;

}

 

메서드 본문은 블랙박스이다. 메서드를 호출하는 곳에서는 메서드 선언은 알 수 있으나 이 본문의 내용은 몰라도 된다.

메서드의 실행 결과를 반환하려면 return 문을 사용해야한다. return문 다음에 반환할 결과를 적어주면 된다.

** 반환시에 타입이 맞는지 유의하자.

 

메서드 호출이 끝나면 더 이상 해당 메서드가 사용한 메모리를 낭비할 이유가 없다. 메서드 호출이 끝나면 메서드 정의에 따라 사용한 파라미터 변수인 int a, int b는 물론이고, 그 안에서 정의한 int sum도 모두 제거된다.

 

호출 : call("Hello", 20)

메서드 정의 : int call(String str, int age)

 

호출자에서 넘기는 값이 Argument(아규먼트), 한글로 인수 또는 인자라 한다.

 

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

 

 

 

 

반환타입이 없는(void) 함수를 반환하려고 하면 에러가 터진다.

 

 

 

+ 모든 메서드는 항상 return을 호출해야 한다. 그런데 반환 타입 void의 경우에는 예외로 printFooter()와 같이 생략해도 된다. 자바 컴파일러가 반환 타입이 없는 경우에는 return을 마지막줄에 넣어준다. 참고로 return을 만나면 해당 메서드는 종료된다.

 

 

 

메서드의 반환타입이 있다면 반드시 반환을 사용해야한다.

 

 

이 코드에서는 if 조건이 만족할 때는 true가 반환되지만, 조건을 만족하지 않으면 return 문이 실행되지 않기 때문에 return 문을 누락했다는 다음과 같은 컴파일 오류가 발생한다.

 

 

또한 return문을 만나면 그 즉시 메서드를 빠져나간다.

 

 

**자바는 항상 변수의 값을 복사해서 대입한다**

이 대원칙은 반드시 이해해야 한다. 그러면 아무리 복잡한 상황에도 코드를 단순하게 이해할 수 있다.

 

 

자바는 항상 변수의 값을 복사해서 대입한다.

 

changeNumber(num1)을 호출하면

**num1 의 값 5를 읽고 "복사"해서 num2에 전달 -> 이 부분이 핵심

복사해서 전달했기에 num2의 변경은 num1에 아무런 영향을 주지 않는다.

 

결과적으로 매개변수 num2의 값만 변경되고 num1의 값은 변경되지 않고 기존 값인 5로 유지가 된다.

 

 

위와 같이 매개변수와 변수의 이름이 둘 다 number로 같을 때 헷갈릴 수 있으니 자바는 항상 변수의 값을 복사해서 대입하는 걸 유의하자.

 

main도 사실 메서드이다. 각각의 메서드 안에서 사용하는 변수는 서로 완전히 분리된 다른 변수이다. 물론 이름이 같아도 완전히 다른 변수다. 따라서 main()의 number와 changeNumber()의 number는 서로 다른 변수이다.

 

 

num1의 값을 바꾸고 싶을땐 위와 같이 return을 활용하여 받을 수 있다.

 

**자바는 항상 변수의 값을 복사해서 대입한다(참고로 참조형 변수도 참조형 변수에 있는 값인 참조값을 복사하는 것이다.)

반응형