변수

학습 목표

  1. 변수를 선언할 수 있다.

  2. 콘솔에 변수값을 출력하고 입력 받을 수 있다.

표준 출력 함수 : printf

  • 문자열을 콘솔창에 출력하는 함수로 stdio.h 파일안에 있다.

    • 문자열은 쌍따옴표("") 안에 있는 문자들이 문자열이다.

    • 문자는 따옴표('')안에 있는 문자 1개가 문자이다.

  • 기본 사용 예시

    #include <stdio.h>
    int main(){
       printf("Hello world\n");
       return 0;
    }
  • printf함수로 변수값을 출력하기 위해선 서식문자가 필요하다.

    • 대표적인 서식 문자 종류

      서식문자자료형비고
      %c문자문자 출력
      %dint정수 출력
      %lldlong long정수
      %ffloat실수 출력
      %lfdouble실수 출력
      %schar 배열, 문자열문자열 출력
    • 문자열 안에 있는 서식문자 갯수 만큼 문자열 뒤에 ,와 값(상수 또는 변수 또는 식)이 와야 한다.

    • 예시


      #include <stdio.h>
      int main(){
         int num = 10, num2 = 20;
         char op = '/';
         double res = 0.5;
         //%.2lf는 소수점 둘째자리까지 출력
         //서식문자가 4개이므로 ,값이 4개 와야 한다.
         printf("%d %c %d = %.2lf\n",num1, op, num2, res);
         //출력 결과
         //10 / 20 = 0.50
         return 0;
      }

표준 입력 함수 : scanf

  • 콘솔에서 입력받은 값을 변수에 저장하는 함수로 stdio.h 파일안에 있다.

  • printf 함수는 문자열 안에 서식문자 수만큼 값이 와야 한다면 scanf는 서식문자 수만큼 주소가 와야 한다.

  • 주소 연산자 : &

  • 예시 - 한개씩 입력받는 예시

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    int main(){
       int num;
       char op;
       double res;
       printf("정수를 입력하세요 : ");
       scanf("%d",&num);
       printf("문자를 입력하세요 : ");
       /*
       문자 입력 시, 문자 입력하기 전 다른 변수를 입력받았다면 %c앞에 공백 필수,
       안넣으면 엔터가 자동으로 %c를 통해 op에 저장
       */
       scanf(" %c",&op);
       printf("실수를 입력하세요 : ");
       scanf("%lf",&res);
       printf("num = %d, op = %c, res = %.2lf\n", num, op, res);
       return 0;
    }
  • 예시 - 여러개 입력받는 예시

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    int main(){
       int num;
       char op;
       double res;
       printf("정수, 문자, 실수를 입력하세요 : ");
       scanf("%d %c %lf", &num, &op, &res);
       printf("num = %d, op = %c, res = %.2lf\n", num, op, res);
       return 0;
    }
  • scanf 사용 시 다음과 에러가 나오는 경우

    심각도 코드  설명  프로젝트    파일     비표시 오류(Suppression) 상태
    오류 C4996 'scanf': This function or variable may be unsafe.
    Consider using scanf_s instead. To disable deprecation,
    use _CRT_SECURE_NO_WARNINGS. See online help for details.
    • 원인 : 컴파일러 버전이 높아 scanf 대신 scanf_s함수를 사용하기를 권장

    • 해결방법

      • 방법1 : scanf_s 사용

      • 방법2: scanf를 사용하기 위해 다음 코드를 첫줄에 추가


        #define _CRT_SECURE_NO_WARNINGS


변수

학습 목표

  1. 변수를 선언할 수 있다.

  2. 콘솔에 변수값을 출력하고 입력 받을 수 있다.

변수

정의

  • 데이터를 저장하기 위한 물리적인 공간

변수 선언 방법

  • 문법

    자료형 변수명;
  • 예시

    int num1;              //정수형 변수 num1 선언
    int num2 = 10;      //정수형 변수 num2를 선언 후 10으로 초기화
    int num3 = 0x10//정수형 변수 num3을 선언 후 16진수 10으로 초기화(10진수로 16)
    int num4 = 010;   //정수형 변수 num4를 선언 후 8진수 10으로 초기화(10진수로 8)
    int num5 = 'A';     //정수형 변수 num5를 선언 후 A의 아스키 코드값 65로 초기화
    int num6 = 1.23;  //정수형 변수 num6를 선언 후 1로 초기화(0.23은 버려지며 경고가 뜸)
    char ch1 = 'A';      //문자형 변수 ch1를 선언 후 문자 A로 초기화
    char ch2 = 65;      //문자형 변수 ch2를 선언 후 아스키코드값 65에 해당하는 문자 A를 저장

자료형

  • 주요 자료형

    자료형크기(Byte)종류
    char1문자(정수)
    int4정수
    long long8정수
    float4실수
    double8실수
  • 정수형 자료형의 표현 범위

  • 실수형 자료형의 소수점 유효숫자

    • float : 7자리

    • double : 15자리

  • unsigned

    • 부호가 없는 이라는 의미로 정수형 변수 앞에 붙일 수 있으며 양수만 표현 가능

변수명 작성 규칙

  • 영어 대소문자, 숫자와 특수문자 일부만 사용 가능

    • 사용 가능 특수문자 : _ (언더바), $

    int _num; //가능
    int $num; //가능
    int #num; //에러
    int *num; //가능, 일반변수가 아닌 포인터 변수
  • 첫 글자는 숫자가 올수 없다

    int 1num;//에러
  • 대소문자를 구별한다.

    //다음 세 변수는 다 다른 변수이다.
    int num;
    int Num;
    int NUM;
  • 변수명 중간에는 공백을 입력할 수 없다.

    int nu m1;//에러
  • 중복된 변수를 선언할 수 없다.

    int num;
    int num;//에러 중복 선언
  • 변수명은 예약어를 사용할 수 없다.

    • 예약어는 컴파일러와 사용 방법이 약속된 단어

    • 사용 툴에 따라 다를 수 있지만 일반적으로 변수와 다른 색상을 가진다.

    int int;//에러 예약어 사용


 디버깅은 코드를 단계별로 실행하여 이상 동작이 발생한 부분을 살펴볼 때 사용됩니다. 이번 시간에는 Visual Studio 2019 디버깅 과정에 대해 살펴보겠습니다. 

1. 디버깅 시작 지점 설정

 소스 파일 줄 표시하는 숫자 앞 회색부분을 클릭하면 빨간 원이 생기며, 빨간원은 여러개 지정할 수 있습니다.단, 프로그램 시작 시 먼저 만나는 빨간 원이 디버깅 시작지점이 됩니다.

2. 디버깅 시작 하기

 보통 코드를 실행할 때 디버깅하지않고 시작하기(단축키 Ctrl+F5)를 하는데 디버깅을 하려면 디버그 메뉴에 디버깅 시작(단축키 F5)을 누릅니다.

 디버깅이 시작되고 처음 만나는 빨간 원에 노란색 화살표가 생기면서 프로그램이 대기를 합니다.

 위의 화면을 설명하자면 처음 만나는 빨간 원이 있는 6줄에 노란 화살표가 생겼으며, 해당 지점에서 대기중인 상황입니다. 화면 하단에 로컬을 보면 6줄이 실행되기전을 기준으로 i,j는 값이 초기화 되어 있지 않아 -858993460(저는 쓰레기값이라고 부릅니다.)가 들어가 있는 것을 볼 수 있습니다. 그리고 row는 초기값이 5가 들어가 있는 것을 볼 수 있습니다.

3. 다음 단계 넘어가기

 현재 디버깅중인 줄을 기준으로 다음으로 넘어가는 방법은 다음과 같습니다.

 3.1 한 단계씩 코드 실행(단축키 F11)

 - 현재 라인에 함수가 있으면 해당 함수가 구현된 시작점으로, 반복문이나 조건문이면 괄호안으로 들어가 세부 내용을 살필 때 사용합니다.

 3.2 프로시저 단위 실행(딘축키 F10)

 - 함수 세부 내용을 살피지 않고 함수가 호출됐을 때 결과 단위로 실행할 때 사용합니다.

 3.3 프로시저 나가기(단축키 Shift + F11)

 - 함수 세부 내용을 살피지 않고 빠져 나갈 때 사용합니다.

 3.4 계속

 - 현재 줄에서 자동으로 진행되어 다음 빨간원을 만나면 멈출 때 사용합니다.

4. 디버깅 확인하기

 디버깅에서 확인해야 할 내용은 해당 단계에서 로컬에 나와있는 변수의 값이 맞는지 확인하고 진행 과정이 생각한 것과 같은지 확인하면서 다르면 왜 다른지 확인하면서 디버깅을 합니다.

5. 조사식 확인하기

 로컬에서 보여주는 값 이외에 식들을 입력하여 확인하고 싶을 때 조사식을 이용하면 됩니다. 메뉴에서 디버그 > 창 > 조사식 > 조사식 숫자를 클릭하면 됩니다.

 보통 하단에 조사식창이 생기며 클릭 후 원하는 식을 입력하여 값을 확인해볼 수 있습니다.

 이것으로 Visual Studio 2019 디버깅 사용하기를 마치도록 하겠습니다.

 도움이 되셨다면 광고 클릭!

 이번 시간에는 프로그래밍 입문자들이 어려워 하는 함수 생성하는 과정에 대해 살펴보겠습니다. 여기서는 함수 구현이 아닌 함수 선언부를 어떻게 작성하는가에 대해 살펴볼것입니다. 먼저 함수를 생성할 때 다음 질문들을 고려해야 합니다.

  • 함수명은 어떻게 지어야 하는가?
  • 매개변수(또는 인자)는 어떤 것으로 설정해야 하는가?
  • 리턴값은 어떤 것으로 설정해야 하는가?

 위 질문들의 답을 살펴보면서 함수 생성하는 과정에 대해 살펴보겠습니다.

1. 함수명은 어떻게 지어야 하는가?

 함수명은 해당 함수명을 보고 기능이 유추가능하도록 의미있게 짓는 것이 좋습니다. 우리가 자주 쓰는 printf()함수를 보면 출력과 관련된 기능이라는 것을 유추할 수 있습니다. 만약 기능은 콘솔화면에 문자열을 출력하는 기능인데 함수 명을 scanf()로 짓는다면 해당 함수를 사용하는 입장에서는 황당할 수 있습니다.

2. 매개변수는 어떤 것으로 설정해야 하는가?

 매개변수는 함수를 실행하기 위해 필요한 정보인 입력에 해당합니다. 그리고 필수적이인 정보들을 매개변수로 설정해야합니다. 아래 예시를 보면서 매개변수를 어떻게 설정해야 하는지 생각해봅시다.

 상황1

  • 선생님 : A학생 두 수를 더해보세요.
  • A학생 : 더해야 하는 두 수가 뭐죠?

 상황2

  • 선생님 : A학생 두 수 1과 2를 더해보세요.
  • A학생 : 3입니다.

 상황3

  • 선생님 : A학생 두 수 1과 2와 3을 더해보세요.
  • A학생 : 두 수가 아니라 세 수인데요?

 위의 상황들을 살펴보면 선생님의 질문으로 가장 옳은 상황은 상황 2라는 것을 알 수 있습니다. 상황 1은 정보가 적어서 문제가 발생하고 상황 3은 정보가 너무 많아서 문제가 발생합니다. 매개변수도 마찬가지입니다. 상황 1과 같이 정보가 적으면 동작을 실행할 수 없고 상황 3처럼 많으면 동작은 실행되지만 불필요한 정보를 전달하게 됩니다.

 하지만 함수의 재사용성을 위해 상황에 따라서는 매개변수가 늘어 날수 있습니다. 아래 예시를 통해 함수의 재사용성을 위해 매개변수가 추가된 상황을 살펴봅시다.

  • void printStar1() : *을 5개 찍어주는 함수
  • void printStar2(char star) : star문자열을 5개 찍어주는 함수
  • void printStar3(char star, int count) : star문자열을 count개 찍어주는 함수

 위 함수들중에서 문제점은 다음과 같습니다.

  • printStar1()에서 출력하는 모양이 *이 아닌 ☆을 출력하고 싶다면 새로운 함수를 만들어야 한다.
  • printStar2()에서 찍어주는 갯수를 5개가 아닌 6개를 하고 싶다면 새로운 함수를 만들어야 한다.

 따라서 printStar3()처럼 재사용성을 위해 매개변수가 늘어날 수 있습니다.

3. 리턴값은 어떤것으로 설정해야 하는가?

 리턴값은 해당 함수를 호출한 함수가 원하는 값으로 설정해야합니다. 예를 들면 두 정수를 더해서 콘솔에 출력하는 함수가 있다면 해당 함수는 콘솔에 출력하고 끝내면 되기 때문에 리턴값이 void입니다. 하지만 두 정수를 더해서 해당 결과를 알려주는 함수가 있다면 리턴값은 두 정수의 합인 int가 됩니다.

4. 함수를 만드는 과정

  1. 생성하려는 함수의 기능을 최대한 자세히 풀어씁니다.
  2. 풀어쓴 기능에서 매개변수, 리턴값을 설정합니다.
  3. 함수명을 설정합니다.
  4. 함수 선언부를 작성하고 구현합니다.
  5. 생성한 함수를 main함수에서 테스트합니다.

 아래 예시는 위 과정을 토대로 만들어진 두 정수의 합을 구하는 함수입니다.

1
2
3
4
5
6
7
8
9
10
11
12
/*
기능 : 두 정수 num1과 num2가 주어지면 두 정수의 합을 알려주는 함수
매개변수 : 두 정수 num1,num2 => int num1, int num2
리턴타입 : 두 정수의 합 => int
함수이름 : sum
함수선언 
리턴타입 함수이름(매개변수)
*/
int sum(int num1, int num2){
  return num1 + num2;
}
 
 
 

 이상으로 함수 생성 과정에 대해 마치도록 하겠습니다. 질문이 있으시면 댓글에 남겨주세요. 긴 글을 읽어주셔서 감사합니다.

+ Recent posts