반환값

메서드는 호출 코드로 데이터를 반환할 수 있으며 반환값은 호출 표현식 위치를 직접 대체합니다.

데이터를 반환해야 하는 경우 메서드 이름 앞에 반환 타입을 선언해야 합니다. 반환값이 없으면 void로 표기합니다.

반환값이 없는 메서드에서도 return을 사용할 수 있지만 return 값; 형태로 적지 않고 return;만 쓰면 됩니다. 실행을 종료하고 뒤쪽 코드는 실행하지 않으며 호출 지점으로 제어가 돌아갑니다.

    int Add(int a, int b)  // int 타입 값 반환
    {
        return a + b;
    }Code language: JavaScript (javascript)
    void SayHi() // 반환값 없음
    {
        Console.WriteLine("hello welcome to foxdevelop.com");
    }Code language: JavaScript (javascript)

1. 반환값이 있는 메서드는 반드시 return 표현식;을 사용해야 하며 표현식 연산 결과 타입은 선언한 반환 타입과 일치해야 합니다;

    int Add(int a, int b)
    {
        return 1.2;  // 오류 발생. 1.2는 double 타입이므로 int로 암시적 변환할 수 없어 타입 불일치 오류가 표시됨
    }Code language: JavaScript (javascript)

위 코드는 double 값을 반환하려고 합니다. 리터럴 1.2는 기본적으로 double 즉 부동소수점(소수)입니다. 컴파일러가 소수를 정수로 자동 변환할 수 없기 때문에 오류가 발생합니다.

반대로 작성하면

    double Add2()
    {
        return 10;  // 10은 int 타입이지만 double로 암시적 변환이 가능하므로 타입이 맞춰져 오류가 없음
    }Code language: JavaScript (javascript)

이렇게 쓰면 오류가 발생하지 않습니다. 10은 정수 리터럴이지만 double로 암시적 변환이 허용되기 때문에 호환됩니다. 단순 타입명만 비교하지 말고 암시적 변환 가능 여부를 확인해야 합니다.

암시적 변환이란 개발자가 직접 타입 변환 코드를 적지 않아도 컴파일러가 자동으로 처리하는 변환을 말합니다. 반대로 개발자가 직접 지정하는 변환은 명시적 변환이라고 부릅니다.

타입 변환에 관한 내용은 이후에 다룹니다.

2. 반환값을 가지는 메서드 내 모든 코드 분기는 최종적으로 return을 거쳐야 하며 return 없이 종료되는 분기가 존재하면 안 됩니다.

위 메서드는 Add 앞에 int를 적어 int를 반환하도록 규정했지만 메서드 본문 안에 return 문이 전혀 없다면 오류가 발생합니다.

이 방식으로 작성해도 오류가 생깁니다. return은 if 조건이 참일 때만 실행되고 a >= b인 경우 return이 실행되지 않는 경로가 생기기 때문입니다.

else 부분을 추가해도 안에 return을 빼면 같은 문제가 발생합니다. return에 도달하지 못하는 분기가 남기 때문입니다. 다른 흐름 제어 구문도 동일한 규칙이 적용되며 모든 실행 경로를 빠짐없이 처리해야 합니다.

해결 방안이 하나 있습니다. 메서드 맨 끝에 return을 추가해서 안전 장치로 활용하는 방식입니다. 예시는 다음과 같습니다

    int Add(int a, int b)
    {
        if (a < b)
        {
            return a + b;
        }
        else
        {

        }
        return -1; // 앞쪽 분기와 상관없이 여기까지 실행되면 값을 반환함
        // -1을 안전망 반환값으로 사용하는 개념.
    }Code language: C# (cs)

반환값에는 기본 타입(int, string 등), 사용자 정의 클래스, 컬렉션 등 모든 데이터 타입을 지원;

return이 실행되면 현재 메서드는 즉시 종료되고 이후 코드는 실행되지 않음;

반환값이 있는 메서드 호출은 표현식 삽입, 출력, 변수 할당 등 다양한 곳에 직접 사용할 수 있습니다.

반환값

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다