150 likes | 301 Views
의문점. 함수를 왜 쓰나요 . main() 안에 다 때려 넣으면 편한데 … 정말 그렇군요 . 프로토타입도 만들어야되고 반환 규칙 , 매개변수를 귀찮게 정해야되며 프로그램이 어디서 어떻게 흐르는지 헷갈리게 하는 함수를 일부러 만들어 쓰는거 같군요 . 다음 소스코드를 봅시다. void main(){ printf(“ 나는 도대체 함수를 왜 쓰는지 모르겠다 .<br>”); }. 이 코드가 어떤 동작을 일으키는지 아직도 모르는 학생은 없겠죠 . 물론 자신있게 말할 겁니다 . 이렇게요 .
E N D
의문점 • 함수를 왜 쓰나요.main()안에 다 때려 넣으면 편한데… • 정말 그렇군요. 프로토타입도 만들어야되고 반환 규칙, 매개변수를 귀찮게 정해야되며프로그램이 어디서 어떻게 흐르는지 헷갈리게 하는 함수를 일부러 만들어 쓰는거 같군요. • 다음 소스코드를 봅시다. void main(){ printf(“나는 도대체 함수를 왜 쓰는지 모르겠다.\n”); } • 이 코드가 어떤 동작을 일으키는지 아직도 모르는 학생은 없겠죠. • 물론 자신있게 말할 겁니다. 이렇게요. • 조교님 장난 칩니까. 흥! 저를 뭘로보고 이래뵈도 중간고사까지 치룬 베테랑 1학년생이란 말입니다. 이 프로그램은 printf 함수를 사용해서 “나는 도대체 함수를 왜 쓰는지 모르겠다.\n”라는 문자열을 출력하는것 아닙니까. • 오. 그렇군요. 이렇게 대답 할려고 했던 학생이 있습니까? 있다면 칭찬하고 싶군요. • 그렇습니다. 이 프로그램은 printf라는 함수를 이용해서 매우 간단하게 모니터에 “나는 도대체 함수를 왜 쓰는지 모르겠다.\n”라는 문자열을 출력하는 것입니다. 그런데 함수가 없다면??
의문점계속 • printf라는 함수가 없다면 main함수에는 어떤 것을 넣어야 할까요? • printf함수가 할 수 있는 일을 넣어야겠죠. • 오 훌륭합니다. 근데 그게 뭐죠? • 음… 문자를 그래픽 카드를 통하여 모니터에 출력하는 것? • 오. 맞습니다. 그럼 그런 기능을 이번 실습시간에 한번 만들어 보도록 할까요? • ㅁ니ㅏ리머랴ㅐㅓㅣㅏㅓㅟ 차라리 방사능 값을 이용한 암석의 나이 구하기가 쉽겠네요. • 이제 함수를 왜 써야 되는지 의문점이 풀렸나요?
의문점계속 • 함수는 좀더 쉬운 프로그램을 위하여 만들어진 프로그래머의 친구 입니다. • 남이 만들어 놓은 코드들이거나 • 여러 번 구현하기가 쉽지 않은 코드들이거나 • 정말로 자주 사용해야 되는 코드들이거나 • 함수가 있어야겠죠?
매개변수의 이름?? 매개변수는 함수 만의 것… 다른 함수에서 쓰던 말던 매개변수의 이름은 그 함수 안에서는 자유롭다… 따라서 main함수에서 apple을 썼다고 하더라도 sample 함수의 매개변수의 이름으로 apple을 쓸 수 있다. 다만 main 함수의 apple이 정적변수로 선언되면 안됨. 그리고 main 함수에서 sample에 값을 매개변수를 통하여 전달할때 매개변수 이름이 apple이라고 좌측에 보이는 orange를 apple이라고 할 필요가 없다. int sample(int apple){ return apple++; } void main(){ int orange = 2; sample(orange); }
add1과 half의 prototype add1과 half 정의 prototype.c • 프로토타입 선언후에는 선언한 함수를사용할 수 있다. 실행결과: 정수를 하나 입력하세요. 123 123 의 바로 다음 정수는 124 이고 123 의 반은 61.5 입니다. 제가 맞게 계산했나요 ?
함수 밖에 있는 변수 • 지역변수(local variable) • 함수 내에 있는 변수 • 함수 내부에서만 볼 수 있음 • 함수가 호출될 때 생성되므로 동적변수(dynamic variable)임 • 비지역변수(nonlocal variable) • 함수 밖에 있는 변수 • 여러 함수에서 볼 수 있음 • 전역변수(global variable): 프로그램 전체에서 볼 수 있음 • 파일범위변수(file scope variable): 같은 파일 내의 함수에서만 볼 수 있음 • 지역변수 • 프로그램이 시작할 때 생성되므로 정적변수(static variable)임
nonlocal.c • 비지역 변수 GX는 세 함수에서 모두 볼 수 있다. • 이렇게 선언된 GX는 전역변수다. • 다른 파일에서 GX를 볼려면externint GX;선언을 해 주어야 한다. 실행결과: [main 에서] GX = 12345 [f 에서] GX = 12345 [g 에서] GX = 12345
nonlocal1.c nonlocal2.c 볼 수 있음 볼 수 없음 파일범위 변수와 전역변수 • 함수 밖에 선언된 변수 중 static으로 선언된 변수 • 파일범위 변수는 전역변수와는 달리 다른 파일에서는 볼 수 없음
count.c • 정적변수 초기화 • 모든 정적변수는 초기화해야 한다. • 초기화하지 않았을 경우엔 0으로 초기화 된다. 지역 정적변수 타입이 생략되었으므로 자동으로 int형이다. 호출 사이에 값이 보존된다. 실행결과: count = 1 count = 2 count = 3 count = 4 count = 5
변수 분류 • 유효범위(scope): 해당 변수를 볼 수 있는 범위 • 지속시간(lifetime): 변수가 생성과소멸 사이의 시간 지속시간이 길어짐 유효범위가 넓어짐
재귀함수 • 재귀호출(recursive call) • 어떤 함수가 종료되지 않은 상황에서 자신을 다시 호출하는 것 • 재귀함수(recursive function) • 재귀호출을 이용하는 함수 • 재귀적인 그림 Niklaus Wirth, Algorithms + Data Structures = Programs (발췌)
계승(factorial) 정의 n ! = n × (n – 1) × … × 1 재귀적인 계승 정의 0 ! = 1 n ! = n × (n – 1) ! fact.c 재귀호출 실행결과: 자연수를 하나 입력하세요: 10 fact(10) = 3628800 입니다.
재귀 함수 스택 #include <stdio.h> void recursive(int i); void main(){ int i = 0; recursive(i); } void recursive(int i){ if(i == 10) return; i++; recursive(i); printf("%d\n",i); } recursive(5) recursive(4) recursive(3) recursive(2) recursive(1)
매크로 함수 인수를 받는 매크로 함수와 유사하지만 실제로 함수는 아님 max.c : 매크로 함수 MAX(i, j)는 전처리기를 거치면 (i > j)? i: j 로 확장된다. 실행결과: 두 수를 입력하세요. 2 3 MAX(2, 3) = 3
실습 • 집의 면적을 구하는 프로그램을 작성하여 보자 • 한 프로그램안에 집의 면적을 구하는 함수를 두 개 구현할 것 • 첫 번째 것은 매개변수를 이용하여 리턴값으로 구해주는 것 • 두 번째 것은 매개변수를 사용하지 않고 정적변수를 사용하는 것 • 시간을 초를 서로 바꾸어 주는 프로그램 • 시간을 초로 바꿀 건지 초를 시간으로 바꿀 건지 선택하도록 함 • 시간을 초로 바꿀 경우의 예 • 입력하는 예(3시간 20분 30초): 3 20 30 • 출력되는 예 : 3시간 20분 30초는 12030초 입니다. • 초를 시간으로 바꿀 경우의 예 • 입력하는 예(12030초): 12030 • 출력되는 예 : 12030초는 3시간 20분 30초 입니다. • 출력을 마치면 시간을 초로 또는 초를 시간으로 바꾸는 것을 선택하는 메뉴로 돌아간다. • 함수를 반드시 쓰되 함수의 역할은 자유롭게 설계하세요.