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) 처럼 &로서 참조 전달이 가능
    • 문제점은 이명 현상이 발생해서 한 메모리에 많은 이름들을 가져서 원치않은 결과를 얻을 수 있음
  • 값-결과 전달 – 실 매개변수 값 <-> 형식 매개변수 전달(복사). 호출, 반환 때
  • 이름 전달 – 실 매개변수는 대응하는 형식 매개변수가 사용될 때 비로소 계산(실 이름 = 형식 이름)
  • 문제점은 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]);
}

댓글남기기