본문 바로가기

Study_C, C++/홍정모의 따라하며 배우는 C언어

[홍정모의 따라하며 배우는 C언어] 9.3 함수의 자료형과 반환값

728x90

9.3 함수의 자료형과 반환값

  • 2개의 정수를 입력받아 가장 작은 정수를 출력하는 함수
#pragma warning (disable:4996)
#include <stdio.h>

int int_min(int, int);

int main(){
    int i1, i2;

    while(1){
        printf("Input two integers : ");

        if(scanf("%d %d",&i1, &i2) != 2) break;

        int lesser = int_min(i1, i2);

        printf("The lesser of %d and %d is %d\n",i1, i2, lesser);

    return 0;
    }

    printf("End.\n");
}

int int_min(int i1, int i2){
    int min;	// Local Variable. 이 함수 안에서만 존재하는 변수

    if(i1 > i2) min = i2;
    else min = i1;

    return min;	// 함수를 호출한 곳에 min 변수의 값을 돌려보냄(14번 줄)
}

 

 

  • int형 return type은 생략이 가능하다

함수의 Prototype, Main문, 함수 정의 부분에서 모두 'int'를 제거하였으나 문제 없이 Build가 되는 모습

 

  • 이는 Compiler가 함수의 반환 자료형이 없을 경우 int로 간주함을 의미
  • 단 혼동을 방지하기 위해 자료형은 가능한 생략하지 말 것
  • Ctrl + 좌클릭을 통해 함수의 정의 부분으로 이동할 수 있음
    • 이러한 단축키들을 익혀두면 코딩 속도를 향상시킬 수 있음

 

int int_min(int i1, int i2){
    int min;            

    // if(i1 > i2) min = i2;
    // else min = i1;

    // return min;         
    
    return (i1 < i2) ? i1 : i2;
}
  • Relational Operator(관계연산자)를 통해 위의 여러 줄을 한 줄로 줄일 수 있음

 

int int_min(int i1, int i2){
    int min;

    if(i1 > i2) min = i2;
    else min = i1;

    return (float)min;
}
  • Return 값을 Float로 변환하려 할 시 아래와 같은 Warning 발생

Output 창의 'conversion from 'float' to 'int', ... 부분

 

 

  • int 형을 float로 변환하였는데, 경고 창에는 오히려 float을 int로 변환하는 것에 대한 내용이 표시 됨
  • 이는 return 형이 int이므로, float로 바꿔 return을 시도하더라도 다시 int로 변환이 됨
  • 즉 내부적으로는 아래와 같음
int int_min(int i1, int i2){
    ... ...
    ... ...

    return (int)((float)min);
}
  • int 형을 지워도 위와 동일한 Warning 발생

 

int int_min(int i1, int i2){
    int min;       

    if (i1 < i2)
        return i1;
    else
        return i2;    
    
    printf("Who am I?");
}
  • 조건에 따라 함수의 return 값이 달라지는 함수
  • 함수에서는 return을 만나면 바로 함수가 종료 됨
  • 따라서 맨 아래의 printf문은 절대 실행되지 않음

 

int int_min(int i1, int i2){
    int min;          

    if (i1 < i2)
        return i1;
    // else
    //    return i2;    
    
    printf("Who am I?");
}
  • 위와 같이 한 분기의 return이 생략될 경우 아래와 같은 Warning이 발생
  • 즉 프로그램이 어떤 경로로 실행되던 return을 할 수 있도록 함수를 구현해야 함

 

int int_min(int i1, int i2){
    int min;    

    if (i1 < i2)
        return i1;
     else
        return i2;    
    
    printf("Error Occured");
    exit(1);
}
  • 혹은 위처럼 오류가 발생했음을 표시할 수 있음
  • Return Type이 void가 아닌 함수는 반드시 어떤 값을 Return해야 하는데, 위의 return 문들을 건너 뛰고 아래의 printf문에 도달했다는 것은 어떤 오류가 발생했음을 의미
  • 따라서 그 경우 오류가 발생했음을 알리는 역할을 할 수 있음

 

9.4 변수의 영역과 지역변수

  • 변수의 사용 가능 범위에 대한 문법적인 설명
  • 변수는 유효한 영역이 정해져 있으며, 그 영역 안에서만 변수를 보고 사용할 수 있다

 

  • 예를 들어, 위처럼 함수 'int_max'에서 선언한 변수 'm'은 함수 int_max에서만 사용할 수 있다
    • 즉 변수 'm'이 유효한 범위는 함수 int_max의 블록 안이다
  • 이러한 개념이 내부적으로 사용되는 이유는 'Stack Frame' 으로 인함 (추후 설명)
  • 즉 함수 안에서 선언이 된 변수들은 그 함수 안에서만 보고 사용할 수 있다
    • 볼 수 있다는 것은 코드 상에서 볼 수 있다는 의미
    • Ex) int_max 함수에서 선언한 변수 'm'은 main문에서는 볼 수 없다

 

  • 즉 변수를 사용할 수 있는 영역은 그 변수가 선언이 된 영역
  • 영역은 C/C++에서는  '{ }' 로 표현

변수 'm'이 사용 가능한 영역

 

 

 

  • 위처럼 한 Local에서 선언된 변수는 그 Local 밖에서는 접근이 불가능하다

 

  • 이렇게 함수 등의 지역(Local) 안에서만 사용될 수 있는 변수를 '지역 변수(Local Variable)'라 부른다
    • 전체적이 아니라 지역적으로 사용된다는 의미

 

  • 지역 변수의 반대 개념으로는 전역 변수(Global Variable)이 있다
    • Global Variable은 File 전체에서 접근과 사용이 가능

 

 

  • 변수는 Memory 상에서 어떤 공간을 의미하는 명칭
  • 프로그래밍 시 메모리의 주소 자체를 직접 다루긴 어려우므로 사람이 인식할 수 있는 언어로써 메모리 상의 주소에 접근
  • 결국 변수를 통해 접근하는 것은 메모리 상의 공간에 접근하는 것
    • 메모리는 주소를 통해 접근
  • 이 때 사용하는 변수의 주소는 아래의 구문을 통해 확인이 가능하다

 

printf("The address of Variable a is : %p\n", &a);
  • 변수 앞에 Ampersand Operator '&'를 붙여 변수의 주소를 받아옴
  • Ampersand Operator '&'는 변수의 주소를 알려주는 Operator
  • Printf문 내의 'p'는 Pointer Type을 의미

 

 

 

#pragma warning (disable:4996)
#include <stdio.h>

int int_max(int, int);
int int_max(int i, int j) {
    int m;

    m = i > j ? i : j;

    return m;
}

int main() {

    int a;

    a = int_max(1, 2);      

    printf("%d\n", a);
    printf("%p\n", &a);     

    {
        // 새로운 지역
        a = int_max(4, 5);

        printf("%d\n", a);
        printf("%p\n", &a);
    }

    printf("%d\n", a);
    printf("%p\n", &a);
}
  • main 문에서 선언된 변수 'a'를 총 3번에 걸쳐 출력

 

  • 코드 실행 결과
  • 3개의 주소값이 모두 동일 : 모두 같은 변수
    • 즉 위의 서로 다른 지역에 있는 3개의 a는 모두 같은 변수

 

#pragma warning (disable:4996)
#include <stdio.h>

int int_max(int, int);
int int_max(int i, int j) {     
    int m;

    m = i > j ? i : j;

    return m;
}

int main() {

    int a;

    a = int_max(1, 2);

    printf("%d\n", a);
    printf("%p\n", &a);     

    {
        int a;      // 안쪽 영역에서 이름이 동일한 변수를 하나 더 선언

        a = int_max(4, 5);

        printf("%d\n", a);
        printf("%p\n", &a);
    }

    printf("%d\n", a);
    printf("%p\n", &a);
}
  • 안쪽 영역에서 'a'를 다시 선언

 

  • 주소가 달라짐
  • 안쪽 영역에서 선언된 변수 'a'는 바깥쪽의 변수와 다른 변수임
  • 바깥쪽의 'a'는 서로 같은 변수
    • 안쪽의 'a'는 안쪽에서만 사용
  •  위처럼 한 변수가 여러 영역에서 선언될 경우, 해당 변수는 지역에서 새로 선언된 변수로 바뀜

 

 

 

 

 

 

 

 

 

 

 

 


강의 출처 : https://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 | 홍정모 - 인프런

홍정모 | '따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 프로그래밍 인생, 한 단계 업그

www.inflearn.com