어서 오세요
새 구역을 시작할 거예요
우리 섹션은 함수 기반이에요
먼저 함수의 기본에 대해 알아보죠
기능은 특정 임무를 완수하도록 설계된
프로그램 코드의 자립 유닛이죠 해상도도 높네요
네 함수는 기본적으로 여러분이 호출할 수 있는 거죠 코드
중복을 줄이는 데 도움이 됩니다
네 코드 내부에서 자체적으로 구성되어
있고 수행하게 될 작업들을 가지고 있습니다
문법 규칙은 함수의 구조와 사용
방법을 상정해요
여러분이 사용하는 Programlanguage에 따라
함수는 다르게 정의될 수 있어요
c에 대해서는 c에 대한 구체적인 규칙에 대해 얘기해보죠
네 네 대부분의 프로그래밍 언어는 함수 개념을 지원합니다 어떤 장점이 있고
왜 지원되는지 말씀 드리겠습니다
c의 함수는 다른 프로그래밍 언어의 assubroutines나
프로시저와 동일하죠
종종 이러한terms 서브루틴과 프로시저는
함수와 같아요
실행 코드가 있는 독립된 유닛이라고 할 수 있죠
일부 기능은 어넥션을 유발해요
이 시점까지 오작동은 익숙하죠
네 printf 함수도 알아봤습니다 동작을 취하는
출력을 화면으로 보여주는 거죠 여러분을 위해 뭔가를 합니다
그런 다음 결과적으로 Scanf 함수도 봤죠 키보드에서
입력을 받는 함수요
또 다른 액션을 하죠
하지만 다른 기능들은 프로그램이
사용할 값을 찾죠
네 그래서 예를 들어 문자열과 문자 배열을 공부할 때 문자열
조작과 변화에 관한 함수를 보게 될 거예요
네 특히 스터드 길이라는 함수가 있습니다 프로그래머에게
특정 문자열의 길이를 알려줍니다
정보를 다시 제공하는 행동을 수행하지 않아요
네 함수는 작업을 수행하죠 작업에 따라서요 프로그램에서
수행해야 하는 것은 행동을
야기하거나 프로그램 값을 수정하거나 값을 반환하거나 상태 정보를 알려주는 것입니다
기능의 장점이죠
우리가 사용할 함수는 장점이 아주 많아요
기능은 분배와 정복 전략을 가능하게 하죠
네 따라서 여러분이 중간 크기든 큰 크기든 프로그램을
쓸 경우 관리하기가 정말 힘들 거예요
테스트하기 어렵습니다 하나의 큰 함수를 가지고 있다면 어떤 에러도 디버그하고 찾아
고치기 어려울 거예요
네 그렇기 때문에 분할 정복 전략을 사용하는 것이
코드에서 버그를 찾아 고치는 것을 더 쉽게 할 수 있습니다.
네 C# 프로그램 하나에 주요 기능만 있는데 5천 줄이 있다고
상상해 보세요
그 문제를 어떻게 해결할지 감도 안 잡혀요
정말 형편없는 조직이에요
응집력이 전혀 없고 그냥 뛰어들어서 문제를 해결하려고만
해요
함수를 사용할 거예요
분할 정복이라는 건 기본적으로 여러 개의 독립적인 서브태스크로 나눌
수 있다는 뜻이죠
코드의 전반적인 복잡성을 감소시키죠
네 각 서브태스크에 따라 다른 함수를 만들 수도 있고 더 많은
함수를 만들어 더 작은 서브태스크로 나눌 수도 있어요
추가 기능을 추가할 때마다 복잡성이 줄어들어요
네 이런 기능을 만들 때 분할 정복
전략을 쓸 때 목표는 기능을 최대한 하나로
통합하는 거예요
그게 무슨 뜻이냐면 각 기능이 하나의 작업만 하도록 하라는 거죠 5개나 10개의
다른 작업을 하는 기능을 갖지 않아도 됩니다
네 키보드에서 입력을 읽는 기능을 작성한다면 키보드에서
입력을 읽게 하고 문자열을 확인하거나 출력을 디스플레이하지 않게 하세요
그 외 다른 것들도요
기능은 작고 통일성이 좋아야 해요
하지만 분할정복 정권은 정말 좋아요 복잡성을
줄여주거든요
네 5천 줄의 코드로 주요 기능을 하는 대신 특정
작업을 하는 여러 가지 기능으로 아주 빨리
식별할 수 있어요
함수가 코드 중복을 복사할 거예요
네 코드 중복을 줄이면 코드를 작성하고 테스트하고
디버깅할 때 시간을 절약할 수 있어요
소스 코드의 크기도 다시 줄일 거고요
네 왜 함수가 코드 중복을 줄일까요?
작업이 있을 때 그 작업을 반복하고 같은 코드를
반복해서 쓰는 대신 그 작업을 함수로 캡슐화해
함수를 호출하면 함수가 매번 그 작업을 해주거든요
중복할 필요가 없죠
네 프로그램에서 특정 작업을 여러 번 해야 할 경우
적절한 기능은 한 번만 작성하면 됩니다 제가 말씀드린 대로요
정말 간단하죠 그 코드를 여러 번 쓸 필요는 없어요
그럼 프로그램이 필요할 때마다 그 기능을 사용할 수 있죠
다른 프로그램에서도 같은 기능을 다른 프로그램에서도 사용할 수 있어요
그게 라이브러리를 구성하죠
네 그걸 해왔죠 그걸 하고 있었어요 printf
함수를 사용했죠 표준 입력 출력 라이브러리로부터요
딱 한 번 쓰여진 걸 우린 계속 되풀이하죠
그 함수가 존재하지 않는다면 그 함수를
구현해서 우리 프로그램에 넣고 계속 반복해야 해요
네 함수는 시간을 많이 절약하고 소스
코드를 줄일 수 있으며 계속해서 재사용할 수 있습니다
소프트웨어 황색 기법이죠
가독성에도 도움이 되죠
네 프로그램을 조정할 때 지금 하고 있는 것처럼요
특정 작업을 수행하기 위해 별개의 함수를 생성할 때 프로그램은
훨씬 더 조직화되죠
네 그렇죠 말씀드린 대로 주요 루틴이 있는데 주요 기능에 그
안에 엄청난 양의 코드가 있다면 5개의 함수를 호출하고
특정 작업을 하는 주요 루틴보다 따라가기가 훨씬 더 힘들 거예요
프로그램 조직에 도움이 되죠
프로그램 유지에 도움이 되죠
읽기도 쉽고 소스 코드를 바꾸거나 수정하기도 쉽죠
기억하세요, 관리 단계는 소프트웨어 라이프사이클에서
가장 비싼 단계예요 버그를 고치는 곳이고 프로그램이
출시되었고 새로운 기능을 추가하는 곳입니다
프로그래밍을 잘 조직할수록 유지하기가
쉬워지죠
네 그래서 이 조직 가독성 소스 코드에서 무슨 일이 일어나는지
이해할 수 있는 거죠 아주 중요해요 기능도 도움이
되고요
분할 정복 방식입니다 프로그램의
일부를 개발하고 테스트하고 디버그할 수 있죠
네 현실 세계로 나가 코드를 작업하기
시작하면 프로그램이 정말 크다는 걸 알게 될 거예요
이 프로그램에는 수백, 수천 명의 사람들이
참여하고 있어요
맞아요 모든 사람이 한 프로그램에 참여하면 일이 훨씬
쉬워져요 만약 분할 정복 방식을 사용한다면 사람들이
하는 작은 일을 독립적으로 한다면
동일한 소스 코드는 건드리지 않죠 작업을 훨씬
더 쉽게 구현할 수 있어요
이렇게 하면 한 프로젝트에 여러 사람이 참여할 때 전반적인
개발 시간이 줄어들 수 있어요 그럼 유지비도 절감되죠
개발 비용이 줄어듭니다
기능도 재사용할 수 있으니 시간이 절약될 거예요
theprintf 함수를 이용해 재사용할 수 있어요
네 하지만 여러분이 사용자 정의 함수를 작성할 때 프로그램 안에서
재사용할 수 있어요
소프트웨어 재사용은 함수의 큰 장점이죠
이 기능들을 생각하면요
네 네 프로그램을 기능에 따라 설계할 때 또 다른 장점은 블랙박스처럼
생각하는 거예요
그게 무슨 뜻이냐면 여러분이 여러분이 이걸 블랙박스로 생각할 때
여러분이 생각하는 건 함수에 대한 입력과 출력뿐이죠
네 결과의 입력에 집중하면 구현을 시작하기
전에 전체적인 디자인을 볼 수 있어요
따라서 일반적인 함수 덕에 디자인에 집중할
수 있는 거죠
디자인은 중요하다고 말씀드렸죠?
네 네 디자인은 프로그램을 계획하는 거예요 어떻게
구성하고 어떻게 코드를 쓸지 결정하는 거죠
실행을 시작하기 전에 계획을 세우는 게 중요합니다 코드를
작성하는 거죠
네 함수와 입력과 출력을 고려하면 프로그램이
어떻게 조직될지 어떤 함수를 생성해야 할지 알
수 있죠
따라서 세부 사항에서 정의 구현을 걱정할 필요가 없죠
이건 중요합니다 코드를 작성하기 전에 가장 먼저
해야 할 일은 디자인에 대해 생각하는 것이니까요 구현에 대해 생각하지 않는
것이 좋습니다.
학생들에게는 많은 문제가 있어요 처음 코드를 작성할
때는 그냥 구현을 시작해요
그렇죠 문제에 대해서도 생각하지 않아요 문제를 어떻게
해결할지 생각하지 않죠 그냥 코드를 작성하기 시작해요
좋은 접근법은 아니죠
네 코드와 함수를 작성할 땐 함수의 입력과
출력이라고 생각하세요 디자인에 도움이 될
테니까요
예제를 좀 보죠
앞서 말했듯이 기본 제공 함수인 printf와 scanf를 사용했죠
C 프로그래밍 언어가 제공하는 표준 인풋 출력
라이브러리에 있죠
네 우린 함수가 뭔지 좀 알죠 써봤으니까요 하지만 아직
함수를 어떻게 정의하고 데이터를 함수에 넘기는지
세부 사항은 다루지 않았네요 그런 게 아니에요
하지만 printf 함수로는 데이터를
취한다는 걸 아셔야 해요
함수에 데이터를 전달할 수 있어요
함수 이름 다음에 괄호 뒤에 있는 인수들이
데이터예요
좀 더 자세히 설명하기 위해 인수와 변수에
대한 따분한 강의를 할 거예요
하지만 높은 수준에서는 함수에 데이터를 전달할 수 있다는 걸 이해해야 하죠
printf 함수를 살펴봐서 그걸 이해하세요
네 printf 함수에 대한 첫 번째 인수는 우리가
전달하는 데이터죠 문자열이었어요 리터럴이죠 그게 다였어요 큰따옴표
안에 있는 모든 글자요
네 그리고 말다툼도 했어요 0번, 혹은 여러 번요 변수 인수도
있었어요 일련의 변수나 표현의 값이 표시되는
거죠
기억하세요, 첫 번째 인수에 형식 지정자가
있다면 그다음 인수에도 변수가 있을 거예요
printf 함수에 패스data를 할 수 있었나요?
네 함수로부터 정보를 다시 받는 방법도 아셔야
해요 데이터는 반환될 수 있죠
scanf 함수에서 인수 중 하나는 데이터를 어떻게 저장할
것인가였죠
네 그래서 변수를 넘기면 사용자가 키보드에서
입력한 값이 나오죠
함수에서 반환된 값으로 생각할 수 있죠
네 함수는 매우 유용합니다 데이터를 입력하고 데이터를 다시
리턴할 수 있기 때문이죠
함수의 코딩 예제입니다 이건 우리가 호출할 함수일
뿐이죠 이게 주요 함수예요
프로그램의 진입점인 테메인
함수는 잘 알죠
하지만 얼마나 멋진지 보세요
기능 읽기 목록 정렬과 평균을 호출하죠
코드는 3줄밖에 없어요
네 그런 기능을 구현해야 하지만 덕분에 프로그램이 더 조직화돼요
이 프로그램이 뭘 하는지 즉시 알 수 있으니까요
네 네 이 프로그램은 리스트를 읽고 리스트를
정렬할 거예요 목록의 평균을 보여줄 겁니다 목록은 부동
소수점을 포함하고요
가독성도 좋고 유지 관리도 쉽죠
프로그래밍에 버그가 있으면 바로 찾아서
분리할 수 있어요
버그가 정렬이 안 되면 정렬 기능을 쓰면 돼요
버그가 평균치라면 평균 함수로 가면 돼요 오류
분리하기 아주 쉽죠
이전 슬라이드에서 그런 오작동을 구현할
땐 그냥 호출만 했어요
함수를 실제로 구현하려면 함수의 본체 안에 코드를
작성해야 해요
네 printf 같은 c 언어로 구현된 함수를
쓰거나 사용자 정의 함수를 만들 수 있어요
네 라이브러리에서 printf 함수나 그 어떤 함수도
구현할 필요가 없어요 자기만의 기능만 실행하죠
네 이 앞의 예제에서 읽기 목록과 정렬, 평균으로
해당 함수를 구현해야 했어요
네 우리는 함수 헤더를 제공해야 합니다. 리스트의
읽기와 정렬, 리스트의 평균을 계산하는
함수 본체를 제공해야 하죠.
기능만 정의하는 게 아니라 실행해야 해요
네 함수를 구현할 땐 늘 서술된
함수 이름을 써서 프로그램이 뭘 하는지 어떻게 조직되는지
확실히 해야죠
네 아까 예제에서 읽기 목록이란 함수가 있었죠 그게 뭘 하는지
꽤 명확해요 함수 이름 정렬
x, y, z라고 이름을 짓지 않았어요
그 기능을 묘사했죠
변수를 묘사하거나 만들 때도 마찬가지예요
의미 있는 이름요
네 또한 이런 함수들이 충분히 일반적이고 어떤
작업을 하며 일반 데이터를 취한다면 다른 프로그램에서
재사용할 수 있어요 라이브러리 함수처럼요
소프트웨어 재사용을 지원하죠
그렇습니다 다음 강의에서는 함수와 특정 구문을 어떻게
정의하는지 배워 볼 겁니다 함수를 호출하고 호출하는 방법과
함수로부터 데이터를 전달하고 반환하는 방법도요
다음 강의에서 그 점을 중점적으로 다룰 거예요
네 또한 모든 C 프로그램에서 반복해서 봤던 주요
루틴에 대해 말씀드리고 싶습니다 그건 함수입니다
네 네 메인 기능은 c 시스템에서 특별히 인식되는
이름이에요 프로그램 실행 지점을 표시합니다
C 프로그램은 다 메인 프로그램이 있어요
네 주요 함수는 명령줄 인수를 전달할 때 데이터를
받을 수 있어요 아니면 받을 필요가 없거나요
리턴할 수 있는 옵션 데이터도 있어요
보다시피 0을 반환하는 Main 함수를 사용했죠
보통 그건 오류 코드를 리턴할 때 사용되죠
네 하지만 우린 이미 특정 함수를 사용했고 가장
중요한 주요 함수는 코드를 구성하는 데 도움을 줍니다
프로그래밍이 어디서 시작되는지 알아요 주요
부분만 찾으면 되니까요
네 이건 함수에 대한 높은 수준의 설명입니다 함수의 장점과
함수가 정확히 뭔지 알려주는 거죠
이제 실행에 대해 얘기해보죠
고마워요