메소드 리턴 타입(return type) – C# 초급 13

메소드 리턴 타입

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) 때문에 이게 맞나 저게 맞나 고민하는 시간이 늘어가니까 만만하지 않습니다.

Leave a Comment