블록 (프로그래밍)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
블록은 프로그래밍 언어에서 여러 문장을 묶어 하나의 단위로 취급하고 변수의 범위를 제한하는 데 사용되는 구조이다. 1950년대 오토코드 개발 과정에서 아이디어가 발전하여, 알골 58과 알골 60 보고서를 통해 공식화되었다. 블록은 괄호, 키워드, 들여쓰기 등 다양한 구문을 통해 표현되며, C, 파스칼, 파이썬, Scheme 등 여러 프로그래밍 언어에서 사용된다. 블록은 코드의 구조를 명확하게 하고, 변수의 유효 범위를 제어하여 코드의 가독성과 유지 보수성을 향상시킨다. 일부 언어에서는 중첩 함수를 허용하지 않는 등 블록 사용에 제한이 있을 수 있으며, 변수 선언 방식에 따라 블록 범위를 벗어나 변수가 사용될 수도 있다.
더 읽어볼만한 페이지
| 블록 (프로그래밍) | |
|---|---|
| 프로그래밍 | |
| 종류 | 구문 컴파일러 인터프리터 |
| 언어 지원 | C, C++, C#, 델파이, 자바, 자바스크립트, 펄, PHP, 파이썬 |
| 개념 | |
| 정의 | 코드 블록 (때로는 복합문이라고도 함)은 프로그램에서 하나 이상의 명령을 포함하는 소스 코드 텍스트 섹션임. 명령형 프로그래밍 언어에서 블록은 변수와 함수가 정의될 수 있는 범위를 제공함. |
| 설명 | 코드 블록은 소스 코드에서 함께 그룹화된 문 그룹 또는 프로그램임. 블록은 복합문이라고도 함. 코드 블록은 소프트웨어 프로그래밍에서 매우 중요함. 블록은 일반적으로 다른 문 내에 포함될 수 있음. 블록 내에 포함된 블록을 중첩된 블록이라고 함. 블록 구조는 여러 개의 블록을 서로 내부에 포함하는 구조임. 블록 구조는 프로그램 또는 함수 내에서 프로그램의 여러 부분과 구역을 나타내는 데 유용함. |
| 구문 | |
| 시작 및 종료 표시 | 많은 언어에서 블록은 명시적으로 표시하여 시작과 끝을 표시해야 함. C와 C++와 같은 언어는 중괄호 ({})를 사용하여 블록을 묶음. 다른 언어는 BEGIN과 END와 같은 키워드를 사용함. |
| 범위 | |
| 설명 | 대부분의 언어에서 코드 블록은 범위를 가짐. 블록 내에서 생성된 변수는 일반적으로 해당 블록 내에서만 사용할 수 있음. |
2. 역사
블록 구조의 개념은 1950년대 최초의 오토코드 개발 과정에서 발전했으며, 알골 58 및 알골 60 보고서에서 공식화되었다. 알골 58은 제어 흐름과 관련된 "복합 문장" 개념을 도입했다.[1] 이후 발표된 알골 60의 구문과 의미를 설명하는 ''개정 보고서''는 블록과 블록 범위의 개념을 도입했는데, 블록은 "선언 시퀀스와 문장 시퀀스로 구성되며 begin과 end 사이에 묶여있으며..." "[e]모든 선언은 이와 같은 방식으로 블록에 나타나며 해당 블록에 대해서만 유효하다"고 설명하고 있다.[2]
프로그래밍 언어마다 블록을 나타내는 구문은 다르다. 주요 구문 방식은 다음과 같다.
3. 구문
F#처럼, 경량 구문(lightweight syntax)과 장황한 구문(verbose syntax)을 모두 지원하는 언어도 있다.
4. 의미
블록의 의미는 크게 두 가지로 나눌 수 있다.
첫째, 블록은 프로그래머가 크고 복잡한 구조를 만들고, 이를 단일 단위로 취급할 수 있게 해준다.
둘째, 블록은 변수 및 기타 객체의 범위를 제한하는 데 사용된다.
초기 프로그래밍 언어인 Fortran IV와 BASIC에는 블록 구조가 없어서, 조건문을 구현하려면 goto 문을 사용해야 했다.
```fortran
C LANGUAGE: ANSI STANDARD FORTRAN 66
C 계산할 값 초기화
PAYSTX = .FALSE.
PAYSST = .FALSE.
TAX = 0.0
SUPTAX = 0.0
C 직원이 세금 한도액 미만으로 벌 경우 세금 공제 건너뛰기
IF (WAGES .LE. TAXTHR) GOTO 100
PAYSTX = .TRUE.
TAX = (WAGES - TAXTHR) * BASCRT
C 직원이 초과세 한도액 미만으로 벌 경우 초과세 공제 건너뛰기
IF (WAGES .LE. SUPTHR) GOTO 100
PAYSST = .TRUE.
SUPTAX = (WAGES - SUPTHR) * SUPRAT
100 TAXED = WAGES - TAX - SUPTAX
```
위 코드에서는 프로그램의 논리적 구조가 명확하게 드러나지 않아, 특정 문장이 언제 실행되는지 파악하기 어렵다.
반면, 블록 구조를 사용하면 코드의 논리적 구조를 명확하게 반영할 수 있다.
```pascal
{ Language: Jensen and Wirth Pascal }
if wages > tax_threshold then
begin
paystax := true;
tax := (wages - tax_threshold) * tax_rate
{ 블록 구조는 코드의 명확성을 위해 어떻게 리팩토링할 수 있는지 쉽게 보여주고, 그렇게 하는 것이 더 쉽도록 만들어준다.
내부 조건문의 구조를 외부 조건문에서 완전히 제거하고 그로 인한 영향을 쉽게 예측할 수 있기 때문이다. }
if wages > supertax_threshold then begin
pays_supertax := true;
supertax := (wages - supertax_threshold) * supertax_rate
end
else begin
pays_supertax := false;
supertax := 0
end
end
else begin
paystax := false; pays_supertax := false;
tax := 0; supertax := 0
end;
taxed := wages - tax - supertax;
```
위 파스칼 코드처럼 블록을 사용하면 프로그래머의 의도를 쉽게 파악할 수 있고, 코드 수정도 용이하다.
또한, 블록 구조는 변수의 범위를 세밀하게 제어하여 버그 발생 가능성을 줄여준다.
```scheme
;; Language: R5RS Standard Scheme
(let ((empno (ssn-of employee-name)))
(while (is-manager empno)
(let ((employees (length (underlings-of empno))))
(printf "~a has ~a employees working under him:~%" employee-name employees)
(for-each
(lambda (empno)
;; 이 람다 표현식 내에서 변수 empno는 하위 직원의 ssn을 참조한다.
;; 외부 표현식에서 관리자의 ssn을 참조하는 변수 empno는 가려진다.
(printf "Name: ~a, role: ~a~%"
(name-of empno)
(role-of empno)))
(underlings-of empno)))))
```
위 Scheme 코드에서 `empno` 변수는 관리자와 하위 직원을 식별하는 데 사용되지만, 하위 직원의 `empno`는 내부 블록에 선언되어 외부 블록의 `empno`와 충돌하지 않는다.
C 언어 등에서는 블록이 변수의 범위를 구분한다. 즉, 특정 블록 내에서 정의된 변수는 블록 외부에서 접근할 수 없다. 자바스크립트는 ECMAScript 6th Edition (ECMAScript 2015)에서 도입된 `let` 선언을 통해 블록 범위 변수를 지원한다.
스몰토크나 루비에서 블록은 메서드 호출에 추가되는 특별한 인수로, 클로저와 유사하다.
5. 한계
일부 언어는 블록 내에서 모든 선언을 지원하지 않는다. 예를 들어, 많은 C 파생 언어는 블록 내에서 함수 정의를 허용하지 않는다(중첩 함수). 또한, 파스칼은 기존 블록의 begin과 end 내부에서 자체 선언이 있는 블록 사용을 지원하지 않고, 단지 '''if''', '''while''', '''repeat''' 및 기타 제어문에서 일련의 문장을 함께 묶을 수 있는 복합문만 지원한다.[1]
6. 호이스팅
일부 언어에서는 변수가 중괄호로 묶인 블록 내에서도 함수 범위로 선언될 수 있다. 예를 들어, 자바스크립트에서 `var`로 선언된 변수는 함수 범위를 갖는다.[3] C 언어 등에서는 블록이 변수의 범위를 구분한다. 자바스크립트(ECMAScript)는 이전에는 블록이 변수의 스코프에 영향을 미치지 않았지만, ECMAScript 6th Edition (ECMAScript 2015)에서 도입된 let 선언에 의한 변수는 해당 변수가 선언된 블록의 끝까지가 가시 범위가 된다.[4]
7. 블로킹/넌블로킹 처리 (일본어 문서 내용)
동작이 완료될 때까지 호출 측이 대기하는 (블록되는) 처리를 블로킹 처리(blocking processing)라고 부른다. 블록된 상황에서 즉시 에러를 반환하여 호출 측을 기다리지 않게 하는 방식을 넌블로킹 처리(non-blocking processing)라고 부른다. 대표적인 예로 네트워크 통신에서의 블로킹과 넌블로킹을 들 수 있다.[1]
호출이 완료됨과 동시에 처리 결과를 통지하는 방식을 동기 처리(synchronous processing)라고 부른다. 처리를 시작한 후 나중에 (이벤트나 콜백 함수를 사용하여) 결과를 통지하는 방식을 비동기 처리(asynchronous processing)라고 부른다. 통상 파일 등의 스토리지 입출력 처리(Input/Output, I/O)에는 비동기 I/O를 사용한다.[1]
8. 동기/비동기 처리 (일본어 문서 내용)
호출 측이 동작 완료를 기다리는 (블록되는) 처리를 블로킹 처리(blocking processing)라고 한다. 블록된 상황에서 즉시 오류를 반환하여 호출 측이 기다리지 않게 하는 방식을 넌블로킹 처리(non-blocking processing)라고 한다. 네트워크 통신에서의 블로킹과 넌블로킹이 대표적인 예이다.
호출이 완료됨과 동시에 처리 결과를 통지하는 방식을 동기 처리(synchronous processing)라고 한다. 처리를 시작한 후 나중에 (이벤트나 콜백 함수를 사용하여) 결과를 통지하는 방식을 비동기 처리(asynchronous processing)라고 한다. 통상 파일 등의 스토리지 입출력(I/O)에는 비동기 I/O를 사용한다.
9. 예시
C 언어에서 블록은 중괄호(`{}`)를 사용하여 정의되며, 여러 개의 문장을 묶어 하나의 단위로 처리할 수 있게 해준다. 비주얼 베이직은 종료 문장을 명확히 기술해야 한다. SQL이나 파스칼 등 다른 몇몇 언어들은 시작(Begin)문과 종료(End)문으로 블록을 구성한다.
9. 1. C 언어
C 언어에서 블록은 중괄호(`{}`)를 사용하여 정의된다. 블록은 여러 개의 문장을 묶어 하나의 단위로 처리할 수 있게 해준다.다음은 C 언어에서 블록을 사용한 간단한 예시이다.
```c
int main()
{
return 0;
}
```
위 코드는 `main` 함수의 본체를 나타내는 블록을 보여준다. `main` 함수는 C 프로그램의 시작점이며, 중괄호 안의 내용은 `main` 함수가 실행될 때 수행되는 코드를 나타낸다.
다음은 중첩된 블록의 예시이다.
```c
int main()
{
int x = 1;
if (x == 1)
{
x++;
}
return 0;
}
```
위 코드에서 `if` 문 안에는 또 다른 블록이 존재한다. 이 블록은 `x`가 1일 경우에만 실행되며, `x` 값을 증가시킨다.
다음은 `while` 문을 사용한 중첩 블록 예시이다.
```c
#include
int main(void)
{
int x = 0;
while (1)
{
if (x < 10)
{
printf("%d\n", x);
x++;
}
else
{
printf("Finished.\n");
break;
}
}
return 0;
}
```
위 코드는 `while` 문 내부에 `if`와 `else` 블록이 중첩된 형태이다. `x`가 10보다 작을 때는 `x`를 출력하고 증가시키며, 그렇지 않으면 "Finished."를 출력하고 반복문을 종료한다.
9. 2. 파스칼
파스칼은 `Begin`문과 `End`문으로 블록을 구성한다.참조
[1]
논문
Preliminary report: international algebraic language
ACM
1958
[2]
논문
Report on the Algorithmic Language ALGOL 60
http://www.masswerk.[...]
ACM
2009-10-27
[3]
서적
JIS X 3003:1993 電子計算機プログラム言語Full BASIC
[4]
문서
생존기간, 寿命 (lifetime) あるいはエクステント (extent) とも。
[5]
웹사이트
Verbose Syntax - F# | Microsoft Docs
https://docs.microso[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com