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  다른 파일에서 정의한 함수의 원형 선언도 명시해야함

 

 


+ Recent posts