1. 소개
상상해봐: 네가 전화로(아니면 앱으로, 요즘 시대니까) 피자를 주문한다고 해. 주문 정보를 오퍼레이터한테 알려주면, 오퍼레이터가 결과로 피자를 돌려줘! 만약 오퍼레이터가 아무 말도 안 하면 — 넌 배고프고, 행복도 없어.
함수도 똑같아: 가끔은 그냥 어떤 동작만 하면 되지만, 대부분은 함수가 뭔가 유용한 결과도 돌려줬으면 좋겠지. 그리고 입력값이 다르면 결과도 매번 달라질 수 있어! 예를 들면:
- 함수가 두 숫자의 합을 계산해서 결과를 알려줌.
- 함수가 사람의 나이를 받아서 카테고리("어린이", "성인", "노인")를 반환함.
- 함수가 사용자의 이름으로 멋진 인사말 문자열을 만들어줌.
반환값 — 함수가 자기 작업 결과를 바깥으로 “전달”하는 방법이야.
2. 반환값이 있는 메서드 시그니처
지난 강의에서 이런 템플릿을 봤지:
void PrintHello()
{
Console.WriteLine("안녕!");
}
void 타입은 함수가 아무것도 반환하지 않는다는 뜻이야(void는 "비어있음", 값 없음이라는 의미).
이제 뭔가를 반환하는 함수가 어떻게 생겼는지 보자:
int Add(int a, int b)
{
// 함수 본문
}
여기서 int는 함수 이름 앞에 붙어서, 반환값의 데이터 타입을 의미해. 만약 함수가 문자열을 반환하면 string, 소수라면 double 등등을 써.
함수 선언 문법은 이렇게 생겼어:
<반환값 타입> 메서드이름(<파라미터>)
{
// 함수 본문
}
다양한 시그니처 예시:
| 시그니처 | 무엇을 반환? |
|---|---|
|
정수 |
|
문자열 |
|
소수 |
|
불리언 값 |
3. return 연산자: 함수에서 결과 반환하기
제대로 동작하려면, 타입만 지정하는 걸로는 부족해 — 함수가 결과를 “위로” 돌려보내도록 만들어야 해. 이때 return 연산자를 써. 이걸로 "이 값을 반환할게"라고 말하고, 함수 실행이 그 순간 끝나(그때 함수가 바깥으로 "나가는" 거지).
타입 메서드이름(...)
{
// 어떤 계산들
return 값;
}
예시:
int Add(int a, int b)
{
int sum = a + b;
return sum; // 함수 결과로 합계를 반환
}
중요한 규칙: return으로 반환하는 값의 타입은 메서드 시그니처에 쓴 타입과 완전히 같거나 호환되어야 해.
4. 예시: 뭔가를 반환하는 메서드 작성하기
바로 예제로 가보자! 자주 쓰는 케이스 몇 개 볼게.
예시 1: 두 숫자 더하기
int Add(int a, int b)
{
return a + b;
}
// 사용 예:
int result = Add(10, 20);
Console.WriteLine("합계: " + result); // 출력: 합계: 30
예시 2: 개인 인사말 만들기
string CreateGreeting(string name)
{
return "안녕, " + name + "!";
}
// 사용 예:
string greeting = CreateGreeting("안나");
Console.WriteLine(greeting); // 출력: 안녕, 안나!
예시 3: 성인 여부 확인
bool IsAdult(int age)
{
return age >= 18;
}
if (IsAdult(21))
{
Console.WriteLine("입장 허용됨.");
}
else
{
Console.WriteLine("미안, 성인만 가능해.");
}
// 출력: 입장 허용됨.
예시 4: 반환값을 식에서 사용하기
Console.WriteLine("두 배: " + MultiplyByTwo(7));
int MultiplyByTwo(int n)
{
return n * 2;
}
5. 반환값 타입: 다양성과 특징
C#에서 함수는 숫자, 문자열 같은 고전적인 타입뿐 아니라 어떤 "타입"이든 반환할 수 있어. 예를 들면:
- 정수: int, long, short — 간단하지.
- 소수: double, float, decimal.
- 문자열: string.
- 불리언: bool.
- 배열: int[], string[] 등등.
- 참조 타입: 네가 만든 클래스 객체들.
- void: 아무것도 반환하지 않을 때의 특별한 경우.
왜 반환값 타입이 그렇게 중요할까?
컴파일러는 네가 약속한 걸 꼭 지키는지 엄격하게 확인해. int를 반환한다고 해놓고 문자열이나 아무것도 안 돌려주면 — 에러야. 완전 깐깐한 상사 느낌이지.
에러 예시:
int GetNumber()
{
return "42"; // 에러! int를 기대했는데 string이야.
}
6. 값 없이 쓰는 return: void 메서드에서
사실, 반환 타입이 있는 메서드(예: int, string)에서는 return 뒤에 항상 반환할 값을 써야 해.
하지만! 함수가 void로 선언되어 있으면, 원한다면 return만 써서 바로 함수 실행을 끝낼 수도 있어 — 값을 반환하지 않고.
void PrintNumbers(int n)
{
if (n <= 0)
{
Console.WriteLine("숫자는 음수가 아니어야 해!");
return; // 그냥 함수에서 나가고 아무것도 반환 안 함
}
for (int i = 1; i <= n; i++)
{
Console.WriteLine(i);
}
}
이건 어떤 조건에서 함수 실행을 중단하고 싶지만, 반환할 값은 필요 없을 때 유용해.
7. return 사용 시 흔한 실수들
아, 초보 개발자들이 return 관련 에러로 머리 싸매는 경우 진짜 많아!
문제 1: 뭔가 반환해야 하는 함수에 return이 없음
int GetValue(bool flag)
{
if (flag)
return 1;
// 어라! flag == false면 어쩌지?
}
// 에러: 모든 코드 경로에 return이 있어야 해!
해결법: 항상 모든 실행 경로에 return을 넣어줘! 예를 들면:
int GetValue(bool flag)
{
if (flag)
return 1;
else
return 0;
}
문제 2: 반환값 타입이 안 맞음
double GetMagicNumber()
{
return 42; // 사실 int를 double로 암시적으로 변환하니까 OK
// 근데 만약 함수가 int를 반환해야 하는데 string을 반환하면 에러!
}
규칙: 타입 호환성 꼭 확인해. 헷갈리면 명시적으로 타입 변환해도 돼:
return (double)42;
문제 3: return이 너무 일찍 나옴
알아둬, return이 실행되면 그 즉시 메서드 실행이 끝나. 그 뒤에 있는 코드는 절대 실행 안 돼!
int GetNumber()
{
return 5;
Console.WriteLine("이 줄은 절대 실행 안 됨"); // 컴파일러가 경고할 거야!
}
문제 4: void 메서드에서 값을 반환하려고 함(금지!)
void PrintSomething()
{
return 1; // void 메서드에서 값을 반환하면 안 돼!
}
GO TO FULL VERSION