✅ 1. 블록과 변수
(1) 블록과 변수 - 개요
- 블록(block) 과 변수(variable) 은 프로그래밍 언어가 데이터를 저장하고, 실행 범위를 관리하는 가장 기본 단위임.
- 변수의 유효범위(scope) 문제는 변수에 대한 기억 장소의 할당 및 유지에 대한 문제로 볼 수 있음.
- 즉, 블록내 변수에 대한 유효 범위 결정 문제는 프로그램의 실행과 깊은 관련을 가진다.
[ 유효 범위 결정 문제 ]
- 블록이 여러 겹으로 중첩이 되어있는 경우 "어떤 블록에서 정의된 변수를 어디까지 쓸 수 있나?", "겹쳐진 블록 안에서 같은 이름의 변수를 선언하면 어떤 걸 써야 하나?" 와 같은 문제를 의미한다.
[ 블록과 변수 ]

- 현재의 고급언어들은 위와같이 블록을 이용해 구조적 프로그래밍의 반복, 제어와 같이 복합문을 구현 할 수 있음.
- 위와 같은 구조로 블록 내부에서 변수에 대한 메모리 관리를 블록 단위로 해줄 수 있게 됨.
- ( * 단, 언어마다 특성이 다르기 때문에 블록 단위로 하지 않을 경우도 있음. )
- 하지만, 여기선 대표적으로 쓰이는 블록을 기초로 변수의 유효 범위를 관리하는 방법에 대해서 말할것임.
(2) 블록과 변수 - 유효 범위
- 블록들은 중첩되는 구조도 가질 수 있어서 블록 안에 다른 블록이 들어가 있을 수 있음.
- 블록 내부 어디에 위치하느냐에 따라서 변수를 전역 변수, 지역 변수로 나눌 수 있음.
[ 전역 변수 ]
- 프로그램 코드의 모든 영역에서 기억 장소의 할당이 유효함.
- 즉, 프로그램 시작부터 끝까지 메모리 기억장소에서 할당 받은 공간이 유지가 되는 것임.
[ 지역 변수 ]
- 변수가 정의된 블록 안에서만 기억 장소의 할당이 유효함.
- 즉, 지역변수는 블록의 실행이 다 끝나게 되면 해당 블록내의 변수는 날라가는 범위를 가짐.

- [ 블록 1 ] 에 선언 및 초기화 된 int gx = 10; 내부에 [ 블록 2 ] 가 만들어졌으므로, [ 블록 2 ] 에서 gx 는 사용이 가능함.
- 즉, [ 블록 1 ] 이 끝나기전까지는 int gx = 10; 의 메모리 공간은 유지가 됨.
- 반면, [ 블록 2 ] 의 int y = 2; 의 유효범위는 [ 블록 2 ] 이 끝나면 사라지게 됨.
- 또한, [ 블록 2 ] 의 int gx = 20; 은 새로운 변수를 선언 및 초기화를 한 것이지 [ 블록 1 ] 의 gx 와는 전혀 관련이 없음.
- 이렇게 동일한 변수명을 선언할 수 있는 이유는, 블록이 다르기 때문에 적용이 가능한 것임.
- 결국 재정의된 gx 라는 말은 애초에 틀린 표현 인듯..
(3) 블록과 변수 - 유효 범위 규칙
[ 유효 범위 ]
- 같은 이름의 변수가 프로그램의 여러 곳에서 정의되어 사용될 때, 어디서 정의된 어떤 변수의 값을 참조하고 접근할 것인가는 유효 범위 규칙에 따라 결정이 된다.
[ 유효 범위 결정 문제 ]
- 블록이 여러 겹으로 중첩이 되어있는 경우 "어떤 블록에서 정의된 변수를 어디까지 쓸 수 있나?", "겹쳐진 블록 안에서 같은 이름의 변수를 선언하면 어떤 걸 써야 하나?" 와 같은 문제를 의미한다.
- 이러한 문제를 해결하기 위해선, 유효 범위 규칙(유효 범위 결정 기준)이 필요하다.
[ 유효 범위 규칙 ]
- 코드가 여러 블록안에 중첩되어 있을 때, 어떤 변수를 어디까지 사용할 수 있는지(유효한 범위)를 정하는 규칙
- 종류는 대표적으로 정적 유효 범위 규칙, 동적 유효 범위 규칙 두 가지가 있음.
[ 정적 유효 범위 규칙 ]
- 변수의 유효 범위 결정은 컴파일이 이루어지는 시기에 코드에서 가장 가까이 정의된 것으로 유효 범위가 결정됨
- 쉽게말해, 컴파일 시점에 이미 순서를 정해두는 것이라고 보면 됨. ( 현대 언어에서 많이 씀 )
[ 동적 유효 범위 규칙 ]
- 코드의 실제 실행 환경에 따라 변수의 유효 범위가 결정됨.
- 쉽게말해, 실행중에 어디서 호출이 되고, 어디서 실행되는지에 따라서 변수의 유효 범위가 결정되는 것을 의미함.
✅ 2. 함수의 기본 개념
(1) 부프로그램: 함수와 프로시저
[ 부프로그램(Subprogram) ]
- 반복 사용되는 코드 부분을 하나의 단위로 묶어서, 고유한 이름을 부여하고, 그 이름을 일반 명령어처럼 사용할 수 있게 만든 것을 의미한다.
- 부프로그램의 종류는 크게 함수와 프로시저로 구분이 된다.
[ 함수와 프로시저 ]
- 함수: 결과값을 반환하는 특징을 가진다. 즉, 입력을 받아 처리 결과값을 돌려주고 싶을 때 사용함.
- 프로시저: 값을 반환하지 않는 특징을 가진다. 즉, 특정 작업 수행 목적으로 동작 자체가 목적일 때 사용함.
- 둘 다 재사용 가능한 코드 단위라는 점에서 부프로그램으로 불림.
- # C, C++ 은 void 로 반환값이 없는 경우도 있지만 그냥 함수로 통일해서 부
(2) 부프로그램: 함수와 프로시저 - 내부 동작

- 위와 같이 함수를 호출하는 곳을 호출 함수, 호출 당하는 함수를 피호출 함수라고 한다.
- 함수의 호출이 발생되면, 함수를 호출한 프로그램의 수행이 일시 중단되고 호출된 함수로 실행 제어가 이전됨.
- 피호출 함수의 실행 중에 함수 종료 조건이 만족되면 실행 제어가 호출한 함수나 호출한 프로그램으로 돌아감.
- 함수의 제어 진입점은 항상 첫 줄이지만 제어 종료(return) 조건에 따라서 여러 줄에서 이루어질 수 있음.
(3) 함수의 매개변수
- 매개변수(parameter): 호출 함수와 피호출 함수 사이에서 주고 받는 데이터를 의미함.
- 호출 함수는 피호출 함수의 실행 대상이 될 수 있는 데이터를 매개변수로 넘길 수 있음.
- 피호출 함수에서 처리될 값을 전달하는 매개변수는 특정 데이터형을 가질 수 있음.
- 반환값: 피호출 함수의 실행 결과를 돌려주는 반환값도 특정 데이터 형을 가진다.
- 매개변수로 데이터를 넘겨 처리 후 반환값을 통해 다시 전달하는 구조로 볼 수 있음.
[ 형식매개변수 ]
// 형식 매개변수: () 괄호 안의 변수를 의미함.
int function(int x) {
return x;
}
- 피호출 함수의 정의에 사용된 매개변수를 의미한다.
[ 실매개변수 ]
// 실 매개변수: 호출 함수의 () 인자로 넘기는 값을 의미함.
int a = function(10);
int function(int x) {
return x;
}
- 호출 함수에서 피호출 함수를 호출하기 위해 사용된 매개변수를 의미함.
(4) 함수의 매개변수 - 호출 방식
- 호출하는 프로그램과 호출되는 함수 사이의 매개변수를 전달하는 방식에 따라 값 호출 방식, 참조 호출 방식으로 나뉨.
[ 값 호출 방식 ]
void change(int a, int b) { // 값 호출 방식
a = 100;
b = 200;
printf("%d, %d\n", a, b); // result: 100, 200
}
int main() {
int a = 1, b = 2;
add(a, b); // 값을 넘긴것임.
printf("%d, %d\n", a, b); // result: 1, 2
}
- 실 매개변수로 들어가는 것은 주소값이 아닌 실제 값을 넘기게 되며, 이후 형식 매개변수로 받아서 처리를 하게 된다.
- 해당 방식은 형식 매개변수로 선언 된 a와 b는 실 매개변수로 전달하는 인자값으로 초기화가 된다.
- 즉, 새롭게 변수가 선언이 되고 초기화가 되는 방식이며, 해당 형식 매개변수는 함수 내부에서만 유효한 수명을 가지게 된다.
[ 참조 호출 방식 ]
void change(int *a, int *b) {
*a = 100;
*b = 200;
printf("%d, %d\n", *a, *b); // result: 100, 200
}
int main() {
int a = 1, b = 2;
add(&a, &b); // 주소를 전달 (참조 호출)
printf("%d, %d\n", a, b); // result: 100, 200
}
- 실 매개변수로 인자를 넘길 때 값이 아닌 주소값을 보내주고 형식 매개변수에서는 주소값을 받는 방식이다.
- 즉, 형식 매개변수가 값을 받을 때, 값 전달 방식과 동일하게 형식 매개변수는 변수를 선언과 동시에 초기화를 하게 된다.
- 다만 다른점은 해당 변수값으로 주소값을 넣었기 때문에 포인팅이 되어있는 상태이다.
- 즉, change() 함수의 형식 매개변수로 선언 및 초기화 된 a 와 b 는 새로 만들어진 변수지만, 내부에는 main() 에서 선언 된 a 와 b 의 주소값을 가지고 있기 때문에 수정이 일어난다면 main() a , b 의 값이 변경이 되게 된다.
✅ 3. 변수의 수명
- 변수가 값을 저장하기 위해서는 기억 장소(메모리) 를 할당 받아야 한다.
- 해당 메모리에 변수가 할당 되고 이후부터 해제될 때까지를 변수의 수명으로 본다.
- 이러한 변수의 수명은 할당 방식에 따라 자동 할당, 정적 할당, 지정 할당 3가지 방식으로 나뉜다.
- 이러한 할당 방식이 변수의 수명을 결정하게 되는 것이다.
(1) 자동 할당 방식
void test() {
int x = 10; // 함수 시작할 때 스택에 x 생성
} // 함수 끝나면 x 자동 소멸
- 변수가 선언된 블록(함수, if문 등)이 시작될 때 자동으로 메모리가 할당이 된다. -> 보통 지역변수
- 이후, 블록이 끝날 때 자동으로 해제(회수)가 된다.
- 컴파일러가 관리해주며, 주로 스택 영역에 저장이 됨. ( 런타임 시점에 블록에 들어갈 때 메모리 할당 받는다 생각하면 됨 )
(2) 정적 할당 방식
int count = 0; // 전역 변수 → 프로그램 시작 시 메모리 확보
static int num = 5; // 정적 지역 변수 → 역시 프로그램 종료 시까지 유지
- 프로그램이 시작될 때 자동으로 메모리를 확보함. ( 데이터 영역에 저장이 됨. ) -> 보통 전역변수
- 이후, 프로그램이 종료가 되면 해제가 됨. ( 컴파일 시점에 메모리 할당이 된다고 보면 됨. )
- 즉, 프로그램 전체동안 유지가 됨.
(3) 지정 할당 방식
int *p = malloc(sizeof(int)); // 직접 요청
*p = 10;
free(p); // 직접 해제 (안 하면 메모리 누수)
- 프로그래머가 직접 요청하고 직접 해제해야 함.
- 힙(Heap) 영역에 저장이 되며, 프로그래머가 직접 관리를 함.
✅ 4. 객체 지향 프로그램을 위한 추상 자료형
(1) 추상화
- 추상화는 공통점은 드러내고, 차이점은 감추어 복잡한 대상을 단순하고 일반화된 형태로 표현하는 과정임.
- 즉, 복잡한 대상이나 개념에서 핵심적인 속성만을 추출하여 표현하고, 불필요한 세부사항은 숨기거나 제거하는 것을 의미함.
- 의의: 공통된 특징(유사성)을 묶어 하나의 그룹이나 개념으로 단순화함으로써 이해와 재사용을 쉽게 할 수 있음.
- 정리하면, 추상화 자체는 복잡한 걸 단순화하는 사고방식으로 볼 수 있음.
[ 예시 ]
- 지도: 세상엔 건물, 나무, 사람, 자동차 등 수많은게 있지만, 지도에는 도로와 위치 정보만 표시됨 ( 불필요한 건 생략 )
- 리모컨: TV 내부 회로나 전기 신호는 몰라도, 버튼으로 모든 회로를 동작시킬 수 있음. ( 복잡한 내부 숨김, 필요한 기능 노출 )
- 자동차: 운전 엔진 작동 원리는 몰라도 핸들, 엑셀, 브레이크만 조작하면 됨 → 핵심 동작만 추출한 결과
[ 결론 ]
- 추상화 자체는 프로그래밍 전반, 더 나아가 사고의 방식 전반에 쓰이는 일반적인 개념임.
- 즉, 절차적 프로그래밍에서 복잡한 코드를 함수로 묶는 것도 추상화로 볼 수 있음.
- 여기서 객체지향 프로그래밍을 논하면, 객체지향 프로그래밍은 객체의 추상화를 통해 구현하는 프로그래밍 기법임.
- 즉, 추상화 개념을 객체에 적용해 객체 단위로 공통점을 묶는 추상화를 의미하는 것임.
(2) 프로시저의 추상화
- 수행 방법을 기술하지 않고 무엇이 수행되는가를 묘사함으로써 추상화시켜 주는 실행과정의 추상화 기법임
- 쉽게말해, 정렬 함수가 있다고 가정하면 내부의 구체적인 알고리즘 명세없이 정렬 함수라는것 자체로 정렬을 하기 때문에 가져다가 사용하면 하면 되는 경우로 보고 이러한 수행만 묘사하는 함수 추상화로 볼 수 있음.
- 객체지향에서 객체 내부의 메서드는 “프로시저 추상화”의 연장선상에 있다고 볼 수 있음.
- 결국 부차적인 속성인 구현 소스 코드, 알고리즘은 구현된 정렬 알고리즘으로서 프로그래머 입장에서 중요하게 보지 않게됨.
(3) 자료의 캡슐화

- 캡슐화는 내부 구현을 숨기고 외부에서는 필요한 기능만 볼 수 있도록 제한하는 것을 의미한다.
- 캡슐화를 사용하는 이유는 객체의 일관성과 안정성을 유지하기 위해서이다.
- 즉, 캡슐화된 내부 코드의 변경으로 인해 외부 코드에 영향이 갈 수 있으므로 막기 위함임.
- 결과적으로, 캡슐화는 데이터를 감추거나 단순화하는 개념이며 프로그램을 재사용하기 쉽게 만들기 위한 핵심 원리임.
- 캡슐화로 인해 객체 내부 구조를 몰라도 외부에서 미리 정의된 이름(메서드, 인터페이스)만 알고 사용이 가능해짐.
'방송통신대학교 > 💻컴퓨터과학 개론' 카테고리의 다른 글
| [컴퓨터과학 개론] 14강 - 데이터베이스(2) (0) | 2025.11.10 |
|---|---|
| [컴퓨터과학 개론] 13강 - 데이터베이스(1) (0) | 2025.11.10 |
| [컴퓨터과학 개론] 11강 - 프로그래밍 언어(1) (0) | 2025.11.10 |
| [컴퓨터과학 개론] 10강 - 컴퓨터 구조(2) (0) | 2025.11.10 |
| [컴퓨터과학 개론] 9강 - 컴퓨터 구조(1) (0) | 2025.11.10 |
