C언어 return 종류와 차이 | return, return 0, return -1, return n

C언어에서 return은 함수의 실행을 끝내고, 필요 시 동작 또는 결과 값을 호출한 곳으로 함께 전달한다.

리턴의 종류는 크게 4가지로 return,return 0,return -1,return n이다.

결과값이 없거나 0인 경우 종료, 0이 아닌 경우 에러 또는 특정 상태를 의미한다.

C언어 return 종류와 차이
C언어 return 종류와 차이

return 역할

모든 프로그램 언어들은 수행한 처리 결과를 전달할 수 있다.

수행한 처리 결과를 전달하는 때 사용하는 것이 return 이다.

return 구문을 활용하면 처리되는 곳의 상태와 값을 알 수 있다.

C언어 사용되는 return 구문의 종류는 반환값이 없는 경우와 있는 경우, 반환값이 0 인 경우와 0이 아닌 경우로 나눠진다.

프로그램 실행의 최소 단위 함수의 역할

C언어의 함수에 대해 잠깐 언급해 본다.

OOP와 같은 프로그램 언어들이 소개되면서 함수란 용어 보다는 메서드란 용어를 주로 사용하는데 뭐, 같은 말이다.

프로그램이 실행되는 최소단위로 보면 된다.

그런데, 함수를 공부하고 있다면 return 구문을 자주 보게 된다.

보통 처리 결과를 호출한 곳으로 되돌리는 역할을 하는 것이 return 구문인다.

여기서 의미하는 함수는 프로그램의 시작점인 main() 함수도 포함된다.

그렇다면 main() 은 return 구문을 어디로 되돌릴까 ?

윈도우 또는 리눅스와 같은 main함수를 실행한OS이다.

함수는 이 정도로 간단히 언급해 본다.

리턴의 종류

return 의 역할은 프로그램의 흐름을 넘기고, 실행한 결과에 대한 값을 전달한다고 언급했다.

보통의 처리결과는 4가지가 있다.

`종료(중단), 성공, 에러(실패), 사용자 지정`이다.

그럼에도 공통점은 처리를 중단한다는 점에 있다.

리턴 결과에 대한 코드와 내용은 프로그램을 제작한 곳마다 사람마다 다르다.

먼저 위에서 언급한 것에 대한 의미를 보자.

프로그램에서 언급하는 것은 좀 더 상세하게 나열 할 수 있다.

주목할 점은 여기에서 언급하는 함수는 프로그램 시작인 main() 함수도 포함된다.

  • return
    - 프로그램의 흐름의 단순 종료 또는 중단
  • return 0
    - 프로그램의 정상 / 완료 종료 또는 중단
  • return -1
    - 프로그램의 실패 / 에러 종료 또는 중단
  • return n
    - 프로그램의 상태 지정 / 사용자 정의 종료 또는 중단

코드예제

C언어의 return 문에 대한 간단한 코드 예제를 살펴보자.

위에서 언급한 return 종류를 기준으로 코드를 작성하고 실행을 해 본다.

각 return 구문은 함수로 만들어 테스트를 해볼 것이다.

단, 함수에 의미가 없는 코드가 들어가 있을 것이다.

return 구문의 프로그램 흐름 중단을 위한 차이를 보여주기 위함이니 태클 노노여 ~

return 프로그램 흐름의 단순 종료/중단

C언어에서 return은 프로그램 흐름의 단순한 종료 또는 중단을 의미한다.

세미콜론을 포함한 `return;`으로 작성한다.

전달하는 값이 없기 때문에 조건의 상관 여부에 상관없이 작업을 끝낸다.

아래의 코드 중 함수 `CallResutn(void);`를 보면 알 수 있다.

#include <stdio.h>

/* 함수 선언 */
void CallReturn1(void);

/* 프로그램 시작 */
int main(void)
{
    int result = 0;

    printf("----- Start \n");
    printf("\n");

    /* 프로그램 단순 종료 */
    CallReturn1();
    printf("리턴 결과: 없음\n");
    printf("\n");

    printf("----- End \n");

    /* 정상 종료 */
    return 0;
}

void CallReturn1(void)
{
    printf("----- 단순 종료 - 1\n");
    return;

    printf("----- 단순 종료 - 2\n");
}

`CallReturn1(void)` 함수를 보면 return이 있다.

CallReturn1(void) 함수를 호출한 main() 함수에 처리 결과를 전달하는 값이 없으며,

main() 함수는 그저 함수의 작업이 끝이 났다는 정도만 처리하고 다음 코드를 진행할 것이다.

주목할 것은 의미없어 보이는 2번째 printf() 출력함수에 있다.

return 구문이 실행되면 다음 줄의 코드는 실행되지 않는다.

아래는 위의 코드에 대한 실행결과를 보여준다.

단순 종료 : return
단순 종료 : return

return 0 프로그램 흐름의 정상 종료

C언어에서 프로그램 종료시 굳이 `정상`이란 결과를 보내고자 할 때 사용하는 결과값은 0 으로 설정하며, return 문과 함께 사용할 때 `return 0`으로 표현한다.

`return 0` 함수 또는 프로그램 흐름이 정상적으로 처리되고 종료되었음을 의미한다.

#include <stdio.h>

/* 함수 선언 */
int  CallReturn2(void);

/* 프로그램 시작 */
int main(void)
{
    int result = 0;

    printf("----- Start \n");
    printf("\n");

    /* 프로그램 정상 종료 */
    result = CallReturn2();
    printf("리턴 결과: %d\n", result);
    printf("\n");

    printf("----- End \n");

    /* 정상 종료 */
    return 0;
}

int CallReturn2(void)
{
    printf("----- 정상 / 완료 종료 - 1\n");
    return 0;

    printf("----- 정상 / 완료 종료 - 2\n");
}

아래는 정상 종료에 대한 `return 0`에 대한 실행 결과를 보여준다.

의미 없어 보이는 return 이후의 2번째 printf() 출력함수는 프로그램의 흐름이 종료되었기에 실행되지 않는다.

정상 / 완료 종료 : return 0
정상 / 완료 종료 : return 0

return -1 프로그램 흐름의 처리 실패

C언어의 함수 또는 프로그램의 흐름에 대해 에러 또는 실패한 경우 `return -1`을 명시하면 된다.

적절히 만들어진 코드는 보통 정상 종료겠지만, 그렇지 않은 경우들도 있기 때문.

프로그램 흐름 또는 함수의 흐름에 어떤 에러 또는 실패를 를 구분하고자 할 때 `return -1`을 사용한다.

#include <stdio.h>

/* 함수 선언 */
int CallReturn3(void);

/* 프로그램 시작 */
int main(void)
{
    int result = 0;

    printf("----- Start \n");
    printf("\n");

    /* 프로그램 실패/에러 종료 */
    result = CallReturn3();
    printf("리턴 결과: %d\n", result);
    printf("\n");

    printf("----- End \n");

    /* 정상 종료 */
    return 0;
}

int CallReturn3(void)
{
    printf("----- 실패 / 에러 종료 - 1\n");
    return -1;

    printf("----- 실패 / 에러 종료 - 2\n");
}

아래는 위의 코드에 대한 실행 결과이다.

처리 실패 또는 에러가 발생했을 때를 가정하여 `return -1`를 사용하였다.

이번에도 무의미한 2번째 printf() 함수를 사용하였다.

반복적 언급이지만, return 구문이 실행되면 이후 코드는 실행되지 않는다.

실패 / 에러 종료 : return -1
실패 / 에러 종료 : return -1

return n 프로그램 흐름의 사용자 정의

C언어의 처리 결과는 사용자 정의로써 전달할 수 있다.

사용자 정의는 개발자 또는 프로젝트 개발시 정해진 약속에 따른 어떤 규칙을 의미할 수 있다.

위에서 언급한 성공시 0, 실패시 -1 를 제외한 나머지 상태를 숫자로써 지정하여 사용하는 것이다.

1은 보통 특정 상태의 성공을 의미하고, 그 외 2 이상의 코드는 개발자 또는 프로젝트에 따라 숫자를 지정하여 규격화하여 사용할 수 있다.

#include <stdio.h>

/* 함수 선언 */
int CallReturn4(void);

/* 프로그램 시작 */
int main(void)
{
    int result = 0;

    printf("----- Start \n");
    printf("\n");

    /* 프로그램 사용자 정의 종료 */
    result = CallReturn4();
    printf("리턴 결과: %d\n", result);
    printf("\n");

    printf("----- End \n");

    /* 정상 종료 */
    return 0;
}

int CallReturn4(void)
{
    printf("----- 조건 상태 / 사용자 정의 종료 - 1\n");
    return 1;

    printf("----- 조건 상태 / 사용자 정의 종료 - 2\n");
}

일단, 사용자 정의로 `return 1`을 사용하면 보통 처리 성공을 의미할 것이다.

return 또는 return 0 을 사용하지 않고 특정 동작 또는 처리에 대한 성공적 처리 완료로써 의미를 부여하여 사용할 수 있다.

이번에도 의미없는 2번째 printf() 함수가 있으며, 아래는 위의 코드에 대한 처리 결과를 보여준다.

조건 상태 / 사용자 정의 종료: return 1
조건 상태 / 사용자 정의 종료: return 1

이번엔 다른 처리 결과에 대한 return 구문을 사용하는 방법이다.

만약, 어떤 처리 결과가 404라고 가정하자.

사용자 정의로 처리 결과를 단순히 전달하면 되기 때문에 `return 404`로 표현하면 된다.

아래는 return 404 에 대한 코드와 실행 결과를 보여준다.

#include <stdio.h>

/* 함수 선언 */
int CallReturn5(void);

/* 프로그램 시작 */
int main(void)
{
    int result = 0;

    printf("----- Start \n");
    printf("\n");

    /* 프로그램 사용자 정의 종료 */
    result = CallReturn5();
    printf("리턴 결과: %d\n", result);
    printf("\n");

    printf("----- End \n");

    /* 정상 종료 */
    return 0;
}

int CallReturn5(void)
{
    printf("----- 조건 상태 / 사용자 정의 종료 - 1\n");
    return 404;

    printf("----- 조건 상태 / 사용자 정의 종료 - 2\n");
}

return 404 를 사용자 정의 처리 결과로 사용하여 호출한 곳으로 전달한다.

처리 결과값은 404이다.

즉, `return 404 문장은 처리 종료 후 404 결과값을 호출한 곳으로 전달해라.`란 의미와 같다.

의미없어 보이는 두번째 printf() 함수는 return 문 이후에 있기 때문에 실행되지 않는다.

아래는 실행결과를 보여준다.

조건 상태 / 사용자 정의 종료 : return 404
조건 상태 / 사용자 정의 종료 : return 404

전체 코드

위의 코드들에 대한 전체 코드를 아래에 작성했다.

`return` 문의 목적은 프로그램의 흐름을 중단하는 것에 있다며 왜 중단되었는지에 대한 결과값을 전달할 수 있다.

프로그램 흐름의 대표적인 것은 함수이며, 지금의 OOP들의 경우 메서드일 것이다.

여기에서 말하는 함수와 메서드에는 프로그램의 시작점인 main() 함수도 포함된다.

main() 함수는 return 구문을 실행하며 프로그램을 전달하고 결과값을 전달하고자 할 때 OS에 전달할 것이다.

main() 함수에서 실행시킨 다른 함수들은 함수의 실행 종료와 결과값을 main()함수에 전달할 것이다.

return 의 결과값은 전달할 수도 있고, 안할 수도 있다.

구문은 다음과 같으며, `return, return 0, return -1, return n` 형식의 4가지를 사용한다.

이제 코드를 보자.

  • 단순 종료: return
  • 정상 종료: return 0
  • 실패 종료: return -1
  • 사용자 정의 종료: reutn n ( n : 1 ~ 정하기 나름 )

#include <stdio.h>

/* 함수 선언 */
void CallReturn1(void);
int  CallReturn2(void);
int CallReturn3(void);
int CallReturn4(void);
int CallReturn5(void);

/* 프로그램 시작 */
int main(void)
{
    int result = 0;

    printf("----- Start \n");
    printf("\n");

    /* 프로그램 단순 종료 */
    CallReturn1();
    printf("리턴 결과: 없음\n");
    printf("\n");

    /* 프로그램 정상 종료 */
    result = CallReturn2();
    printf("리턴 결과: %d\n", result);
    printf("\n");

    /* 프로그램 실패/에러 종료 */
    result = CallReturn3();
    printf("리턴 결과: %d\n", result);
    printf("\n");

    /* 프로그램 사용자 정의 종료 */
    result = CallReturn4();
    printf("리턴 결과: %d\n", result);
    printf("\n");

    /* 프로그램 사용자 정의 종료 */
    result = CallReturn5();
    printf("리턴 결과: %d\n", result);
    printf("\n");

    
    printf("----- End \n");

    /* 정상 종료 */
    return 0;
}

void CallReturn1(void)
{
    printf("----- 단순 종료 - 1\n");
    return;

    printf("----- 단순 종료 - 2\n");
}

int CallReturn2(void)
{
    printf("----- 정상 / 완료 종료 - 1\n");
    return 0;

    printf("----- 정상 / 완료 종료 - 2\n");
}

int CallReturn3(void) 
{
    printf("----- 실패 / 에러 종료 - 1\n");
    return -1;

    printf("----- 실패 / 에러 종료 - 2\n");
}

int CallReturn4(void)
{
    printf("----- 조건 상태 / 사용자 정의 종료 - 1\n");
    return 1;

    printf("----- 조건 상태 / 사용자 정의 종료 - 2\n");
}

int CallReturn5(void)
{
    printf("----- 조건 상태 / 사용자 정의 종료 - 1\n");
    return 404;

    printf("----- 조건 상태 / 사용자 정의 종료 - 2\n");
}

return 문 뒤에 의미없어 보이는 printf() 함수들이 보인다.

당연히 return 문에서 프로그램 흐름이 종료되었기 때문에 실행되지 않는다.

이것을 굳이 작성한 이유는 아래의 실행 결과에서 볼 수 있다.

실행 결과

위의 전체 코드에 대한 실행결과는 다음과 같다.

return 문을 사용하여 함수를 포함한 프로그램의 흐름을 중단/종료 하는 것을 확인할 수 있다.

그리고, 처리 상태에 따라 결과값이 없거나 있는 경우 또한 확인할 수 있다.

C언어 return 실행 결과
C언어 return 실행 결과

댓글

챗지피티 코덱스와 깃허브 연동 방법 | VSCode 사용하기

이미지
챗지피티의 코덱스( Codex )와 깃허브( Github )를 연결하려고 했지만, 연결이 되지 않아 VSCode에서 직접 연결을 하였다. VSCode에 깃허브를 직접 연결하니 오히려 더 좋은 느낌이다. 코덱스에 프롬프트를 실행하면 자동으로 파일을 만들고 나는 그저 깃허브에 저장소를 만들고 푸시( Push )만 하면 된다. 오히려, 챗지피티 코덱스 페이지에서 연결이 제대로 되지 않은 것이 다행(??)이란 느낌이다. 새로운 것을 시도해 보고, 좀 더 편한 방법을 찾았기 때문이다. 왜 연결이 되지 않는 거냐 ?? 좀 편하게 작업하려고 코덱스( Codex )에 깃허브( Github )를 연결하고자 했다. 인증까지 하고, 윈도우 자동 인증까지 삭제하고 다시 했음에도 연결이 되지 않았다. 아~ 뭐지 ? 찾아보니 버그라고 하는데 ~ 몇 일 동안 계속 이어지는 것 보면 이건 뭔가 문제가 있다고 볼 수 밖에 없다. ( 그 원인과 해결책을 찾을 수가 없다. ) 아아 ~ 코덱스 ~ 인증까지 했는데 깃허브 연결이 왜 안되냐 ~ 다행스럽게도 VSCode에서 연결이 된다는 것을 찾게 되었다. 잘 모르겠는 화면에서 익숙한 아이콘과 제목이 눈에 보였다. 바로 ` IDE에서 시도해 보기 ` 버튼이었다. VSCode에서 할 수 있다는 얘기는 들었지만, 이렇게 보여주니 시도해 보는게 당연하겠지. 일단 자세한 내용을 찾아보니 이미 많은 분들이 VSCode에서 챗지피티의 코덱스를 연결해 사용하고 있었다. VSCode가 깃허브에도 연결되니, 생각해 보면 굳이 코덱스를 웹에서 할 필요는 없겠다는 생각이 들었다. 바로 시도를 해 본다. 새로운 방법을 찾다. 이런 새로운 방법을 찾게 되면 왠지 모를 도파민이 생기는 느낌이다. 어쨌든 VSCode를 실행하고 코덱스를 설치하게 되었다. 평소 웹에서 작업하다보니 VSCode에 설치된 코덱스가 익숙하진 않다. 뭐, 걱정할 필요는 없다. 화면을 캡쳐하고 챗지피티 또는 제미나이에 캡쳐화면 자체를 업로드하고 물어보면 된다. 화면 우측 하단에 프롬프트 입력창이 있다. ...

이 블로그의 인기 게시물

ChatGPT Codex GitHub 연결 해제 방법 (앱 삭제까지 정리)

UWP 지원 종료 확정? 2025년 이후 WinUI3 전환해야 하는 이유