1. 소개
질문으로 시작해 봅시다: 왜 메서드가 무언가를 반환해야 할까요? 왜 메서드 안에서 모든 일을 처리하고 결과를 화면에 출력만 하면 안 될까요?
종종 우리가 원하는 것은 단순히 어떤 동작을 수행하는 것이 아니라, 이후 프로그램의 다른 부분에서 사용할 결과를 얻는 것입니다. 예를 들어:
- 메서드가 두 수의 합을 계산해서 반환하면, 그 결과를 이후 계산에 사용할 수 있습니다.
- 메서드가 어떤 수가 짝수인지 판단하고 true 또는 false를 반환하면, 그에 따라 의사결정을 할 수 있습니다.
- 메서드가 사용자에게 보낼 인사 문자열을 반환하고, 우리는 그것을 어디에 전달할지 — 화면에 출력할지, 파일에 기록할지, 네트워크로 보낼지 — 결정합니다.
만약 메서드가 항상 결과를 그냥 출력만 했다면, 프로그램은 하나의 시나리오에 고정되어 재사용이 어려웠을 것입니다. 반환 값은 메서드를 유연하고 범용적으로 만들어 줍니다.
비유
커피 자판기를 떠올려 보세요. 돈을 넣고 버튼을 누르면 — 커피를 받습니다. 만약 자판기가 단지 크게 “커피가 완성되었습니다!”라고 말하기만 하고 커피를 주지 않는다면, 기쁠 리가 없겠죠. 메서드도 마찬가지입니다. 때로는 단지 “완료!”라는 말이 아니라, 실제 결과를 받고 싶습니다.
2. 반환 타입: 메서드는 무엇을 반환할 수 있나
Java에서 메서드를 선언할 때는 반환 타입을 지정합니다 — 이는 어떤 타입도 될 수 있습니다: int, double, String, boolean, 배열, 심지어 여러분이 만든 클래스의 객체까지. 메서드가 아무것도 반환하지 않는다면 — void를 씁니다.
구문:
tip_vozvrashchaemogo_znacheniya imyaMetoda(parametry)
{
// 메서드 본문
}
예시:
int sum(int a, int b)
{
// int를 반환
}
String getGreeting(String name)
{
// String을 반환
}
boolean isEven(int number)
{
// boolean을 반환
}
void printHello()
{
// 아무것도 반환하지 않음 — 단지 동작을 수행
}
중요! 반환 타입은 메서드의 “약속”입니다: 해당 타입의 값을 반드시 반환해야 합니다. int를 반환하겠다고 해놓고 String을 반환하면 — 컴파일러가 불만을 표시하며 프로그램을 빌드하지 못하게 합니다.
3. 연산자 return: 메서드에서 값을 반환하는 방법
메서드의 결과를 바깥으로 실제로 넘기려면 연산자 return을 사용합니다. 이 키워드는 “여기 결과가 있어요 — 이걸로 제 일은 끝!”이라는 뜻입니다.
int sum(int a, int b)
{
int result = a + b;
return result; // 결과를 반환
}
더 간단히 쓸 수도 있습니다:
int sum(int a, int b)
{
return a + b;
}
메서드가 return 문에 도달하면 실행을 종료하고, 지정한 값을 반환하여 호출된 곳으로 전달합니다.
중요: return 뒤의 값의 타입은 메서드에 선언된 반환 타입과 일치해야 합니다.
4. 반환 값 사용: 어디에 쓰나?
메서드가 값을 반환하면 다음과 같이 사용할 수 있습니다:
- 변수에 저장한다.
- 바로 표현식에서 사용한다.
- 다른 메서드에 전달한다.
int result = sum(5, 7); // 변수에 저장
System.out.println(result); // 결과를 출력
System.out.println(sum(10, 20)); // 즉시 결과를 출력
if (isEven(42))
{
System.out.println("짝수입니다!");
}
예시: 문자열을 반환하는 메서드
String getGreeting(String name)
{
return "안녕, " + name + "!";
}
// 사용:
String greeting = getGreeting("알리사");
System.out.println(greeting); // 안녕, 알리사!
5. 실습: 반환 값을 갖는 메서드 예제
두 수의 최댓값을 반환하는 메서드
int max(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
삼항 연산자를 이미 익혔다면 더 짧게 쓸 수도 있습니다:
int max(int a, int b)
{
return (a > b) ? a : b;
}
사용 예:
int maximum = max(10, 25);
System.out.println("최댓값: " + maximum); // 최댓값: 25
숫자가 짝수이면 true를 반환하는 메서드
boolean isEven(int number)
{
return number % 2 == 0;
}
사용 예:
if (isEven(18))
{
System.out.println("짝수입니다!");
}
else
{
System.out.println("홀수입니다!");
}
배열 원소의 합을 반환하는 메서드
int sumArray(int[] arr)
{
int sum = 0;
for (int i = 0; i < arr.length; i++)
{
sum += arr[i];
}
return sum;
}
사용 예:
int[] grades = {5, 4, 3, 5, 4};
int total = sumArray(grades);
System.out.println("점수 합계: " + total);
6. return이 있는 메서드를 호출하면 어떤 일이 일어나는가
반환 값을 갖는 메서드를 호출하면, 프로그램 실행은 메서드 내부로 “들어가” 그 코드를 수행하고 return에 도달하면 값을 반환 — 그리고 그 값을 호출 지점에 대입합니다.
개략적으로:
int a = 2;
int b = 3;
int c = sum(a, b); // 여기서 sum(2, 3)을 호출하고 5를 반환, c는 5가 됨
블록 다이어그램
graph TD
A["main"] --> B["sum(a, b)"]
B --> C[계산]
C --> D[return result]
D -->|결과가 반환됨| A
7. 유용한 포인트
return 은 메서드 실행을 종료한다
메서드에서 return을 만나면 메서드 실행이 즉시 중단됩니다. 그 뒤에 있는 코드는 실행되지 않습니다.
int test()
{
return 42;
System.out.println("이는 출력되지 않습니다"); // unreachable
}
return 과 void 메서드
아무것도 반환하지 않는 void 메서드에서도 값을 지정하지 않은 return을 사용해 조건에 따라 조기 종료할 수 있습니다.
void printPositive(int number)
{
if (number <= 0)
{
System.out.println("양수가 아닙니다!");
return; // 그냥 메서드에서 빠져나옵니다
}
System.out.println("숫자: " + number);
}
8. return 사용 시 흔한 오류
오류 № 1: 모든 경로가 값을 반환하지 않음
int getSign(int number)
{
if (number > 0)
{
return 1;
}
// 그렇다면 number <= 0 일 때는? return 이 없음!
}
// 오류: 모든 분기가 값을 반환하지 않습니다
해결 방법: 모든 실행 경로에 return이 있도록 작성하세요.
int getSign(int number)
{
if (number > 0)
{
return 1;
}
else if (number < 0)
{
return -1;
}
else
{
return 0;
}
}
오류 № 2: 반환 타입 불일치
int getNumber()
{
return "42"; // 오류! int 가 필요하지만 String 이 반환됨
}
오류 № 3: return 이후의 코드
int test()
{
return 5;
System.out.println("이 코드는 실행되지 않습니다"); // unreachable statement
}
오류 № 4: void 메서드에서 값을 가진 return 사용
void printSomething()
{
return 42; // 오류! void 메서드는 값을 반환할 수 없습니다
}
오류 № 5: 반환 값을 무시함
sum(10, 20); // 이게 끝인가요? 결과가 사라졌습니다!
반환 값을 사용하지 않으면 그 값은 그냥 사라집니다. 변수를 통해 저장하거나, 다른 메서드로 전달하는 것을 잊지 마세요!
오류 № 6: return 이 무언가를 출력해 준다고 기대함
int result = sum(2, 3);
// return 은 아무것도 출력하지 않습니다!
// 명시적으로 출력해야 합니다:
System.out.println(result);
GO TO FULL VERSION