매개변수는 메서드가 입력을 받을 수 있게 한다
항상 같은 일만 하는 메서드는 한계가 있습니다. 매개변수는 같은 메서드가 호출될 때마다 다른 값을 다룰 수 있도록 메서드의 괄호 안에 선언하는 입력입니다.
각 매개변수를 타입과 이름으로 나열합니다. 메서드 본문 안에서 매개변수는 호출자가 전달한 값을 이미 담고 있는 평범한 지역 변수처럼 동작합니다.
name이 매개변수입니다. "Sam"과 "Alex"는 인수로, 호출 시점에 제공되는 구체적인 값입니다. 하나의 메서드 정의, 두 개의 서로 다른 출력입니다.
매개변수 대 인수
이 두 단어는 느슨하게 사용되곤 하지만, 그 구분을 명확히 해 둘 가치가 있습니다:
- 매개변수는 선언에 있는 자리 표시자입니다:
String name. - 인수는 실제로 전달하는 값입니다:
"Sam".
따라서 void greet(String name)은 매개변수를 선언하고, greet("Sam")은 인수를 전달합니다. 누군가 "이 메서드는 매개변수를 두 개 받는다"고 말하면 선언을 가리키는 것이고, "인수를 두 개 전달했다"고 말하면 호출을 가리키는 것입니다.
다중 매개변수
매개변수는 쉼표로 구분하고 각각에 고유한 타입을 부여하세요. 변수 선언에서처럼 두 매개변수가 하나의 타입을 공유할 수는 없습니다:
인수는 이름이 아니라 엄격하게 위치로 매개변수에 대응됩니다. describe("Sam", 30, true)가 동작하는 이유는 순서가 (String name, int age, boolean active)와 일치하기 때문입니다. 호환되는 타입의 두 인수를 바꿔 넣으면 컴파일 오류가 아니라 조용한 논리 버그가 발생하므로 순서가 중요합니다.
흔한 실수는 int add(int a, b)라고 쓰는 것입니다. 각 매개변수에는 고유한 타입이 필요합니다: int add(int a, int b).
값 반환하기
매개변수는 데이터가 안으로 흐르는 방식이고, 반환 값은 결과가 밖으로 흐르는 방식입니다. 메서드 이름 앞에 반환 타입을 선언하고, return을 사용해 호출자에게 값을 돌려줍니다:
반환 타입(double)은 실제로 return하는 값과 일치해야 합니다. void로 선언된 메서드는 아무것도 반환하지 않습니다. 일찍 빠져나오기 위해 값 없는 return;을 쓸 수는 있지만 값을 반환할 수는 없습니다. return이 실행되는 순간 메서드는 끝나고 제어는 호출 지점으로 되돌아갑니다.
자바는 값에 의한 전달이다
이것은 처음에 거의 모든 사람을 헷갈리게 합니다. 인수를 전달하면 자바는 값을 매개변수로 복사합니다. 기본형의 경우 메서드가 자신만의 복사본을 갖는다는 뜻이므로, 매개변수를 바꿔도 호출자의 변수는 결코 건드려지지 않습니다:
x는 5로 유지됩니다. 메서드는 원본이 아니라 자신의 복사본을 수정했습니다.
객체 전달하기: 여전히 값에 의한 전달, 하지만 참조를 주의하라
객체는 예외처럼 느껴지지만 그렇지 않습니다. 복사되는 것은 객체 자체가 아니라 참조(객체를 가리키는 화살표)입니다. 그래서 메서드는 같은 객체를 가리키고 그것을 변경할 수 있습니다:
두 가지 다른 결과, 하나의 규칙. addItem은 참조를 따라가 실제 리스트를 변경하므로 호출자는 new가 나타나는 것을 봅니다. replace는 매개변수를 완전히 새로운 리스트로 재할당하지만, 이는 참조의 지역 복사본의 방향만 바꿀 뿐이므로 호출자의 list는 그대로입니다. 요점은, 매개변수를 통해 객체를 변경할 수는 있지만, 호출자의 변수가 새로운 곳을 가리키게 만들 수는 결코 없다는 것입니다.
다음: 메서드 오버로딩
이제 메서드에 필요한 입력을 정확히 주는 방법을 알게 되었습니다. 그런데 하나의 메서드 이름이 서로 다른 매개변수 집합을 받아들이게 하고 싶다면 어떻게 할까요 - 예를 들어 print(int)와 print(String)처럼요? 그것이 메서드 오버로딩이며, 다음 페이지의 주제입니다.
자주 묻는 질문
자바에서 매개변수와 인수의 차이는 무엇인가요?
매개변수는 메서드 선언에 명시된 변수로, void greet(String name)에서의 String name입니다. 인수는 메서드를 호출할 때 실제로 전달하는 값으로, greet("Sam")은 인수 "Sam"을 전달합니다. 간단히 말해, 매개변수는 정의에 살고, 인수는 호출에 삽니다.
자바는 값에 의한 전달인가요, 참조에 의한 전달인가요?
자바는 항상 값에 의한 전달입니다. 기본형의 경우 값의 복사본이 전달되므로, 매개변수를 재할당해도 호출자의 변수를 바꿀 수 없습니다. 객체의 경우 참조의 복사본이 전달됩니다. 참조가 가리키는 객체를 변경할 수는 있지만(예: 리스트에 추가), 매개변수 자체를 재할당하는 것은 호출자의 변수에 영향을 주지 않습니다.
자바에서 메서드에 여러 인수를 전달하려면 어떻게 하나요?
선언부에서 매개변수를 쉼표로 구분해 나열하고 각각에 고유한 타입을 부여합니다: int add(int a, int b). 같은 순서로 인수를 전달해 호출합니다: add(2, 3). 자바는 인수를 이름이 아니라 엄격하게 위치로 매개변수에 대응시키므로 순서가 일치해야 합니다.