1. 함수의 입력과 출력
- 입력-매개변수(parameter), 인자
- 출력-반환값(return value), 리턴값, 함수가 돌려주는 결과 값
- void-리턴값이 없으면 리턴형 쓰는 자리에 void, 매개변수가 없으면 매개변수 쓰는 자리에 void(이 경우는 생략이 가능하다.)
2. 함수 정의, 선언, 호출
2.1 함수 정의
- 함수 만들기
- 이름, 매개변수, 리턴형, 기능
2.2 함수 호출
- 함수 사용하기
- 이름, 매개변수
2.3 함수 선언
- 함수의 사용법
- 이름, 매개변수, 리턴형
- 컴파일러에게 함수에 대한 정보를 미리 준다.
함수를 만드는 것을 함수를 정의(definition)한다고 합니다.
함수를 만든(정의) 후 함수를 사용(호출)합니다.
함수를 호출할 때는 함수 이름과 괄호 안에 argument를 개수만큼 써야 합니다.
argument가 없을 때는 빈 괄호만 쓰면 됩니다. ex) display();
3. main()함수의 리턴값
return문을 만나면 함수의 나머지 부분에 상관없이 함수의 실행을 종료하고 호출한 함수로 넘어갑니다.
main()함수의 경우 return문을 만나면 프로그램이 끝나게 됩니다. (return문은 하나의 값만 돌려줌, 포인터를 사용하면 둘 이상의 값을 return 가능)
main()함수의 리턴 값은 프로그램이 끝나면서 OS에 전달되는 값입니다.
(프로그램이 정상적으로 종료되면 보통 0을 리턴, 비정상적으로 종료할 때는 1을 리턴하는 것이 관례)
4. 재귀함수
함수가 함수 내에서 자기 자신을 호출할 수 있는데 이러한 함수를 재귀함수(recursive function)라고 합니다.
구현하고자 하는 작업이 함수 자신을 순환 반복하여 구현되어질 수 있다면 재귀 함수를 사용할 수 있습니다. 하지만 함수의 반복 호출로 인한 시간과 메모리 공간의 효율성이 떨어지는 단점이 있습니다.(스택 오버플로우 주의)
7행 : 6행의 in값에 따라 sum()함수가 재귀 호출을 하므로 자기 자신을 반복해서 호출하게 되는데 실행 결과를 보면 in이 4790일 때까지는 정상적으로 수행하지만 그 다음부터는 아무런 오류 메시지도 없이 프로그램 실행이 중단된다.
이것을 재귀 호출에 의한 스택 오버플로우라 한다.
5. 실매개변수와 형식매개변수
함수들 간에 서로 데이터를 교환할 때 사용하는 것을 함수의 매개변수라고 합니다.
실매개변수(actual parameter, argument)
- 함수를 호출할 때 사용하는 매개변수
- 실제 값을 갖는 매개변수
형식매개변수(formal parameter, parameter)
- 함수 정의에서 사용하는 매개변수
- 실매개변수를 전달 받기 위한 형식적인 매개변수
- 다른 어떤 변수명을 사용해도 됨
6. 매개변수를 전달하는 방법
매개변수를 전달하려면 C언어에서는 기본적으로 값에 의한 호출(call by value)을 합니다.
(실매개변수의 값을 형식매개변수로 전달)
이 방법은 실매개변수를 형식매개변수로 전달할 뿐 함수 내부에서 형식매개변수가 변경되더라도 실매개변수는 변경되지 않습니다.
형식매개변수가 변했을 때 실매개변수도 변하게 하려면 포인터를 이용해서 call by reference를 구현해야 합니다.
값에 의한 호출 (call by value) |
주소에 의한 호출 (call by reference) |
실매개변수의 값을 형식매개변수로 전달 |
실매개변수의 주소를 형식매개변수로 전달 |
7. 지역(local)변수와 전역(global)변수
변수의 유효범위란 프로그램 내에서 변수가 사용될 수 있는 범위를 말합니다.
지역변수는 해당 함수나 블록 ({ })내에서만 사용할 수 있고 전역 변수는 소스 전체에서 사용할 수 있다는 특징이 있습니다.
지역변수와 전역변수를 결정 짓는 요소는 변수의 선언 위치입니다. 함수나 블록 안에서 변수를 선언하면 그 변수는 지역 변수가 되고, 함수(보통 main함수)밖에서 선언하면 전역 변수가 됩니다.
*지역변수와 전역변수가 똑같은 이름으로 동시에 있을 때에는 지역변수가 우선이다.
8. auto변수와 static변수
8.1 Auto변수의 특징
1. 함수 또는 블록의 내부에서 선언
2. 해당 함수나 블록 내에서만 유효한 지역(local)변수
3. 기억 클래스가 명시되지 않고 선언된 변수는 모두 자동 변수
즉, auto는 생략이 가능
그래서 지금까지 기억 클래스를 쓰지 않고 사용한 모든 변수는 auto변수
4. 스택(stack) 공간을 일시적으로 사용
5. 함수나 블록을 진입하면 기억 영역이 확보되고, 벗어나면 기억 영역은 바로 소거됨
단, return문으로 리턴된 값은 스택에 복사되어 외부로 전달됨
6. 초기화는 실행시 이루어지며, 초기화하지 않으면 임의의 값(쓰레기 값, garbage value)을 가짐
8.2 Static변수 특징
1. 프로그램이 종료될 때까지 값을 유지
2. 처음 실행시 한번만 초기화되고 초기화 값이 없으면 0으로 초기화됨
3. 스택이 아닌 정적 데이터 영역을 사용
4. 지역 static변수는 해당 블록 내에서만 접근 가능
지역 static변수는 지역 변수로 해당 블록 내에서만 유효하지만,
정적 데이터 영역에자료를 저장하여 프로그램 종료될 때까지 값을 유지
초기값은 컴파일 시 결정되어 있음. 실행시에는 초기화 소스를 실행하지 않음
8.3 Auto변수와 static변수의 차이점
Auto변수는 그 안에서만 값을 갖고 밖을 나가면 값이 사라진다.
Static변수는 본인이 속한 블록에서 벗어나도 값이 사라지지 않고 프로그램이 종료될 때까지 값을 가지고 있는다.
9. 구조체
구조체(structure type)는 이미 정의된 서로 다른 자료형(int, char, double 등 변수와 배열, 포인터, 구조체도 포함)들을 구성 요소로 하여 새로운 자료형을 만들어내는 것입니다.
쉽게 말해 그룹핑하면 프로그래밍하기 편한 자료들을 하나로 묶는 것입니다.
구조체를 사용하면 상이한 자료들을 한 묶음으로 관리할 수 있다는 큰 장점을 가지고 있습니다.
구조체는 아래와 같은 형식으로 나타낼 수 있습니다.
C언어에서는 struct를 써야 했지만 C++에서는 struct을 생략하고 구조체명과 변수명만 써도 됩니다.
'C++' 카테고리의 다른 글
[C++] 객체와 멤버, 변수와 배열 (0) | 2022.12.28 |
---|---|
[C++] const, const 예제 (0) | 2022.12.26 |
[C++] 매개변수, 인자, 리턴값, 함수, 여러 예제 (0) | 2022.09.18 |
[C++] cout, cin, C언어와 C++예제 (0) | 2022.09.13 |
[C++] Xcode에서 C++ 프로젝트 생성 방법 (0) | 2022.09.02 |