프로시저, 서브루틴, 함수
프로시저, 서브루틴, 함수라는 세용어는 관심을 갖는 범위안에서는 모두 동일한 것을 의미한다고한다.
👉 메소드(method) = 함수(fuction) = 프로시저(procedure) = 서브루틴(sub-routine) = 루틴(routine) = 서브프로그램(subprogram) = 호출가능 단위(callable unit)
1) 함수의 장점
- 복잡한 프로그래밍 작업을 더 간단한 단계로 분해 : 이것은 데이터 구조 와 함께 구조화된 프로그래밍 의 두 가지 주요 도구 중 하나입니다.
- 프로그램 내 중복 코드 줄이기
- 여러 프로그램 에서 코드 재사용 가능
- 다양한 프로그래머 또는 프로젝트의 다양한 단계 사이에 큰 프로그래밍 작업을 분할
- 서브루틴 사용자에게 구현 세부 정보 숨기기(정보 은닉, 함수명과 기능만 알아도 사용가능)
- 코드 블록을 설명 적인 함수 이름이 코드 블록을 설명하는 역할을 하는 함수 호출로 교체하여 코드의 가독성을 개선 합니다. 이것은 함수를 재사용할 의도가 없더라도 호출 코드를 간결하고 읽기 쉽게 만듭니다.
- 추적 가능성 개선 (즉, 대부분의 언어는 관련된 서브루틴의 이름과 파일 이름 및 줄 번호와 같은 더 많은 정보를 포함하는 호출 추적을 얻는 방법을 제공합니다.) 코드를 서브루틴으로 분해하지 않으면 디버깅이 심각하게 손상됩니다.
- 언어마다 다르지만 대략 다음과 같은 형식
function 함수명(인자1, 인자2, 인자3) {
구문
return 반환값
}
2) 함수가 돌아가는 구조
👉 리턴주소 스택 -> 말그대로 주소를 리턴해준다.
3) 함수의 원리 - 프로그램 카운터
- 프로그램 카운터(Program counter, PC)는 마이크로프로세서(중앙 처리 장치) 내부에 있는 레지스터 중의 하나로서, 다음에 실행될 명령어의 주소를 가지고 있어 실행할 기계어 코드의 위치를 지정한다. 때문에 명령어 포인터라고도 한다.
- 함수로 들어간 위치가 바로 프로그램 카운터의 값이라고 한다.
👉 프로그램 카운터가 명령어의 주소를 가지고 있어, 함수를 실행하고 다시 원래 자리로 돌아 오는 것이다!
스택
1) 스택이란?
- 스택은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조(LIFO - Last In First Out)으로 되어 있다.
2) 오버플로우 & 언더플로우
3) 스택프레임
- 함수 하나가 다른 함수를 부를 때 일어나는 일
- 운영체제가 메인 함수를 호출하는 순간 메인 함수의 활성화 레코드가 생성된다. 활성화 레코드는 스택에 저장되는 것으로 일명 스택 프레임이라고도 한다.
- 스택 메모리는 활성화 레코드와 직결되어 있다. 재귀 호출을 비롯한 모든 함수 호출에는 수반된다.
- 반환값(Return Value): 피호출 함수가 호출 함수에게 반환하는 값
- 값 파라미터(Value Parameter): 호출함수가 피 호출함수에게 넘기고자 하는 값
- 반환 주소(Return Address): 함수가 호출된 곳의 다음 주소. 운영체제 프로그램의 번지수 200번지에 있는 명령문에서 메인 함수를 불렀다면, 메인 함수수행이 끝난 다음에는 다시 운영체제 프로그램의 바로 다음 명령문을 수행해야 하기 때문에, 여기에 204(예를 들어, 명령문 길이가 4바이트인 경우)를 기록한다.
- 지역변수(Local Variables): 함수 내에서 선언된 지역변수를 저장하는 곳.
- 기계어 코드 : 컴퓨터가 바로 실행할 수 있는 이진수 형태의 기계어 코드 → 프로그램
- 전역변수 : 프로그램에 선언한 전역변수
- 힙 : 프로그램 실행 중 필요에 의해 동적으로 할당되는 메모리
- 프로그램이 시작 될 때, 일정한 양의 힙 메모리가 프로그램에 할당 된다.
- 힙 메모리의 크기는 운영체제가 정한 최대 가상 메모리(Virtual Memory) 만큼이다.
4) DFS vs BFS
- 깊이 우선 탐색 - DFS(Depth-first search)
자식 노드를 우선적으로 탐색하는 탐색 기법
= 아직 방문되지 않은 인접 노드(자식 노드)를 우선적으로 탐색
깊이 우선 탐색은 한쪽만 죽어라 파다가 더이상 팔 곳이 없으면 다시 돌아와서 다른 한쪽을 죽어라 파는 형식이다.
깊이 우선 탐색은 Stack을 통해 구현된다.
그렇기 때문에 DFS를 구현할 떄 stack이나 재귀 함수를 사용할 수 있다.
(재귀 함수를 사용하면 call stack을 사용하기 때문에 stack overflow를 조심해야 한다)
- 너비 우선 탐색 - BFS(Breadth-first search)
형제 노드를 우선적으로 탐색하는 탐색 기법. (레벨 순회(level-order traversal)라고도 한다)
= 아직 방문되지 않은 이전 노드(부모 노드)의 인접 노드(현재 노드의 형제 노드)를 우선적으로 탐색
보통 너비 우선 탐색은 Queue를 통해 구현된다.
- 최단 경로 탐색에서 DFS가 아닌 BFS가 선호되는 이유
BFS를 사용하면 매 탐색마다 휴리스틱 값을 찾아서 가장 최선의 휴리스틱 값의 노드로 확장이 가능하기 때문에 DFS대신 BFS가 최단 경로 탐색에 사용된다.
휴리스틱이란? '대충 어림 짐작하기 값 = 추정 값'
참조 : https://gent.tistory.com/270
참조 : https://dokhakdubini.tistory.com/393
참조 : https://codedragon.tistory.com/7948
'웹 기술 쌈싸먹기 > 용어정리' 카테고리의 다른 글
계층적인 데이터구조, 대용량 저장장치 (0) | 2022.02.11 |
---|---|
[입출력과 네트워킹] 저수준 I / O (0) | 2022.02.04 |
HTTP 구조 및 핵심 요소 (0) | 2022.01.24 |
JVM, JDK, JRE? (0) | 2022.01.23 |
객체지향 프로그래밍(Object Oriented Programing)? (0) | 2022.01.23 |