1절 함수의 개념
1. 함수란?
n 함수(function) : 특정 작업을 수행하는 명령어들의 모음에 이름을 붙인 것
n 함수를 호출해서 작업 시킬 수 있음
n 함수는 작업에 필요한 데이터를 전달받을 수 있으며, 작업이 완료된 후에는 작업의 결과를 호출자에게 반환
n 특정한 일을 수행하는 코드 블록
n 함수들의 집합 중 main( )함수는 꼭 있어야 함
1) 함수의 필요성
u 함수를 이용하면 여러 번 반복 처리되는 단계를 하나로 모아서 필요할 떄 언제든지 호출하여 사용 가능
u 함수는 특정 작업 수행하기 위한 명령어들의 모임!
u 함수 호출 시 컴퓨터는 호출된 함수 안의 명령어들 수행하고 결과 반환
(1) 함수는 서로 구별되는 이름 가짐
(2) 함수는 특정한 작업을 수행
(3) 함수는 입력을 받을 수 있고, 결과를 반환할 수 있음
2) 함수의 중요성
u 프로그램을 구성하는 기본적인 구성요소
u 한 번 만들어지면 다른 프로그램에서도 재사용 가능
u 함수를 적절히 사용하면 가독성과 유지관리가 좋아짐
3) 함수를 사용하는 이유
(1) 코드의 중복을 막을 수 있음
o 여러 번 호출하여 사용할 수 있기 때문에 소스 코드 중복시킬 필요 없음
o 소스 코드의 양을 줄일 수 있음
(2) 한 번 제작된 함수는 다른 프로그램을 제작할 때도 사용 가능
o 소스 코드를 그대로 옮기기만 하면 재사용 가능
(3) 복잡한 문제를 단순한 부분으로 분해할 수 있음
o 개발 과정이 쉬워지고, 보다 체계적이고 유지보수 쉬워짐
o 모듈!
2. 함수의 종류
1) 라이브러리 함수
u 컴파일러에서 지원하는 함수들
2) 사용자 정의 함수
2절 라이브러리 함수
l 라이브러리 함수를 사용하려면 해당 함수의 원형을 포함하고 있는 헤더파일을 프로그램에 포함하도록 #include 지시자를 명시
1. 라이브러리 함수의 호출
n 함수명 정확히 명시
n 함수 실행될 때 필요한 정보인 인수를 개수와 자료형에 맞춰 순서대로 정확히 기술
2. 라이브러리 함수의 종류
1) 수학과 관련된 함수 : #include<math.h>가 필요
u 라디안! 180° = π -> 각도 라디안 변환 -> (π * 각도)/180
2) 문자와 관련된 함수 : #include<ctype.h>가 필요
3) 문자열과 관련된 함수 : #include<string.h>가 필요
4) 그 외 범용 함수 : #include<stdlib.h>가 필요
3절 사용자 정의 함수
1. 사용자 정의 함수의 호출과 정의
n 사용자 정의 함수 정의
반환형 함수명 (매개변수 선언 목록) {
함수에서 사용할 변수의 선언부
함수에서 처리할 명령의 선언부
return 반환 값;
}
n 매개변수는 일반변수와 다르게 각각 선언
n ‘매개변수 = 인수’와 같은 대입문 효과
n ‘함수 호출문 = 반환값’과 같은 대입문 효과
2. 인수와 매개변수에 대한 이해
n 함수는 서로 독립적인 개체로 특정 함수에서 선언한 변수(지역 변수)를 다른 함수에서 마음대로 참조, 출력, 변경할 수 없음
n 호출할 함수에 꼭 지정하고 싶은 값은 그 함수를 호출할 때 인수로 제공
3. 함수 원형 선언
1) 함수 호출과 함수 정의의 위치
u 함수는 서로 독립된 개체. 함수 안에 다른 함수 정의할 수 없음
u 함수의 정의가 끝난 후 다른 함수를 정의해야 함
u 함수의 정의는 함수 호출 전에 위치해야 컴파일 오류 안남
u 가독성을 위해 main함수를 맨 앞에 정의하므로, 그 앞에 함수의 원형 선언을 함
2) 함수 원형 선언
u 사용자 정의 함수를 함수 호출문 뒤에 정의하려면 원형 선언이 필요
u 프로그램 상단의 main() 함수를 정의하기 전에 둠
u 매개변수 자료형 목록은 언문 형태 or 자료형만 명시하는 형태 둘 다 가능
① (자료형1 매개변수1, 자료형2 매개변수2, … ,자료형n 매개변수n)
int func_large(int x, int y);
- 함수 원형 선언문은 문장의 끝에 반드시 ; 붙여야 함
- 함수의 최초 호출문보다 앞에 선언
② (자료형1, 자료형2, … , 자료형n)
int func_large(int, int);
- 매개변수 이름은 생략할 수 있으나 매개변수의 자료형은 반드시 명시
- 자료형은 함수의 정의에 나타나는 자료형과 같아야 함
4. 함수의 인수 전달 : 값에 의한 호출
1) 값에 의한 호출과 인수 전달 과정
u 호출할 때 명시한 인수의 값이 전달됨 -> 호출된 함수의 매개변수에 저장됨
u call of value
u 인수 : 값을 전달하므로 상수, 변수, 수식 가능
u 매개변수 : 값을 저장해야 하므로 변수만 가능
2) 값에 의한 호출과 함수 간의 독립성
u 함수 간의 독립성을 보장함
u 함수 실행이 끝나면 함수의 변수에 할당된 기억장소는 모두 해제됨
5. 여러 가지 함수의 유형
1) 매개변수가 없는 함수
u 매개변수 자리에 void 넣어 매개변수가 없음을 표기
u 괄호만 사용하는 것도 가능, void를 넣어 매개변수가 없음을 명시적으로 표시하자!
2) 반환 값이 없는 함수
u 선언과 정의의 반환형에 void 표기
u return문 생략 가능, return문이 없어도 함수의 코드를 모두 수행하면 호출된 곳으로 자동으로 돌아감
3) 반환 값과 매개변수가 모두 없는 함수
u 함수의 매개변수와 반환형에 모두 void 표기
4절 기억 클래스
1. 참조영역에 따른 구분
n 변수 참조는 변수의 참조영역 안에서만 가능
n 참조영역 : 프로그램에서 변수를 참조할 수 있는 영역, 변수의 참조가 유효한 영역
n 지역 변수는 함수 외부에서는 참조할 수 없고, 전역 변수는 모든 함수에서 참조할 수 있음
1) 지역 변수
u 함수(블록) 안에서 선언된 변수
u 변수가 선언된 함수(블록) 안에서만 참조할 수 있음
u 지역 변수의 참조영역은 그 변수가 선언된 함수(블록) -> 함수를 벗어난 곳에서는 참조 불가
(1) 지역 변수의 선언 위치
o 블록의 어디서든지 변수 선언할 수 있음
o { }이기만하면 됨. for문, while문 등!
(2) 이름이 같은 지역 변수
o 다른 지역 안에 동일한 이름이 있어도 컴파일 오류 발생하지 않음
(3) 지역 변수의 생존 기간
o 변수가 선언된 블록이 시작할 때 시스템 스택이라 불리는 메모리 공간에 만들어지며 동시에 초기화됨
o 지역 변수에 할당된 메모리 공간은 블록 끝에서 반환됨
o 전역 변수는 프로그램이 시작되기 전에 만들어지고 프로그램 끝날 때 까지 계속 존재함
(4) 지역 변수의 초기값
o 지역 변수의 초기값을 정해주지 않았다면 아무런 의미 없는 값이 들어있음-> 쓰레기값
(5) 함수의 매개 변수
o 함수의 헤더 부분에 정의되어 있는 매개변수도 일종의 지역 변수임
o 호출 시의 인수 값으로 초기화되어 있음(지역 변수와 다른 점)
o 함수 내부에서는 지역 변수처럼 사용할 수 있음
2) 전역 변수
u 함수 외부에서 선언되는 변수
u 참조 영역 : 소스 파일 전체
u 모든 함수에서 접근가능하고 사용이 가능한 변수
(1) 전역 변수의 초기값과 생존기간
o 프로그래머가 전역 변수를 초기화하지 않으면 컴파일러에 의해 0으로 초기화됨
o 프로그램 시작과 동시에 생성되어 프로그램이 종료되기 전까지 메모리에 존재
(2) 전역 변수의 사용
o 어디서나 접근이 가능하다는 장점 / 단점
o 전역 변수로 데이터 교환을 하는 것보다는 알맞게 잘 정의된 인터페이스를 통해 데이터 교환을 하는 편이 더 수월
o 전역 변수들로 인해 코드가 꼬이는 현상 -> 스파게티 코드
o 프로그램을 작성할 때 모듈화 프로그래밍을 해야 하는데, 전역 변수는 사용하지 않는 편이 좋음
o 함수간의 독립성을 보장하기 위해
-> 거의 모든 함수에서 공통적인 데이터는 전역 변수
-> 일부의 함수들만 사용하는 데이터는 지역 변수
(3) 같은 이름의 전역 변수와 지역 변수
o 전역 변수와 이름이 같은 지역 변수를 선언하면 지역 변수가 전역 변수보다 우선시 됨
o “지역 변수가 전역 변수를 가린다.”
2. 지속기간에 따른 구분
n 변수의 기억장소는 변수 선언 방법에 따라 존재기간이 달라짐
n 지속기간, 수명 : 변수에 할당된 기억장소가 존재하는 기간
n 변수의 수명이 끝났다 = 변수의 기억장소가 존재하지 않는다 = 해당 변수를 사용할 수 없다
1) 자동 변수
u 변수의 지속기간이 함수의 실행 시작부터 끝까지로 한정됨
u 반환형 함수명 (매개변수 선언 목록) {
auto 자료형 자동변수명;
}
(1) 자동 변수의 선언과 지속기간
o 함수가 호출되면 변수에 기억장소가 할당 -> 실행 끝나면 변수 기억장소 해제
o 기억 장소의 동적 할당!
o auto 생략 가능. 지역 변수는 모두 자동 변수에 해당
o 반환형 함수 (매개변수 선언 목록){
auto 자료형 자동변수명;
…}
(2) 변수의 기억장소 할당과 자동 초기화
o 컴파일 하면
o 전역 변수는 프로그램이 실행될 때부터 기억장소를 할당 받고 자동으로 0으로 초기화됨
o 자동(지역) 변수는 기억장소 할당 받아도 자동으로 초기화 되지 않음 -> 쓰레기값
2) 정적 변수
u 동적 : 무언가 실제로 필요할 때마다 처리되는 것
u 정적 : 필요한 것을 미리 처리해두고 처음부터 끝까지 고정적으로 유지하는 것
u 정적 변수는 정적 할당과 관련됨
u 함수 안에서 정적 변수로 선언한 변수는 함수 실행과 상관없이 프로그램 실행 시작부터 끝까지 기억장소 차지 -> 마지막 함수 호출에서 저장된 값을 유지 가능
u 정적 변수 : 프로그램이 실행될 때부터 기억장소를 정적으로 할당받아 실행이 끝날 때 까지 유지되는 변수 (정적 전역 변수 / 정적 지역 변수)
u static 자료형 정적 변수명; (초기화 가능)
(1) 정적 지역 변수
o ‘static’을 변수 앞에 붙여 함수 안에서 선언한 변수
o 초기값을 주지 않아도 자동으로 0으로 초기화 됨
o 함수 안에서만 참조할 수 있지만 프로그램의 실행 시작부터 끝까지 기억 장소를 차지 -> 이전 함수 실행에서 저장된 값이 사라지지 않음
o 값 보존하고 싶은 경우 사용
(2) 정적 전역 변수
o 함수 외부에서 선언한 정적 변수
o 선언한 이후로 프로그램 어디서나 참조할 수 있음
o 초기값 주지 않으면 자동으로 0으로 초기화됨
o 변수를 선언한 소스 파일에서만 전역으로 참조할 수 있고, 다른 소스 파일에서는 참조할 수 없음
그냥 전역 변수! 는 다른 소스 파일에서도 동일한 전역 변수로 참조 가능 -> 사용하고 싶은 전역 변수를 외부 변수로 지정해야 함
3) 레지스터 변수
u 일반 변수는 주기억장치의 일부분을 할당 받으나 레지스터를 할당 받는 변수가 레지스터 변수
u 레지스터 변수는 지역변수만 가능
u 레지스터 변수는 CPU 자원을 잠깐 빌리는 것 -> 프로그램 실행하는 동안 계속 저장 공간을 확보해야 하는 전역변수는 레지스터에 할당할 수 없음
u 저장 공간이 메모리에 있는 것이 아니므로 주소 연산자를 써서 포인터를 구할 수 없음
u 레지스터 변수의 선언이 레지스터의 사용을 보장하는 것은 아님
u register 자료형 레지스터 변수명;
4) 외부 변수
u 프로젝트 하나를 여러 파일로 나누어 개발하는 경우 모든 파일에 공통으로 동일하게 사용하고 싶은 전역 변수가 있다면 main()함수 이전에 전역 변수 선언하고 다른 프로그램 파일에서는 이 변수를 외부 변수로 선언
u main()함수 있는 파일에 있는 전역 변수를 다른 파일에서 extern 으로 선언하여 사용
u 전역 변수를 사용하는 소스파일을 #include로 포함시켜야 됨
u 다른 파일에서 정의한 함수의 원형 선언도 명시해야함
'[시험] 독학사 2020 전공기초' 카테고리의 다른 글
[독학사][C프로그래밍] 07 구조체와 공용체 (0) | 2020.04.28 |
---|---|
[독학사][C프로그래밍] 06 배열과 포인터 (0) | 2020.04.28 |
[독학사][C프로그래밍] 04 제어문 (0) | 2020.04.28 |
[독학사][C프로그래밍] 03 입 ∙ 출력함수와 연산자 (0) | 2020.04.28 |
[독학사][C프로그래밍] 02 자료형과 선행처리기 (0) | 2020.04.28 |