메소드 리턴 타입
목차
C#의 메소드 리턴 타입에 대해서 알아보겠습니다. C#은 문법적으로 C계열의 계승자이니까 기본적으로 C언어의 함수 리턴 타입과 닮아있습니다.
리턴(return)이란?
메소드에서 리턴, 반환, 돌려준다 등 다양한 용어를 쓰는데요. 반환이란 무슨 의미일까요? 메소드의 실행에는 호출자와 피호출자가 있습니다. 메소드의 실행이 끝나면 둘 중 하나입니다. 뭔가 값을 돌려주거나 아니면 그냥 호출자에게 복귀하는 것 입니다.
아래 이미지를 보면 Main 메소드에서 Method 를 호출하고 실행이 완료되면 return 합니다. 이때 돌려주는 값을 리턴 값 – return value 이라고 합니다. 반환값, 돌려주는 값 등 같은 말입니다. 메소드 안에서 return 을 만나면 호출자에게 복귀하는데 값은 리턴 타입에 따라 결정됩니다.
리턴값이 없는 경우는 void 를 사용합니다. void printSomething() 처럼 함수 이름 앞에 void를 붙입니다. 반환값은 int, float 같은 기본 데이터형이 될 수 있고 사용자가 정의한 클래스 타입이 될 수 있습니다.
예제로 알아보겠습니다. 메소드의 반환 값으로 문자열을 받습니다. 지금 몇 시냐고 물어보면 시간과 분을 대답하는 메소드입니다. 문법적인 부분을 한번 보겠습니다. string WhatTimeIsIt()에서 string 이 리턴 타입입니다. 이렇게 타입을 명시하면 반드시 return string타입변수; 가 나와야 합니다. 컴파일러가 리턴 타입에 통일성이 있는지 검사를 하기 때문입니다.
return 받은 값은 변수에 저장하거나 함수의 인수 등 표현식에 바로 사용하면 됩니다.
using System; namespace MyApp { public class Program { private static void Main(string[] args) { Console.WriteLine("what time is it?"); Console.WriteLine(new TimeInfo().WhatTimeIsIt()); return; } } public class TimeInfo { public string WhatTimeIsIt() { DateTime now = DateTime.Now; string currentTime; currentTime = "it's " + now.Hour.ToString() + " o\'clock and " + now.Minute.ToString() + " minutes"; return currentTime; } } } [실행] what time is it? it's 15 o'clock and 2 minutes
void 메소드는 많이 봤겠지만 한번 더 보면 아래 printSomething 처럼 반환값이 필요가 없습니다. return 은 명시하지 않아도 void 는 알아서 종료합니다. 단 분기문과 return 을 놓는 위치에 따라 프로그램 흐름을 제어할 수 있습니다. return 문은 메소드를 종료하고 호출자에게 복귀하는게 목적이지만 동작은 break나 continue 같은 점프문(jump statement)에 속합니다.
using System; namespace MyApp { public class Program { private static void Main(string[] args) { printSomething(); return; } private static void printSomething() { Console.WriteLine("Print Something!"); return; } } }
예제 코드를 하나만 더 보면 아래와 같은 방식도 많이 사용합니다. static 메소드로 인스턴스를 생성하여 클래스 타입을 반환합니다. 여기서 약간만 변경하면 싱글톤이 되는데 후에 디자인 패턴에서 설명할 내용입니다.
using System; namespace MyApp { public class Program { private static void Main(string[] args) { MyClass m1 = MyClass.getInstance(); m1.id = 25; Console.WriteLine("id 값: " + m1.id); return; } } class MyClass { public int id; public static MyClass getInstance() { var myInstance = new MyClass(); return myInstance; } } } [실행] id 값: 25
리턴 타입에서 중요한 것은 타입을 일치시키는 부분입니다. 메소드를 정의할 때 헤더와 바디의 리턴값을 일치시키고 마지막에 반환값을 받는 호출자도 타입을 일치시킵니다. OOP는 뒤로 가면 상속(inheritance)과 다형성(polymorphism) 때문에 이게 맞나 저게 맞나 고민하는 시간이 늘어가니까 만만하지 않습니다.