본 글에 사용된 코드와 이미지의 일부는 김영한 님의 『김영한의 자바 입문』 강의를 참조하여 발췌·활용하였습니다.
만약 프로그램의 여러 곳에서 같은 계산을 반복해야 한다면? 같은 코드를 여러번 반복해서 작성해야 한다. 더 나아가 어떤 연산을 수행하는지 출력하는 부분을 변경한거나, 제거하고 싶다면 해당 코드를 다 찾아다니면서 모두 수정해야한다. 이런 문제를 어떻게 해결할 수 있을지 알아보자.
메서드
자바에서는 함수를 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;
}
}위 코드처럼 메서드를 사용하면 중복 코드를 제거하고, 코드가 깔끔해진 것을 느낄 수 있을 것이다.
메서드 정의
함수를 정의하는 것과 같이, 메서드도 메서드를 정의한다 라고 표현한다. 메서드는 다음과 같이 정의한다.
public static int add(int a, int b) {
//메서드 본문, 실행 코드
}
제어자 반환타입 메서드이름(매개변수 목록) {
메서드 본문
}- 제어자 : public, static 과 같은 부분이다.
- 반환 타입 : 메서드가 실행 된 후 반환하는 데이터의 타입을 지정한다. 메서드가 값을 반환하지 않는 경우, void 를 사용해야 한다.
- 메서드 이름 : 메서드를 호출하는 데 사용된다.
- 매개변수 : 입력 값으로, 메서드 내부에서 사용할 수 있는 변수이다.
- 메서드 본문 : 실제 메서드의 코드가 위치한다.
메서드는 크게 메서드 선언, 메서드 본문 으로 나눌 수 있다.
메서드 선언
public static int add(int a, int b)
메서드의 선언 부분으로, 메서드 이름, 반환 타입, 매개변수(파라미터) 목록을 포함한다.
- public static
- public : 다른 클래스에서 호출할 수 있는 메서드
- static : 객체를 생성하지 않고 호출할 수 있는 정적 메서드
- int add(int a, int b)
- int : 반환 타입을 정의하고, 메서드의 실행 결과를 반환할 때 사용할 반환 타입을 지정한다.
- add : 메서드에 이름을 부여한다. 이 이름으로 메서드를 호출할 수 있다.
- int a, int b : 메서드를 호출할 때 전달하는 입력 값을 정의한다.
메서드 본문
{
System.out.println(a + "+" + b + " 연산 수행");
int sum = a + b;
return sum;
}- 메서드가 수행해야 하는 코드 블록이다.
- 메서드를 호출하면 메서드 본문이 순서대로 실행된다.
- 메서드를 호출하는 곳에서 메서드 선언은 알지만 메서드 본문은 모른다.
- 메서드의 실행 결과를 반환하려면 return 문을 사용해야 한다.
매개변수가 없거나 반환 타입이 없는 경우
매개변수가 없는 경우 , 선언 시 매개변수를 비워두고 정의하고, 호출 시 인수를 비워두고 호출한다.
반환 타입이 없는 경우, 선언 시 반환 타입을 void, 호출 시 반환 값을 받지 않으면 된다.
모든 메서드는 항상 return 을 호출해야 한다. 하지만 void 의 경우에는 생략이 가능하다. 자바가 반환 타입이 없는 경우에는 return 을 마지막줄에 넣어준다.
return 을 만나면 해당 메서드는 종료된다.
메서드 호출
앞서 정의한 메서드를 호출해서 실행하려면 메서드 이름에 입력 값을 전달하면 되는데, 이를 메서드를 호출한다고 표현한다.
int sum1 = add(5, 10);
int sum2 = add(15, 20);메서드를 호출하면 어떻게 되는지 살펴보자.
- int sum1 = add(5,10)
- add 라는 메서드를 숫자 5,10 을 전달하면서 호출한다.
- int sum1 = 15
- add(5,10) 이 실행된다. 실행 결과의 반환 값은 15이다.
메서드 호출 용어 정리
메서드를 호출할 때는 메서드에 넘기는 값과 매개변수(파라미터)의 타입과 순서, 갯수도 맞아야 한다.
호출: call("hello", 20)
메서드 정의: int call(String str, int age)- 인수(Argument)
- 위 코드에서 "hello",20 처럼 넘기는 값을 인수, 인자 라고 한다.
- 매개변수(Parameter)
- 메서드를 정의할 때 선언한 변수를 매개변수, 파라미터라고 한다.
- 메서드를 호출할 때 인수를 넘기면, 그 인수가 매개변수에 대입된다.
메서드 호출과 값 전달
자바에서 아주 중요한 원칙이 있다. 자바는 항상 변수의 값을 복사해서 대입한다. 잘 기억해두자.
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);
}
}위 코드의 결과를 생각해보자.
1. changeNumber 호출 전, num1: 5
2. changeNumber 변경 전, num2: 5
3. changeNumber 변경 후, num2: 10
4. changeNumber 호출 후, num1: 5num1 이 10 이 나올거라고 생각하지만 정답은 5가 나온다. 왜 그런것일까?
changeNumber(sum1) 호출 시 num1 의 값 5를 읽고 복사해서 num2 에 전달하기 때문에, num2 의 변경은 num1 에 영향을 주지 않는다. 왜냐하면 앞서 값을 복사해서 전달했기 때문이다.
그렇다면 메서드를 사용해서 값을 변경하려면 어떻게 해야할까? 메서드의 호출 결과를 반환 받아서 사용하면 된다.
public static void main(String[] args) {
int num1 = 5;
System.out.println("changeNumber 호출 전, num1: " + num1); // 출력: 5
num1 = changeNumber(num1);
System.out.println("changeNumber 호출 후, num1: " + num1); // 출력: 10
}메서드 오버로딩
메서드 오버로딩이란 이름이 같고 매개변수가 다른 메서드를 여러개 정의하는 것을 말한다.
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)메서드 시그니처
메서드 시그니처 = 메서드 이름 + 매개변수 타입(순서)메서드 시그니처는 자바에서 메서드를 구분할 수 있는 고유한 식별자나 서명을 뜻한다.
쉽게 이야기해서 메서드를 구분할 수 있는 기준이다. 자바 입장에서는 각각의 메서드를 고유하게 구분할 ㅅ 있어야 어떤 메서드를 호출 할 지 결정할 수 있다.
따라서 메서드 이름이 같아도 메서드 시그니처가 다르면 다른 메서드로 간주한다.
메서드 사용의 장점
- 코드 재사용
- 메서드는 특정 기능을 캡슐화하므로, 필요할 때마다 그 기능을 다시 작성할 필요 없이 해당 메서드를 호출함으로써 코드를 재사용할 수 있다.
- 코드의 가독성
- 이름이 부여된 메서드는 코드가 수행하는 작업을 명확하게 나타내므로, 코드를 읽는 사람에게 추가적인 문맥을 제공한다.
- 모듈성
- 큰 프로그램을 작은 관리 가능한 부분으로 나눌 수 있다. 이로 인해 가독성을 향상시키고 디버깅을 쉽게 만든다.
- 코드 유지 관리
- 코드의 특정 부분에서 문제가 발생하거나 업데이트가 필요한 경우 해당 메서드만 수정하면된다.
- 재사용성과 확장성
- 잘 설계된 메서드는 다른 프로그램이나 프로젝트에서도 재사용할 수 있으며, 새로운 기능을 추가하거나 기존 기능을 확장하는 데 유용하다.
- 추상화
- 메서드를 사용하는 곳에서는 메서드의 구현을 몰라도 된다. 프로그램의 다른 부분에서는 복잡한 내부 작업에 대해 알 필요 없이 메서드를 사용할 수 있다.
- 테스트와 디버깅 용이성
- 개별 메서드는 독립적으로 테스트하고 디버그할 수 있다. 이로 인해 문제를 신속하게 찾고 수정하는 데 도움이 된다.
'인프런 > 김영한 자바' 카테고리의 다른 글
| [김영한의 실전 자바 기본편] - 2. 기본형과 참조형 (0) | 2025.09.03 |
|---|---|
| [김영한의 실전 자바 기본편] - 1. 클래스와 데이터 (0) | 2025.09.02 |
| [김영한의 자바 입문] - 7. 배열 (1) | 2025.09.01 |
| [김영한의 자바 입문] - 6. 입력 (0) | 2025.09.01 |
| [김영한의 자바 입문] - 5. 스코프 & 형변 (0) | 2025.08.29 |