PL 함수(5)
프로그래밍 언어의 함수 개념과 매개변수 전달 방식을 설명합니다. 함수와 프로시저의 차이, 정적/동적 유효범위 규칙, 그리고 값 전달, 참조 전달, 값-결과 전달, 이름 전달 방식의 특징과 차이점을 예제를 통해 비교하여 다루고 있습니다.
함수
함수 정의 및 호출 – 언어 S: 함수 확장
-
함수 호출문 2개
-
식(factor)
: 1+sum();처럼 식에서 바로 사용. 즉, 반환이 있음 -
문장(stmt)
: sum(); 처럼 그냥 호출해서 사용. 즉, 반환이 없음
-
-
프로시저 특징? 반환 값 X
-
함수 특징? 반환 값 O
- C, C++, Java, Python, S – 모두 함수이다. 따라서 프로시저를 굳이 표현하자면 반환 타입 void로 표현한다.
유효범위 규칙
정적 유효범위 규칙 – 선언된 이름은 선언된 블록 내에서만 유효
동적 유효범위 규칙 – 선언된 이름은 선언된 블록의 실행이 끝날 때까지 유효
바인딩 = 식별자와 속성
을 연관 짓는 것
- 변수나 함수의
속성
= 타입, 유효범위, 위치(코드), 값(변수)
매개변수 전달
매개변수 전달 – 호출 시에 실 매개변수
와 형식 매개변수
를 매칭하는 것
-
형식 매개변수 :
int swap(int num1, int num2){ ~~ }
처럼 함수 선언(정의)에서 사용한 매개변수. -
실 매개변수 :
swap(a, b)
처럼 호출에서 사용한 매개변수.
전달 방법 – 값 전달, 참조 전달, 값-결과 전달, 이름 전달
-
값 전달 – 실 매개변수 값을 대응되는 형식 매개변수에 전달
- 문제점은 복사된 값이 서로 swap을 할 뿐 실제 보내준 실 매개변수 메모리의 값은 변경X
-
참조 전달 – 실 매개변수의 주소가 형식 매개변수에 전달(실, 형식 매개변수의 이명)
- C는 원칙적으로 값 전달만 가능. 하지만
포인터 타입
을 통해 참조 전달 효과 가능 - C++도 값 전달이 기본인데,
void ack(int &x, int &y); ack(a,a)
처럼 &로서 참조 전달이 가능 - 문제점은 이명 현상이 발생해서 한 메모리에 많은 이름들을 가져서 원치않은 결과를 얻을 수 있음
- C는 원칙적으로 값 전달만 가능. 하지만
- 값-결과 전달 – 실 매개변수 값 <-> 형식 매개변수 전달(복사). 호출, 반환 때
- 이름 전달 – 실 매개변수는 대응하는 형식 매개변수가 사용될 때 비로소 계산(실 이름 = 형식 이름)
- 문제점은 swap 예시 확인
예시
- 값 전달 : 유지
- 참조 전달 : a[1] = 11
- 이름 전달 : a[2] = 21
int i;
int a[10];
void p(int x) {
i = i+1;
x = x+1;
}
main() {
i = 1;
a[1] = 10;
a[2] = 20;
p(a[i]);
}
댓글남기기