추상화 (Abstraction)
추상화에는 다음과 같은 2가지 종류의 추상화가 존재합니다.
Process Abstraction
어떤 목적을 수행하는 일련의 문장(코드)들을 subprogram으로 작성하는 것입니다.
이때 Subprogram은 Procedure와 Function으로 나뉩니다.
Data Abstraction
프로그래머가 새로운 data type(자료형)을 정의하는 것을 의미합니다.
Java와 같은 객체지향 언어에서 다루게 됩니다.
Subprogram
subprogram을 통해 반복되는 코드를 한번만 작성한 뒤 재사용 할 수 있으며,
subprogram을 통해 프로그램의 module화가 용이해집니다.
또한 개별 컴파일(separate compilation)이 가능합니다.
subprogram은 대게 서로 독립적이며, 따라서 각각의 subprogram은 독립적으로 컴파일이 가능합니다.
이를 통해 프로그램을 개발할 때 컴파일 시간을 줄일 수 있게 됩니다.
특성
하나의 subprogram의 실행 시작 지점은 하나입니다.
그러나 실행이 종료되는 지점은 하나 이상일 수 있습니다.
용어, 개념 정의
Subprogram의 종류
subprogram의 종류에는 함수(function)와 procedure가 있다고 했습니다.
function은 반환값이 있는 subprogram이며
procedure은 반환값이 없는 subprogram입니다.
추가로 C언어는 기본적으로는 반환값이 있는 function이지만, 반환값을 Void로 설정하면 반환값이 없는, 즉 procedure도 지원합니다.
이름
다른 subprogram들과 구분지어줍니다.
리턴 타입
Subprogram이 함수(Function)인 경우에만 사용됩니다.
함수를 실행한 결과로 리턴하는 값의 타입입니다.
형식인자(formal parameter)와 실 인자(actual parameter)
형식인자는 함수를 정의할 때 header에 나열된 임시 변수입니다.
또한 해당 함수를 실제 실행할 때 전달되는 인자를 실 인자라고 합니다.
실 인자가 형식인자에 전달될 때에는 지정연산(=)이 발생한다고 볼 수 있습니다.
아래 코드의 경우 (s = a, t = b)가 발생한다고 볼 수 있습니다.
# include <stdio.h>
int main(){
int foo(int, int);
int a = 1, b = 2, bigger;
bigger = foo(a, b);//a, b는 전달되는 실 인자.
printf("%d\n", bigger);
}
int foo(int s, int t) //header, 헤더, 머리, s t는 형식 인자
{//body, 바디, 몸통
int big;
big = s;
if(big < t)
big = t;
return big;
}
프로토타입
프로토타입은 시그니처라고도 하며, 형식 인자의 [개수, 순서, 타입, (단 형식인자의 이름은 포함되지 않음)]과 리턴 타입을 포함하며합니다.
(자바와는 다르니 참고하세요! 자바의 시그니처는 리턴 타입을 포함하지 않습니다.)
그리고 해당 프로토타입을 사용하겠다고 작성하는 것을 선언이라고 합니다.
C언어의 컴파일러는 One-Pass Complier 입니다.
즉 소스코드를 위에서부터 단 1회만 읽기 때문에, 함수를 먼저 사용하고 그 아래에서 정의해준다면 해당 함수를 사용할 수 없습니다.
예를 들어 다음과 같은 코드는 오류가 발생합니다.
# include <stdio.h>
int main(){
int a = 1, b = 2, bigger;
bigger = foo(a, b);
printf("%d\n", bigger);
}
int foo(int s, int t) {
int big;
big = s;
if(big < t)
big = t;
return big;
}
해당 코드를 컴파일하면 다음과 같은 오류가 발생합니다.
이를 해결하기 위해, 함수를 사용하기 전에 먼저 정의해 주거나, 함수의 프로토타입을 먼저 선언해주어야 합니다.
하나하나 살펴보도록 하겠습니다.
함수를 먼저 정의
# include <stdio.h>
int foo(int s, int t) {
int big;
big = s;
if(big < t)
big = t;
return big;
}
int main(){
int a = 1, b = 2, bigger;
bigger = foo(a, b);
printf("%d\n", bigger);
}
프로토타입을 먼저 정의
# include <stdio.h>
int foo(int, int);//프로토타입은 형식인자의 이름은 포함하지 않으므로, 정의하지 않아도 됩니다.
//int foo(int s, int t);
int main(){
int a = 1, b = 2, bigger;
bigger = foo(a, b);
printf("%d\n", bigger);
}
int foo(int s, int t) {
int big;
big = s;
if(big < t)
big = t;
return big;
}
혹은 다음과 같이도 사용할 수 있습니다.
# include <stdio.h>
int foo(int, int);
int main(){
int a = 1, b = 2, bigger;
bigger = foo(a, b);
printf("%d\n", bigger);
}
int foo(int s, int t) {
int big;
big = s;
if(big < t)
big = t;
return big;
}
또한 다음 등도 가능합니다.
# include <stdio.h>
int main(){
int foo(int, int);
int a = 1, b = 2, bigger;
bigger = foo(a, b);
printf("%d\n", bigger);
}
int foo(int s, int t) {
int big;
big = s;
if(big < t)
big = t;
return big;
}
# include <stdio.h>
int main(){
int foo(int a, int t);//형식인자 명은 상관없음
int a = 1, b = 2, bigger;
bigger = foo(a, b);
printf("%d\n", bigger);
}
int foo(int s, int t) {
int big;
big = s;
if(big < t)
big = t;
return big;
}
'c언어' 카테고리의 다른 글
[C언어] - 스택프레임 (0) | 2022.04.19 |
---|---|
[C언어] - 지역변수, 전역변수, static 변수 (0) | 2022.04.19 |
[C언어] - 조건문, 반복문 (0) | 2022.04.19 |
[C언어] - 연산자, 형변환 (0) | 2022.04.19 |
[C언어] - 변수와 자료형 (0) | 2022.04.18 |