제가 대학교 1학년 때 C언어 수업에서 배운 내용을 교재와 ppt를 중심으로 정리한 내용입니다. (2022.3 ~ 2022.6)
당시에 공부를 위해서 HWP 파일로 정리해 놓은 것을 그대로 올립니다.
대학에 처음 들어와 정리한 내용이라 모든 내용을 담고 싶은 욕심에 정리가 많이 지져분하고 어설픈점 양해 부탁드립니다..!
🍑함수의 개념
함수
: 특정 기능을 제공하는 코드를 묶어서 이름을 붙인 것
- 함수는 일종의 블랙박스 모델.
- 블랙박스 모델 : 입력을 주면 특정 기능을 수행한 다음 결과를 출력하는데, 처리 과정은 보이지 않는다는뜻
함수의 필요성
- 코드가 중복되지 않으므로 간결하고 알아보기 쉬움
- 한 번 작성해둔 코드를 여러번 사용하므로 코드의 재사용성이 높음
- 기능 위주로 함수를 작성해서 사용하므로 프로그램의 모듈화 증대
- 함수 코드를 수정해도 함수 호출 부분은 수정할 필요가 없으므로 프로그램 유지 보수가 쉬움
🍑함수의 종류
- 절차적 프로그래밍 : 함수 단위로 프로그램을 작성하는 방식
- c 프로그램은
main함수와 여러함수들로 구성, 실행동안 수시로 함수를 호출
진입점 함수
- 프로그램이 시작할 때 운영체제에 의해 호출
- 프로그래머가 작성은 하지만, 직접 호출하지는 않음
- ex)
main함수
라이브러리 함수
- c프로그램에서 자주 사용되는 기능을 미리 함수로 준비해둠 → 표준 c라이브러리 함수
- 입출력 같은 고유의 기능을 제공
- 이미 코드가 만들어져 있으므로 프로그래머는 라이브러리 헤더를 포함하고 호출하면됨
- ex)
#include <stdio.h> → scanf printf
사용자 정의 함수
- 프로그래머가 직접 정의하고 호출하는 함수
- 프로그램에서 특정 기능을 제공하는 코드 부분을 묶어서 함수로 만들어두고 사용
🍑함수의 요건
함수의 정의
: 함수가 실제로 수행할 내용을 기술
- 리턴형, 함수이름,
()안에 매개변수 목록을 써준 다음 함수의 실제 수행할 내용을 {} 안에 작성
함수의 호출
: 정의된 함수를 사용
- 앞에서 정의 또는 선언된 함수를 이용
- 인자를 넘겨주고 리턴값을 받아올 수 있음
함수의 선언(원형)
: 함수에 대한 정보를 제공하는 것
🍑함수의 기본
함수의 정의
: 리턴형, 함수이름, 매개변수 목록이 필요
리턴형 : 함수가 처리 결과로 리턴하는 값의 데이터형
- 리턴값이 없을 때는 리턴형에
void를 적어줌
- 리턴형이 생략되면
int로 간주
- 함수는 반드시 하나의 값만 리턴
- 함수의 처리결과가 둘 이상일때는 함수의 리턴값대신 매개변수를 이용
함수의 이름
- 함수 이름을 정할 때도 식별자 규칙을 따라야함
- 어떤일을 하는 함수인지 명확하게 알 수 있는 이름을 선택하는 것이 좋음
- 동사 + 목적어 형태의 이름 권장
- 서로 다른 함수가 같은 이름 사용불가 → 함수를 구분하는 수단이므로
매개변수 : 함수를 호출한 곳에서 함수 안으로 전달되는 값을 저장하는 변수
-
매개변수는 함수가 호출될 때 생성되고 함수 안에서 사용
-
함수를 호출 시에 넘겨주는 인자의 값으로 초기화
-
인자(인수) : 함수를 호출할 때 실제로 전달되는 값
-
매개변수의 선언
()안에 데이터형과 변수 이름을 써줌
- 매개변수 목록은 데이터형과 매개변수가 한쌍, 하나 이상인 경우 콤마로 나열
- 매개변수가 없을 때는
void라고 적어두거나 ()안을 비워둠
- 매개변수의 개수에는 제한이 없음
함수의 내용
- 헤더와 바디로 구성
- 헤더 : 함수를 호출하는데 필요한 정보(리턴형, 함수명, 매개변수 목록)를 적어주는 부분
- 바디 :
{ } 안에 함수가 처리할 내용을 적어주는 부분.
함수의 바디도 블록이므로 {}안에 문장들을 나열해서 필요한 코드를 작성
설계한 함수를 코드에 추가하는 법
- 함수 선언 또는 원형을 해둔 후 함수를 정의, 호출 → 권장 사항
- 함수 선언과 동시에 정의한 후 함수를 호출
여러 가지 함수의 정의
1. 리턴값과 매개변수가 없는 함수의 정의
-
리턴값과 매개변수 목록에 void를 적어줌
- 매개변수의
void는 생략가능 → 함수 선언문에서도 마찬가지
-
리턴타입이 void인 경우 생략 불가
-
리턴형이 void인 함수는 리턴값 없이 정해진 코드 수행 후 }를 만나면 호출한 곳으로 바로 되돌아감
-
함수 중간에 리턴문을 만나면 그 이후는 수행하지 않고 리턴
-
리턴형이 void이면 굳이 return을 함수 안에 적어줄 필요가 없지만, return;은 돌려주는 값 자체는 없으므로 리턴형이 void일때 사용 가능함.
-
간단한 함수는 한줄로 작성하기도 하지만, 나누어 써주는편을 추천함
2. 리턴값은 없고 매개변수만 있는 함수의 정의
3. 리턴값과 매개변수가 있는 함수의 정의
- 리턴값이 있는 함수에서는 반드시
retrun문을 작성해주어야함
필요한 기능을 함수로 정의 하는 방법
-
어떤 기능을 제공하는 함수인지 명확히 알수있도록 함수의 이름 지정
-
함수의 기능을 수행하기 위해서 함수를 호출한 곳에서 받아올 값을 정하고, 그 값으로 매개변수 목록을 작성
-
함수의 처리 결과로 어떤값이 생성될지 결정 후 그 값의 데이터형을 리턴형으로 지정
-
함수 코드를 작성함.
- 매개변수를 함수 안에 맘대로 사용 가능
- 함수안에서 다른 변수를 선언 가능
기존의 코드로부터 함수를 정의하는법
-
코드에서 특정부분을 수행하는 부분을 추출해 함수 이름을 지정
-
함수 호출 부분에서 받아올 값을 정해 그 값으로 매개변수 목록을 작성
-
함수 처리 결과로 어떤값이 생성될지 결정 후 그 값의 데이터형을 리턴형으로 정함
-
특정 기능을 수행하는 코드를 함수 정의로 옮기고 적절히 수정.
함수안에서만 사용되는 변수가 있다면 함수 정의로 옮김
-
기존의 코드에서 함수를 호출하고 리턴값을 받아오도록 코드를 수정
함수의 호출
: 이미 만들어진 함수를 불러 쓰는 것
-
함수 정의는 한번만 작성하고 필요한 만큼 여러번 호출 가능
-
함수 호출은 함수 이름 다음에 ()를 쓰고 () 안에 함수의 인자를 써줌으로써함
-
함수를 호출할 때 넘겨준 인자가 함수 정의에 있는 매개변수로 전달
-
함수를 호출하는 쪽과 함수의 정의는 서로 데이터를 주고 받음
-
함수를 호출하면 함수 내부코드를 수행하다가 함수의 끝을 만나거나 return문을 만나면 함수를 호출한 곳으로 돌아오고, 이 때 리턴값을 함수를 호출한 곳으로 전달
리턴값과 매개변수가 없는 함수의 호출
- 함수 이름 다음에
()를 적어줌.
()가 없으면 함수 호출이 아니므로 주의, 변수 이름으로 생각 → 컴파일 에러는 아님
- 과정
- 함수 호출문을 만나면 지금까지 수행하던 문장의 위치를 보관 후 함수 정의로 이동
- 함수 정의 안 코드를 순서대로 수행
return문이나 함수의 끝을 만나면 함수를 호출한 곳으로 돌아옴
- 함수 호출문의 다음 문장을 계속 수행
리턴값은 없고 매개변수가 있는 함수의 호출
- 함수 호출문에 지정된 인자를 순서대로 함수 정의에 있는 매개변수에 전달
- 지금까지 수행하던 문장의 위치를 보관해 두고 함수 정의로 이동
- 함수 정의 안의 코드를 순서대로 수행
return문이나 함수의 끝을 만나면 함수를 호출한 곳으로 돌아옴
- 함수의 호출문의 다음문장을 계속 수행
- 항상 인자와 매개변수의 개수가 같아야 함
- 매개변수가 2개 이상인 함수에서는 인자와 매개변수의 순서가 같아야함.
컴파일러는 인자와 매개변수의 개수와 데이터형이 같은지만 검사하므로 조건만 충족하면 컴파일 에러는 발생하지 않음
- 매개변수의 데이터형과 같은 형의 인자를 사용해야함
데이터형이 일치하지 않을시 암시적인 형 변환 발생
- 리턴형이
void형인 함수는 리턴값이 없으므로 수식이 아님(문자를 출력하면 값이 없는 것)
리턴값과 매개변수가 있는 함수의 호출 과정
- 인자를 순서대로 매개변수로 전달
- 지금까지 수행하던 문장의 위치를 보관해두고 함수 정의로 이동
- 함수 정의 안의 코드 순서대로 수행
- 함수 안에서 만들어진 리턴값을 함수 호출한곳으로 전달
- return문을 만나면 함수를 호출한 곳으로 돌아옴
- 함수 호출문의 다음문장 계속 수행
- 리턴값의 전달
- 리턴값은 함수 안에서 함수를 호출한 곳으로 전달.
- 리턴문이 넘겨주는 값이 함수 호출문의 값이 됨.
- 인자 전달 과정의 의미
- 매개변수는 함수가 호출될 때 생성, 인자의 값으로 초기화
- 인자와 매개변수의 데이터형이 불일치하면 형변환
- 주의점
- 함수의 인자도 수식
- 인자의 개수와 데이터형이 매개변수와 일치해야함
- 인자의 개수가 매개변수보다 부족하면 컴파일 에러
- 인자의 개수가 매개변수보다 많으면 컴파일 경고
- 데이터형이 서로 일치하지 않으면 암시적인 형변환 발생(리턴시에도 마찬가지)
- 함수호출시 대소문자까지 정확히 일치하는 이름으로 호출해야함
- 함수는 이름으로 구분되므로
- 컴파일러는 정의되지 않은 함수를
int형을 리턴하는 함수라 가정하고 컴파일 경고를 발생시키고, 링크 단계에서 다른 오브젝트 파일에 그 함수를 찾으려 시도하는데 못찾으면 링커가 외부 기호를 찾을수 없다는 링크 에러가 발생.
함수의 선언
- 함수의 선언 = 함수의 원형 = 함수의 시그니쳐
- 매개변수의 이름은 생략 가능
- 함수 호출시에는 매개변수의 개수와 데이터형만 필요
- 생략 시에는 매개변수의 데이터형만 콤마로 나열
- 매개변수가 있을시 선언문의
()안에도 매개변수를 적어준 상태로 선언해야함
일반적으로 소스파일의 시작 부분에 넣어줌
함수 선언을 생략하는 경우
함수 선언이 없는 상태로 호출하면 int형을 리턴하는 함수로 간주하는데, 암시적인 함수 선언과 함수 정의가 일치하지 않으므로 컴파일 에러 발생
함수 선언의 필요성
- 함수 선언이 있으면 함수가 정의된 위치에 관계 없이 함수 호출 가능
- 컴파일러는 소스 코드를 위에서 아래로 컴파일하므로 함수를 선언하지 않고 호출하면 아직 정의되지 않은 함수를 호출을 했기에 컴파일 에러가뜸
- 함수의 개수가 많고 호출 관계가 복잡할 때 함수의 선언이 유용
- 컴파일러에게 이러한 함수가 있다고 미리 알려주는 역할
- 소스코드를 컴파일하다가 함수 정의를 만나면 함수 호출문과 함수 정의를 연결
함수의 정의 vs 함수의 선언
- 정의는 함수의 내용을 기술
- 선언은 함수 호출할 때 필요한 정보를 제공
🍑지역변수
: 함수나 블록 안에 선언되는 변수
지역변수의 사용 범위
- 함수 블록에 선언된 지역 변수 → 함수 전체에서 사용 가능
- 제어문의 블록 안에 선언된 변수 → 해당 블록 안에서만 사용 가능
- 함수 안에 선언된 지역변수는 다른 함수에서 사용 불가
- 서로 다른 함수에서 같은 이름의 지역 변수를 선언하면, 이름은 같지만 서로 다른 변수
- 함수는 자신 안에 선언된 변수만 사용가능
지역 변수의 생성과 소멸
- 지역 변수는 지역변수가 선언된 블록 시작때 생성, 블록을 빠져나갈 때 자동 소멸
- 함수안에 선언된 지역 변수는 함수 호출시 생성, 함수 리턴시 소멸
- 지역변수는 함수가 호출되는 횟수만큼, 블록이 반복되는 만큼 생성되고 소멸
- 매개변수도 지역 변수
- 함수 안에서 매개변수의 값을 변경해도 그 값은 함수 리턴시 소멸하니 소용없음
- 그러므로 함수 안에서 만들어진 값을 함수를 호출하는 쪽에 넘겨주려면 매개변수를 변경하는 대신 리턴값을 이용
🍑전역변수
: 프로그램 전체에서 사용되는 변수
전역변수의 사용범위
- 전역변수는 여러함수에서 사용되어야 하므로 함수 밖에서 선언
초기화 하지 않아도 0으로 초기화
- 전역변수는 소스파일의 시작부분에 선언.
- 그러면 같은 소스파일을 모든 함수에서 전역변수 사용 가능
- 전역변수의 선언문 다음의 함수에서만 전역 변수 사용 가능하므로 소스파일 시작부분에서 선언 추천
전역변수의 생성과 소멸
- 전역변수는 프로그램 시작시 생성, 프로그램 종료 때 소멸
- 함수안에서 전역변수 변경시 그 값은 함수가 리턴한 다음에도 계속 사용
- 전역변수에서 실수가 나면 프로그램 전체에 영향을 미치기에 주의해서 사용
- 함수 사이의 정보 공유 목적일때는 매개변수 사용 추천
변수의 영역 규칙
- 블록 안에 같은 이름의 변수를 여러번 선언하면 컴파일 에러
- 블록 범위가 다를 때는 같은 이름의 변수를 여러번 선언 가능
- 이름은 같지만 서로 다른 변수 일 때 변수의 영역 규칙에 따라서 어떤 변수 사용될지 결정
- 가까운 블록 안에 선언된 변수가 우선적으로 사용