관리 메뉴

나구리의 개발공부기록

Chapter 02 - C언어(변수, 표준 입출력 함수) 본문

2024정보처리기사 준비 정리(필기 - 시나공, 실기 - 수제비)/실기 6강 - 프로그래밍 언어 활용

Chapter 02 - C언어(변수, 표준 입출력 함수)

소소한나구리 2024. 5. 19. 21:47

2024년도 수제비 실기책(6판) 내용 정리


4. 변수

1) 변수(Variable)의 개념

  • 저장하고자 하는 어떠한 값이 있을 때, 그 값을 주기억장치에 기억하기 위한 공간
  • 자료형과 변수명을 작성하여 변수를 생성하는 과정

변수의 개념도


2) 변수 선언(Variable Declaration)

  • 변수나 함수가 있음을 알려주는 행위
  • 변수가 어떤 자료형을 사용할지 알려주기 위해 사용함

    • 초기화 하지 않는 경우 : 자료형 변수명;
    • 초기화 하는 경우 : 자료형 변수명= 초깃값;
    • 초기화(Initialization) : 변수를 선언함과 동시에 변수에 값을 지정해 주는 과정
#include <stdio.h>  // stdio.h 헤더 파일을 읽어옴
int main(){
  char a;      // char(문자)형 변수 a 선언
  int b = 4;   // int(정수)형 변수 b를 선언하고 b를 4로 초기화
  float c, d;  // float(실수)형 변수 c, d를 선언
  double e=1.1, f=2.4; // double(실수)형 변수 e,f를 선언하고 e를 1.1로, f를 2.4fh 초기화
  return 0;
}

3) 변수 유효 범위(Variable Scope)

(1) 전역 변수 (Global Variable)
 

  • 어떤 블록{ } 에도 속하지 않는 변수이며 아무 곳에서나 사용할 수 있음
  • 프로그램이 시작되면 변수가 생성되고, 프로그램이 종료되면 변수가 소멸됨
  • 초기화 하지 않으면 정수형은 0, 실수형은 0.0, 문자형은 null(아스키코드0 == null)로 초기화됨
#include <stdio.h>

int a = 5;  // a라는 정수형 전역 변수에 5를 대입(Assignment)

void fn(){    // 반환값이 없는 fn 함수
  a = a + 3;  // fn함수가 호출되면 실행될 코드
}

int main(){   // 프로그램이 실행되는 main함수
  a = a + 5;  // a에 5를 더해서 a에 저장, a에는 10이 저장됨
  fn();       // fn 함수 호출 -> a(10) + 3 을 a에 저장, a에는 13이 저장됨
  printf("%d", a);  // a를 출력 -> 13이 출력됨
  return 0;   // 프로그램 종료
}

 
(2) 지역 변수 (Local Variable)
 

  • 블록{ } 내에서 선언하는 변수이며 해당 블록 안에서만 사용할 수 있음
  • 블록이 시작되는 부분에 바로 선언해주어야 하고, 중괄호가 닫히는 시점에 소멸됨
#include <stdio.h>
int main(){

  int a = 3, b = 4;  // int타입 전역변수 a에 3을 b에 4를 초기화하고 선언
  
  {  // main함수 블록 안에서 또다른 블록 시작
    int a = 5;  // int타입 지역변수 a에 5를 선언
    printf("%d %d\n", a, b);   // 지역변수 a와 전역변수 b의 값을 출력 -> 5, 4
  }  // 내부 블록 종료
  
  printf("%d %d\n", a, b);  // 전역변수 a와 b의 값을 출력 -> 3, 4
  return 0;
  
}

 
(3) static 변수 (Static Variable)
 

  • 블록 내외부 상관없이 선언할 수 있는 변수
  • 변수 선언할 때 static이라는 키워드를 붙여줌
  • 블록 내외부 상관없이 프로그램이 시작되면 변수가 생성되고, 프로그램이 종료되면 변수가 소멸됨
  • 전역 변수로 선언할 경우 프로그램 전체에서 사용할 수 있고 블록 내에 선언할 경우 블록 내에서만 사용할 수 있음
#include <stdio.h>

void fn(){  // fn함수 정의 시작
  static int a = 3;  // static int타입 변수 a에 3을 초기화,
  // static 변수는 함수 안에 선언되어있어도 함수의 호출과 상관없이 선언 및 초기화가 먼저 됨
  
  a = a + 1;    // 스태틱 변수 a에 1더해서 a에 저장
  printf("%d\n", a);  // a의 값을 10진 정수형식으로 출력
}

int main(){
  // 프로그램 실행 시 static 변수 a는 초기화가 되었으므로 함수가 호출 되어도 다시 초기화가 되지 않고
  // 값이 계속해서 누적해서 쌓이게 됨
  fn();    // fn함수 호출 -> a는 4가 되고 4가 출력됨
  fn();    // fn함수 호출 -> a는 누적연산되여 5가 되고 5가 출력됨
  return 0;
}

5. 표준 입출력 함수

1) printf 함수

  • 지정된 포맷 스트링으로 데이터를 출력하는 함수
  • printf를 사용하기 위해서는 stdio.h 헤더를 선언해야 함

(1) 단순 출력
 

  • printf(문자열);
  • printf 함수 안에 큰따옴표로 묶여 있는 문자열을 출력
#include <stdio.h>
int main(){
  printf("Hello C World"); // 문자열 Hello C World 출력
  return 0;
}

// 출력 Hello C World

 
(2) 이스케이프 문자를 이용한 출력
 

  • 이스케이프 문자는 문자열 내에서 특수한 기능을 수행하는 문자
  • 이스케이프 문자를 printf 함수의 큰다옴표 안에 넣어서 입력
종류 의미 설명
\n New Line 커서를 다음 줄 앞으로 이동 (개행)
\t Tab 커서를 일정 간격만큼 수평 이동
#include <stdio.h>
int main(){
  printf("Hello\tC\nWorld");
  
  /*
  C언어 에서는 printf("A
  "); 와 같이 코드를 작성하면 에러가 발생함, 한줄에서 코드가 끝나야됨
  만약 개행을 하고 싶다면 printf("A\n 이렇게 개행문자를 작성해야 에러가 발생하지 않음
  */
  
  return 0;
}
// 출력 Hello	C(탭 공간만큼 간격을 띄우고 C가 출력됨)
//     World

 
(3) 포맷 스트링을 이용한 변수 출력
 

  • 일반적으로 scanf를 통해 사용자로부터 입력을 받아들이거나 printf를 통해 결과를 출력하기 위하여 사용하는 형식
  • 인자에는 변수명, 값, 수식이 올 수 있음
  • printf(포맷_스트링이_포함된_문자열, 인자, ...);
유형 설명 의미 설명
문자
(Character)
%c Character 문자 1글자에 대한 형식
문자열
(String)
%s String 문자가 여러 개인 문자열에 대한 형식
정수
(Integer)
%u Usigned Decimal 부호 없는 10진수 정수
%d Decimal 10진수 정수
%o Octal 8진수 정수
%x
%X
Hexa Decimal 16진수 정수,
%x일 경우 영어로 표기되는 부분이 소문자로, %X일 경우 대문자로 표시됨
부동 소수점
(Floating Point)
%e
%E
Exponent 지수 표기
%e는 지수 표현을 e로하고 %E는 E로 함
%f Floating Point 부동 소수점 표기
%lf Long Floating Point
#include <stdio.h>
int main(){

  int a = 4, c = 5;
  char b = 'A';
  // a를 10진 정수형태로 b를 문자형태로 출력, 작성된 포맷 스트링의 순서에 맞게 변수가 출력 됨 
  printf("a는 %d, b는 %c 입니다.", a, b);
  printf("%d", a + c); // a + c 가 연산된 값이 %d(10진수 정수) 형태로 출력됨
  return 0;
}
// 출력 a는 4, b는 A입니다.9

 
(4) 포맷 스트링을 이용한 변수 상세 출력
 

  • 포맷 스트링을 이용하면 정렬, 0 채우기, 출력할 공간 확보, 소수점 자릿수 표기를 지정할 수 있음
  • %[-][0][전체자리수].[소수점자리수]스트링
포맷 스트링 설명
[-] [-]를 붙히면 왼쪽 정렬, [-]를 붙히지 않고 [전체자리수]가 정해져 있을 경우 오른쪽 정렬
[0] [0]을 붙이면 전체 자릿수에서 앞에 빈공간 만큼 0으로 채움
[전체자리수] [전체자리수]만큼 공간이 확보되며 소수점.도 한 자릿수로 포함됨
.[소수점자리수] [소수점자리수]만큼 소수점이 출력됨, 실수형일 때만 적용
#include <stdio.h>

int main(){

  float a = 1.234;
  int b = 10;
  
  printf("%.2f\n", a); // 소수점 줄째 자리까지 출력(반올림 적용) 1.23 출력 후 개행
  
  // 소수점을 포함하여 전체 자리수를 5칸으로 설정하고 소수점 첫째 자리까지 출력(반올림 적용)
  // 앞에 공백을 2번찍고 1.2를 출력 후 개행 -> '  '1.2(공백2번)
  printf("%5.1f\n", a);
  
  
  // 소수점을 포함하여 전체 자리수를 설정하고 소수점 첫째 짜리까지 출력(반올림 적용)
  // 001.2 처럼 공백 대신에 0으로 채우로 출력 후 개행
  printf("%05.1f\n", a);
  
  // 위와 동일하지만 -가 붙어있어서 0을 무시하고 왼쪽으로 정렬되어서 1.2가 출력되고 개행
  printf("-%05.1f\n", a);
  
  print("%5d\n", b); // 전체자리를 5자리로 하고 빈공간은 공백으로 출력 후 개행, '   '10(공백3번)
  print("%05d\n", b);  // 공백 대신 0으로 빈공간을 메우고 출력 후 개행, 00010
  print("%-5d\n", b);  // - 가 붙었으므로 빈 공간을 무시하고 왼쪽 정렬 출력 후 개행, 10
  print("%-05d\n", b);  // 위와 동일하게 출력됨(왼쪽 정렬이므로 0이 무시됨), 10
  
  return 0;
}

 


2) scanf 함수

  • 키보드로 입력받은 문자열에서 지정된 포맷 스트링으로 데이터를 읽는 함수
  • 포맷 스트링은 printf의 포맷 스트링과 동일함
  • scanf(포맷_스트링이_포함된_문자열, 변수의_주솟값, ...);
#include <stdio.h>
int main(){
  int a;
  char b;
  
  scanf("%d %c", &a, &b); // 만약 입력을 1B 이렇게 입력했다면,
  // 입력받은 첫 번째 값인 1은 10진 정수 형으로 변한되어 a에 저장
  // 두 번째 값인 B는 문자 형태로 b에 저장됨
  
  printf("a는 %d, b는 %c입니다.", a, b); // 출력도 1B 이렇게 됨
  
  return 0;
}
// 입력 1B
// 출력 a는 1, b는 B입니다.

 


3)  gets 함수

  • 매우 위험한 함수로 입력된 문자열이 배열의 크기를 초과하면 오버플로우를 발생함 'fgets' 함수가 대신 사용됨
  • 키보드로 입력받은 문자열을 문자형 배열에 저장하는 함수
  • gets(문자형_배열_변수);
  • gets 함수는 C11 이전 버전에서는 계속 사용할 수 있으나 C11 버전 부터는 완전히 제거되어서 사용할 수 없고 오버플로우가 방지된 fgets함수를 사용할 수 있음
#include <stdio.h>
int main(){
  char a[10];  // 길이가 10인 문자형 배열 변수 a을 선언
  gets(a);     // 문자열을 입력받아서 a에 저장
  printf("%s", a);
  return 0;
}