2학기 5주차 과제
함수의 입력과 출력
● 입력
- 매개변수, 인자
● 출력
- 반환값, 리턴값
- 함수가 돌려주는 결과값
● void
- 리턴값이 없으면 리턴형 쓰는 자리에 void
- 매개변수가 없으면 매개변수 쓰는 자리에 void(이 경우는 생략 가능)
함수 정의, 호출, 선언
● 함수 정의
- 함수 만들기
- 이름, 매개변수, 리턴형, 기능
● 함수 호출
- 함수 사용하기
- 이름, 매개변수
● 함수 선언
- 함수의 사용법
- 이름, 매개변수, 리턴형
- 컴파일러에게 함수에 대한 정보를 미리 줌
#include <iostream>
using namespace std; //그다지 좋은 방법은 아님!
string vending(int x)
{ //std::string
if (x == 1) return "커피";
else return "유자차";
}
int main()
{
cout << vending(1);
return 0;
}
출력결과 : 커피
# using namespace std 를 이용해 string 앞에 'std::' 를 안써도 되지만 그다지 좋은 방법은 아님!
#include <stdio.h>
int main(void)
{
printf("메인 함수 : view호출 전\n");
view(); //함수 호출
printf("메인 함수 : view호출 후\n");
return 0;
}
void view(void) //함수 정의
{
printf("view함수\n");
}
-> 컴퓨터는 위에서부터 컴파일을 함. 따라서 함수의 정의가 안된 상태에서 view 함수를 호출했기 때문에 오류가 남
첫번째 방법 : 먼저 사용한다고 알려둠(?) -> 함수의 선언 또는 원형이라고 함
#include <stdio.h>
void view(void); //함수의 선언 또는 원형
int main(void)
{
printf("메인 함수 : view호출 전\n");
view(); //함수 호출
printf("메인 함수 : view호출 후\n");
return 0;
}
void view(void) //함수 정의
{
printf("view함수\n");
}
두번째 방법 : void view(void) 를 int main(void) 보다 앞에 쓰기
#include <stdio.h>
void view(void) //함수 정의
{
printf("view함수\n");
}
int main(void)
{
printf("메인 함수 : view호출 전\n");
view(); //함수 호출
printf("메인 함수 : view호출 후\n");
return 0;
}
매개변수를 전달하는 방법
● C언어에서는 기본적으로 값에 의한 호출(call by value)
● 실매개변수의 값을 형식매개변수로 전달
● 이 방법은 실매개변수를 형식매개변수로 전달할 뿐 함수 내부에서 형식매개변수가 변경되더라도 실매개변수는 변경되지 않음
● 형식매개변수와 실매개변수를 같이 변하게 하려면 포인터를 이용하여 call byu reference로 구현해야 함.
값에 의한 호출(call by value) | 주소에 의한 호출(call by reference) |
실매개변수의 값을 형식매개변수로 전달 | 실매개변수의 주소를 형식매개변수로 전달 |
# 변수가 넘어가는 것이 아닌 변수의 값만 넘어갔기 때문에 마지막은 a=2, b=5가 출력됨
구조적 프로그래밍
● 함수는 큰 프로그램 하나를 여러 개의 모듈로 분할하여 구현하는 구조적 프로그래밍 방식의 기본이며 모듈화 프로그램이 가능하게 함
● 구조적 프로그래밍 스타일의 기본 개념은 "Divide and Conquer(나누어 정복)"로 각각의 기능(모듈)을 함수로 구현하여 합치는 것.
-> 헤더파일이 많아서 보기 힘듦. => 소스를 헤더파일과 C파일로 나누기
나눴는데 오류가 많이 뜸 => 전처리기를 이용하여 헤더파일과 C파일을 연결해야함
내가 만든 전처리기를 사용할 때는 꺽쇠가 아니라 큰 따옴표를 이용하여 사용함. => #include "score.h"
지역(locla)변수와 전역(global)변수
● 변수의 유효범위(scope)란 프로그램 내에서 변수가 사용될 수 있는 범위
- C언어에서는 지역(local)과 전역(global) 이라는 개념으로 변수가 사용될 수 있는 범위를 지정
● 지역 변수는 해당 함수나 블록({}) 내에서만 사용할 수 있고 전역 변수는 소스 전체에서 사용할 수 있음
● 지역 변수와 전역변수는 변수의 선언 위치에 따라서 결정됨
- 함수나 블록 안에서 변수를 선언하면 그 변수는 지역 변수가 되고, 함수 (보통 main()함수) 밖에서 선언하면
전역변수가 됨
자료형과 기억클래스
● 변수 선언시에 이용하는 예약어와 선언된 위치에 의해서 결정됨
● 기억 클래스는 변수의 값이 어떤 종류의 메모리에 저장되는지를 지정
● int형 변수는 4바이트인데 이 4바이트 공간이 주기억장치의 스택에 만들어지는지 CPU의 레지스터에 만들어지는지 등을 결정하는 것이 기억 클래스
자료형 | 기억 클래스 |
자료의 크기 결정 | 자료의 기억 위치(메모리의 종류) 스택, data영역, CPU의 레지스터 등 |
int, char, float, double | auto, static, extern, register |
기억 클래스 : 자동(auto)
● 가장 많이 사용하는 기억 클래스
● int 형 변수 a를 auto변수로 선언
- auto int a; // auto는 생략이 가능하여 이 선언문은 int a;와 같은 문장임
- 지금까지는 int a; 형태로 자료형만 명시했는데 자료형인 int 앞에 기억클래스를 나타내는 auto.를 더 쓰면 됨
● auto 변수의 특징
1. 함수 또는 블록의 내부에서만 선언
2. 해당 함수나 블록 내에서만 유효한 지역변수
3. 기억클래스가 명시되지 않고 선언된 변수는 모두 자동 변수. 즉 auto는 생략이 가능
4. 스택(stack) 공간을 일시적으로 사용
5. 함수나 블록을 진입하면 기억 영역이 확보되고, 벗어나면 기억 영역은 바로 소거됨. 단, return 문으로 리턴된 값은 스택에 복사되어 외부로 전달됨.
6. 초기화는 실행시 이루어지며, 초기화하지 않으면 임의의 값(쓰레기 값, garbage value)을 가짐
기억 클래스 : 정적(static) 변수
● int형 변수 a를 정적(static) 변수로 선언
- static int a;
- 자료형인 int 앞에 기억 클래스를 나타내는 static을 더 쓰면 됨
● static 변수의 특징
1. 프로그램이 종료될 때까지 값을 유지
2. 처음 실행시 한번만 초기화되고 초기화 값이 없으면 0으로 초기화됨
3. 스택이 아닌 정적 데이터 영역을 사용
4. 지역 static변수는 해당 블록 내에서만 접근 가능
● static변수는 윈도우즈 프로그래밍할 때 많이 사용하므로 그 특징을 잘 알고 있어야 함
● 전역변수는 기본적으로 static이므로 static 키워드가 필요 없음
<기억 클래스 정리>
● 기억 클래스(auto, register, 지역 static)에 따른 변수들의 선언위치, 유효 범위, 파괴 시기, 초기값, 저장 장소
● 전역 변수의 특징도 비교를 위해서 함께 표시함
auto | register | (지역)static | 전역 | |
선언위치 | 함수(블록) 내부 | 함수(블록) 내부 | 함수(블록) 내부 | 함수 외부 |
유효범위 | 함수(블록) 내부 | 함수(블록) 내부 | 함수(블록) 내부 | 프로그램 전체 |
파괴시기 | 함수(블록)종료시 | 함수(블록) 종료시 | 프로그램 종료시 | 프로그램 종료시 |
초기값 | 초기화되지 않음 | 초기화되지 않음 | 0으로 초기화 | 0으로 초기화 |
저장장소 | 스택 | CPU의 레지스터 | 데이터 영역 | 데이터 영역 |
구조체
구조체란?
● 구조체는 이미 정의된 서로 다른 자료형(int, char, double 등의 변수와 배열, 포인터, 구조체도 포함됨)들을 구성요소로 하여 새로운 자료형을 만드는 것
● 그룹핑하면 프로그래밍하기 편리한 자료들을 하나로 묶는 것
● 배열을 사용하면 동일한 자료형 만을 한꺼번에 관리할 수 있지만 구조체는 상이한 자료형들을 한 묶음으로 관리할 수 있음.
# C : Man형이 아니라 struct Man 형
# C++ : Man형
● C++ 언어에서는 struct을 생략하고 구조체명과 변수명만 써도 됨
- struct Man minsu; //C style 구조체형 변수 선언, 확장자 .c
- Man minjung; // C++ style 구조체형 변수 선언, 확장자 .cpp