관리 메뉴

hye-_

함수의 개념 본문

CS/C언어1

함수의 개념

hyehh 2024. 1. 29. 08:53
728x90
반응형
SMALL

 

728x90
반응형
SMALL
함수 (function) ● 특정 작업을 수행하는 명령어들의 모음
● 입력을 받아서 특정한 작업을 수행하고 결과를 반환하는 것
라이브러리 함수 (library function) ● 컴파일러에서 지원되는 함수
● printf(), scanf() 등
값에 의한 호출 (call by value) ● 함수를 호출할 때 호출되는 함수로 정보를 전달하는 수단
   으로 c언어에서 기본적으로 지원하는 방법
● 실 매개변수의 값을 복사하여 형식 매개변수에 전달하는 방식

01. 함수의 개념

1. 개요

1. 함수의 필요성 

 

위 프로그램을 보면 0부터 40까지 = 이라는 기호를 쭉 쓰는 것이다.

위의 for문과 밑의 for문의 코드가 똑같다. 

 

나중에 =이라는 기호를 ★로 바꾸려고 한다. 

그러면 모든 for문을 고쳐야된다. 또는 40까지를 100으로 고치려고 할때도 모든 for문을 모두 고쳐야된다.

 

이렇게 똑같은 코드가 두 줄 이상있을때 

코드의 중복성이라고 한다.

 

코드의 중복성은 피해야된다.

프로그램의 기본 규칙이다.

 

왜 피해야되느냐?

기호를 바꿀때 다 바꿔야돼고, 만약 한군데만 바꾼다면 어떤곳은 별모양 어떤곳은 =이 나오고, 어떤곳은 40줄 어떤곳은 100줄이 나오는 불편함이 생긴다. 그래서 코드의 중복성을 없앨필요가 있다.

이렇게 만드는것이 좋다

코드의 중복성을 피할 수 있다. 또한 훨씬더 코드가 간결해진다.


2. 함수 (function)

특정 작업을 수행하는 명령어들의 모음

입력을 받아서 특정한 작업을 수행하고 결과를 반환하는 것이다.

 

입력없이 결과만 있을 수도 있다.

위에서의 =기호를 출력하는 것처럼 입력없이 출력하면 된다.


3. 함수의 특징

1. 함수는 프로그램을 구성하는 기본적인 구성 요소

2. 함수는 서로 구별되는 이름을 가진다.

3. 함수는 특정한 작업을 수행한다.

4. 함수는 입력을 받을 수 있고 결과를 반환할 수 있다. (반환할 수 있다는 말은 입력이 없을 수도 있고, 결과를 반환하지 않을 수도 있다는 말이다.)

5. 함수는 이름으로 호출되며 입력과 출력을 가진다. (근데 이름을 안가질 수도 있다.)

6. 함수는 내부 구현 방법을 모르더라도 사용할 수 있다.


2. 모듈화

1. 모듈화 (Module)

코드를 하나의 코드로 메인에서 처음부터 쭉 작성하는 것이 아니라 

필요한 코드를 분할해서 짜면 훨씬 더 코드도 간결해지고, 분업작업도 가능해진다.  

 

코드를 분할하면

코드의 계층화도 가능해진다.

 

논리적으로 같은 등급의 소스파일은

계속해서 분할할 수 도 있다. 

 

어떠한 소스파일/함수에서 일어나는 일의 책임을

그 소스파일과 그 함수가 지도록 한다.

 

전체 프로그램을 많은 함수들로 분리하여 작성하는것이

효과적이다.


2. 모듈화의 필요성

 

블럭 하나를 모듈이라고 보면 된다.

파란색 블럭을 잘만 만들어놓으면, 파란색 블럭 하나가 어떻게 구성이 되어있는지, 안에 무엇이 막 들어있는지는 중요하지 않다.

 

파란색 블럭을 곳곳에 쌓으면

금방 집이돼고, 건물이 된다.

 

모듈화의 필요성으로

중복성을 최소화하고, 하나를 잘 만들어 놓으면 똑같은것을 복사해서 올려두면 되니깐 재사용성이 증가가 된다. 또한 복잡하지 않아서 가독성이 증대가 되고, 따라서 유지관리가 용이하게 된다.

 

이런 모듈화의 장점은 

함수의 장점이기도 한다.


3. 함수의 장점

1. 소스 코드의 중복성 최소화

소스 코드의 양을 줄이고, 프로그램 간결성을 증가시킨다.

 

2. 함수의 재사용성으로 인해서

복잡한 문제의 단순화(모듈화)를 도모한다.

 

3. 각 함수는 특정적인 한 가지 작업(기능)만 담당하면 된다.

소스코드의 가독성을 증가시킨다.


3. 함수의 종류

 

함수의 종류는 크게 두가지가 있다.

사용자 정의 함수, 라이브러리 함수


1. 라이브러리 함수 (Library Function)

컴파일러에서 지원되는 함수

printf(), scanf() 등

 

프로그래머가 필요로 하는 다양한 기능을 제공한다.

프로그래머는 보다 쉽게 프로그래밍이 가능해진다.

 

개발 시간 단축된다.

수학적인 계산, 문자열 조작, 입/출력 등을 수행해준다.


02. 함수 정의 및 구조

1. 함수의 정의

◆ 함수를 정의하는 목적 함수를 사용하기 위해서
◆ 함수의 정의한다는 것은? 함수가 무엇을 할지를 결정하는 것이다. 
◆ 함수를 호출한다는 것은? 함수를 사용하는 것, 함수의 이름을 써주는 것이다. 

이것은 함수를 정의한것이다. 

함수가 무슨일을 하는지 써놓았다.

 

제일 위의 라인을 함수 헤더라고 한다.

빨간글씨는 함수의 이름이다. { 중괄호가 나오기 전까지의 한 줄을 함수의 헤더라고 한다.

 

나머지 부분을 함수 몸체라고 한다.

함수의 바디라고도 한다. 바디는 {} 중괄호에서 중괄호로 끝난다. 이 중괄호 부분을 다른 말로 블럭이라고 한다.

프로그램의 기능이다. 

 

  # 보도블럭과 연상시키자

  블럭은 시멘트 몇%, 물 몇%..등 뭐가 혼합되어있는지는 우리가 모른다.

  블럭 하나 잘 만들어 놓으면 똑같이 찍어놓아서 보도가 하나 생긴다. 즉, 길 하나 생긴다.

 

블럭은 덩어리, 하나로 취급한다. 

하나로 취급하는 덩어리라고 생각하면 된다. 문장 하나로 취급이 된다. 이 안에 어떤것이 들어있는지 몰라도 이름만 가지고 함수를 사용할 수 있다. 

 

함수 헤더 중에서 제일 앞에 있는 부분이

반환형, 반환타입이다.

 

함수란 입력을 받아 작업을 한뒤 결과를 반환한다고 하였는데,

이때 반환하는데 void이면 결과를 반환하지 않는다는 뜻이다. 

 

변수명, 함수명 다 식별자라고 한다. 

함수명을 작성할때 변수명과 동일하게 식별자 규칙을 따르면 된다.

 

( ) 가로 안은 매개 변수를 넣으면 된다.

인자, 파라메터가 가로 안에 들어간다.

근데 () 가로 안에 아무것도 없을 수도 있다. 아무것도 없으면 입력이 없다는 것이다.


2. 함수의 구조

1. 함수의 구조

함수의 구조는

크게 헤더와 몸체로 구성이 된다. 

함수 헤더  반환형, 함수명, 매개변수(인자, 파라메터)
함수 몸체 작업에 필요한 문장들 

2. 반환형 (Return Type)

함수가 처리를 종료한 후에

호출한 곳으로 반환하는 데이터의 유형이다.

 

반환형은 생략이 가능하다.

생략된다면 int형으로 가정된다.

종류
void  (반환 값이 없다)
int
float
double
char 
등등.. 

3. 함수명

함수의 이름

식별자 규칙을 따른다.

 

하나의 프로그램 안에

동일한 함수명이 2개 이상 존재할 수 없다.

 

함수의 목적을 설명하는 동사 또는 동사+명사

예) 

새로운 문자가 시작되는 부분을 대문자 또는 _ 언더바를 넣는다.


4. 매개변수

인자 (argument), 파라메터(parameter)

함수의 입력부분이다. 

 

함수를 호출하면서  특정한 값을 전달할 때 사용한다.

하나일 수 있고, 없을 수도 있다.

종류
실매개변수 : 호출하는 함수(caller)의 매개변수
형식매개변수 : 호출된 함수(callee)의 매개변수 

 

c언어에서 모든 함수는 스스로 일하지 않는다.

호출해야 일을 한다.

 

c언어는 기본적으로 main함수 한개로 구성되어있다.

main함수는 운영체제가 호출을 한다. 호출하여 main함수가 일을 다 하고 마지막에 리턴 0, 반환하고 끝낸다. 

 

프로그램은 main함수에서 main함수로 끝나는데, main함수가 실행되고 있는 동안에

어떤 함수를 호출해서 다른 함수를 사용할 수 있다. 물론 불러진 함수가 또다른 함수를 호출해서 사용할 수 있다. 

 

A함수가 B함수를 호출하면 B함수가 실행이 된다. B함수가 실행이 끝나면 A함수한테 반환을 한다.

이때 A함수를 호출한 함수 caller라고 하고, B함수를 호출된 callee라고 부른다.


5. 함수 몸체

중괄호 { } 로 둘러싸인 블록

실제로 실행되는 명령어들의 모임 

 

함수의 몸체안에서 제일 마지막에 return이라는 명령어를 사용해서 값을 반환하게 한다.

그때 반환하는 값을 return value 반환값이라고 한다. 반드시 하나만 반환할 수 있다. 


03. 매개변수 전달방식의 이해

1. 매개변수

1. 매개변수

함수를 호출할 때

호출되는 함수로 정보를 전달하는 수단 


2. 실 매개변수와 형식 매개변수

개수와 자료형이 반드시 일치해야 한다.

변수 이름은 같거나 달라도 된다.

3,5를 실 매개변수라고 한다.

int x, int y를 형식 매개변수라고 한다.

 

함수를 호출하면 3과 5의 값을 int x, int y로 넘긴다. 

그래서 정의된 부분으로 가서 x++,y++이 실행된다.


3. 매개변수 전달 방식

매개변수 전달 방식

호출 시 정의부분으로 넘기는 방식

 

1. 값에 의한 호출 (call by value)

실 매개변수 자체를 넘기는 것이 아니라 값을 복사하여 형식 매개변수에 전달한다.

 

2. 참조에 의한 호출 (call by reference)

실 매개변수와 형식 매개변수가 동일한 기억 공간을 사용한다.


2. 값에 의한 호출 (call by value)

1. 값에 의한 호출

C언어에서 기본적으로 사용하는 매개변수 전달방식

실 매개변수의 값만 복사하여 형식 매개변수에 전달한다.

 

형식 매개변수는

실 매개변수의 값을 저장하기 위한 별도의 기억 공간이 필요하다.

값이 변경하더라도 실 매개변수와 무관하다는 특징이 있다. 

 

호출된 함수는 

형식 매개변수만 조작할 수 있다. 

실 매개변수에 접근이 불가능하다.

 

즉, 실 매개변수와 형식 매개변수가

서로 다른 변수 취급이 된다.

 

3 → int x, 5 → int y로 전달된다.

x++, y++을 수행하여 4와 6이 된다. 그리고 돌아갔을때 4와 6은 호출했던 프로그램,함수에서는 모른다. 영향을 받지 않는다는 특징이 있다.


일반적인 사용 예

3 → int x, 5 →  int y로 전달된다.

return x+y 를 수행하여 8이 리턴되어 printf함수로 돌아가여 8이 화면에 출력된다.

 

문제가 되는 사용 예

a → int x, b →  int y로 전달된다. 

해당 알고리즘은 스왑 알고리즘이다. x가 크면 x와 y를 서로 바꾼다.

x는 7이였지만, 5로 바뀌고 y는 5였지만, 7로 바뀐다. 그리고 돌아간다. printf를 하면 7,5 순서로 출력된다. 변경된 값 영향을 받지 못하는 문제가 있다.


3. 참조에 의한 호출 (call by reference)

참조 (reference)

기억공간의 주소

 

1. 참조에 의한 호출

실 매개변수와 형식 매개변수가 동일한 기억 공간을 사용하는 방법이다.

C언어에서 지원하지 않는다. 그러나 사용하고 싶다면 포인터를 사용하면 된다. 

 

실 매개변수와 형식 매개변수를 같은 변수 취급한다.

형식 매개변수의 값이 변경되면 실 매개변수도 변경된다.


포인터 사용 예

 

&a, &b 

주소를 뜻한다. 그래서 7을 보내고, 5를 보내는것이 아니라 a의 주소, b의 주소를 보낸다. 

 

별표가 7과 5를 바꾸는것이 아니라 a와 b의 값을 바꾸게 한다.


함수를 정의할때

많은 함수를 정의할 수도 있기 때문에 대부분 main함수를 맨위에 둔다.

 

main함수를 맨위에 둘때 순차적으로 읽어가기 때문에 함수정의가 밑에 있어 함수를 찾지 못한다는 오류가 뜬다.

그럴때에는 함수의 헤더부분만 맨위에 작성해주면 오류가 안난다.

 

728x90
반응형
LIST

'CS > C언어1' 카테고리의 다른 글

함수와 기억 클래스  (0) 2024.07.10
함수 호출  (0) 2024.07.08
FOR 문  (0) 2023.12.08
WHILE 문  (0) 2023.12.07
IF 문과 SWITCH 문  (1) 2023.12.06