728x90
반응형
함수
- 정해진 단위 작업을 수행하도록 명령문들을 하나의 그룹으로 묶는 것
- 작업 별 그룹으로 나누어 작성한 소스 코드는 관리하기 편하다.
- 코드 내용을 쉽게 이해가 가능하다.
- C언어는 소스코드를 그룹화하는 함수 문법을 제공한다.
# 함수의 필요성 - 그림으로 이해 ㅋㅋ
'물 마시기' 작업으로 묶어둔 것이 함수라고 할 수 있다.
함수 정의하기
- 함수이름 : 하는 일을 짐작하기 쉽게 짓기
- 매개변수 : 작업을 수행할 때 ~
- 작업 내용 :
- 반환값 :
함수 호출하기
- 함수가 다른 함수를 사용하는 것을 의미한다.
- C언어 프로그램은 함수가 다른 함수를 호출하면서 프로그램 진행
- 호출자 : 함수를 호출하는 함수
- 피호출자 : 호출되는 함수
- C언어 프로그램은 함수가 다른 함수를 호출하면서 프로그램 진행
함수의 반환값
- 함수를 종결시키는 예약어 -(return)
- 함수의 반환 값 : return 뒤에 명시된 변수 값이나 상수 값
- '함수가 값을 반환한다'는 의미 : 호출자의 어떤 변수에 값을 대입
- 함수 이름앞에 자료형이 없는 경우 : int 자료형이 생략된 것 But... 함수 이름앞에 자료형은 습관적으로 써두는 게 좋다 (팀 프로젝트)
# 함수의 반환값 참고
C언어 컴파일러의 동작
- 컴파일러는 소스 코드를 번역할 때, 위에서 아래로 쪽으로 번역한다.
- 피호출자가 호출자 위쪽에 있는 경우 오류가 발생하지 않는 이유
- 컴파일러가 번역할 때 피호출자의 매개변수 형태, 결과값을 어떻게 변환할 지 이미 알고 있기 때문이다.
- 피호출자가 호출자 아래쪽에 있는 경우 오류가 발생하는 이유
- 호출자 번역시점에 컴파일러가 피호출자를 알지 못하기 때문에 호출 작업과 관련된 코드를 구성할 수 없다.
다음의 에러는 C언어 컴파일러에서만 발생하는 에러다.
Java는 해당 에러가 발생하지 않도록 최적화 되어있다 ㅎㅎ
함수 심화 시작
인라인 함수
- 해당 함수를 호출할 때, 함수 본체에 있는 소스코드를 적절히 처리해서 복사 및 붙여 넣기를 요청하는 것
# 인라인 함수 예제
"Java의 static 메소드 사용하듯이 따로 지정할 필요없이 메소드를 사용할 수 있게 만드는 게 인라인 메서드?"
가변 인자 함수
- printf() 함수를 생각해보자
- 첫 인자로는 출력할 문자열을 넣는다.
- 두 번째 이후 인자로는 형식 지정자 자리에 대치할 변수 이름을 넣는다.
- 형식 지정자의 개수가 많아지면, printf()의 인자 개수도 늘어난다.
# 가변 인자 함수 예제
재귀 함수
- 재귀란 되돌아옴을 의미한다.
- Re + Occur, 다시 + 발생하다
- 함수를 실행하는 도중에 자기 자신을 호출함으로써, 자기 자신으로 돌아오는 것이다.
# 재귀함수 예시
# factorial(4) 에 대한 재귀호출 과정
재귀함수 구성 방법 - 재귀함수 구성 시 고려할 사항
- 일반적으로 재귀 호출은 베이스 케이스를 해결하기 위한 명령문으로 시작한다.
- '베이스 케이스'란 재귀 함수가 직접 해결할 수 있을 정도로 문제가 작아진 경우를 의미한다.
다음과 같은 처리는, if 문을 재귀함수 내부에 선언해 예외처리를 수행한다. - 문제의 크기를 줄어가며 재귀 함수를 호출한다.
- 베이스 케이스에 도달하기 전에 가용 메모리가 없어지면, 스택 오버플로우 오류가 발생한다.
- 따라서 재귀함수를 작성하면, 베이스 케이스에 도달할 수 있는지 반드시 체크해야 한다. (안그러면, 무한 함수호출이 발생한다..)
- '베이스 케이스'란 재귀 함수가 직접 해결할 수 있을 정도로 문제가 작아진 경우를 의미한다.
- 재귀 함수를 구성하는 두가지 방법
- 꼬리 재귀 : 먼저 일을 처리하고, 재귀 함수 호출한다.
- 머리 재귀 : 재귀 함수를 호출한 후, 되돌아오면서 일을 처리한다.
일반적으로 재귀 알고리즘은 매우 단순하다. (수학적 수식만 구하면, 코드로 즉시 구성할 수 있기 떄문이다.)
But 실행 속도 면에서 불리할 수 있다. - 여러 함수가 호출되면서, 메모리의 스택영역에 가득차기 때문이다..
모든 재귀함수는 for문 (반복문)으로 구성할 수 있다는 게 증명되었다.
"반복문은 디버깅하면서, 코드를 작성하면 쉽게 코드로 구현할 수 있다. - 교수님의 말씀"
728x90
반응형
'CS 대학강의' 카테고리의 다른 글
[CS 1-2 | 이산수학] 수열과 행렬 8주차 (1) | 2022.10.04 |
---|---|
[CS 1-2 | 아카데믹 글쓰기] 글쓰기 꿀팁 4주차 (0) | 2022.10.03 |
프로그램 설계 방법론 - #07 [Java Aplication 구현 - 지갑 Aplication 확장] (0) | 2022.09.30 |
프로그램 설계 방법론 - #06 [제어구조 & 클래스의 활용 | 필드변수] (0) | 2022.09.29 |
[CS 1-2 | 오픈소스 SW 기초] 리눅스 VIM 편집기란 3주차 (0) | 2022.09.29 |