코드(Code) , 코드 블록(Block), 블록내의 Variable
이번글에서는 코드블록에 대해서 적어 보겠습니다.
- 실이 모여서, 천이 되고, 천으로 옷을 만듭니다.
- 여러 개의 톱니바퀴들이 모여서 시계가 됩니다.
- 하나의 서랍장 안에는 여러 개의 서랍이 있습니다.
프로그램도 마찬가지입니다.
한 줄의 코드 라인이 있고, 여러 라인이 모여서 블록이 되고, 여러 개의 블록들이 프로그램이 됩니다.
프로그램 코딩의 최소 단위는 라인이며, 라인이 모여 블록이 되고 이 블록들이 상호작용을 하면서 프로그램이 됩니다.
블록은 여러 라인의 코딩 라인이 모여 어떤 기능을 하는 덩어리라고 생각할 수도 있습니다.
상자 안에 여러 개의 물건이 있는 것처럼 코드 블록에는 여러 개의 코드 라인이 있습니다. 또, 블록 안에는 또 다른 블록을 넣을 수도 있습니다.
이 블록은 왜 필요할까요.?
프로그램 코딩을 하다 보면, 어떤 덩어리 단위로 일을 처리해야 하는 경우가 많습니다. 이 덩어리가 블록입니다.
신호등이 있는 횡단보도에서 길을 건너는 것을 코딩을 얘로 적겠습니다.
횡단보도에 "녹색불이 켜지면 => 좌우를 살피고 , 길을 건넌다"라고 하면,
"녹색목이 켜지면"은 어떤 조건입니다. 이 조건이 참이면, 1) 좌우를 살핀다, 2) 길을 건넌다. 의 두 가지 일을 하는 겁니다.
이를 코드로 적으면
if (녹색불이 켜지면)
좌우를 살핀다.
if (녹색불이 켜지면)
길을 건넌다.
로 할 수 있지만, 이렇게 적으면, if (녹색불이 켜지면)을 두 번 반복해서 적어야 하며 , 보기에도 안 좋습니다.
이럴 때 코드의 블록을 만들어서 , 조건이 참일 때 두 가지 일을 같이하도록 적을 수 있습니다.
어떤 프로그래밍 언어도 (c , java, javascript, python 등등..) 모두 코드 블록을 만들 수 있습니다.
위의 예를 코드 블록으로 다시 적어보겠습니다.
if (녹색불이 켜지면)
{
좌우를 살핀다.
길을 건넌다.
}
위의 코드에서의 불편한 점이 if 문을 여러 번 적을 필요도 없어 훨씬 편하고, 보기에도 하는 일을 알아보기에도 좋습니다.
여기서 { }가 하나의 코드 블록이 되는 겁니다.
마치 여러 개의 물건을 가방에 넣어서 들고 다니는 것과 같다고 생각하면 됩니다..
이 코드 블록은 어떤 조건이 참일 경우 한 덩어리의 일을 할 때도 사용하고,
어떤 덩어리의 일을 반복해야 할 때도, 사용합니다.
또 다른 예로, 1부터 10까지의 각 수별 누적값을 출력하는 예를 들어보겠습니다.
1 => 1
2 => 3 (1 + 2의 값)
3 => 6 (1 + 2 + 3 값)
...
10 => 55 (1 + 2 + 3 +.... + 10)의 값
아래코드는 c 언어 예입니다.
int sum = 0; 누적값을 기록할 variable의 값을 0으로 초기화합니다.
for (int a=1; a <= 10; a++) => a라는 variable이 1부터 10까지 변하면서 10번 반복한다는 의미입니다.
{
sum = sum + i; => 누적값을 계산합니다.
print("% d => % d", a, sum); => 몇 번째 인지와 그때까지의 누적값을 표시합니다.
}
위 예에서와 같이 반복해야 하는 일이 { 뭐도 하고, 뭐도 하고, 뭐도 하고... }와 같이 여러 개 일 경우 코드 블록을 만들어서
사용합니다.
상자 안에 여러 가지의 물건을 넣어 놓은 것처럼, 하나의 블록은 여러 개의 코드 라인을 넣어 놓은 상자라고 생각할 수 있습니다.
Block in Block (Block의 중첩)
상자 안에 작은 상자를 넣은 것과 같이 Code Block 안에는 Code Block을 넣을 수 있습니다. 이를 중첩이라고 부릅니다. (Nested Block)
하나의 서랍장은 작은 여러 개의 서랍이 있고, 그 서랍 안에 작은 박스들이 있고, 그 박스 안에는 다시 여러 개의 물건이 있는 것과 같습니다.
프로그램 코딩에서는 이와 같이 중첩된 Code Block을 사용할 수 있습니다.
마치 창고의 물건들을 박스들로 나누어서 정리하고, 그 박스 내에는 다른 작은 박스들을 넣어서 물건을 정리하는 것과 같습니다.
위의 횡단보다를 건너는 코드를 가지고, nested block의 예를 들어 보겠습니다.
if (녹색불이 켜지면)
{
if (좌우를 살폈더니, 차가 온다면)
{
차가 갈 때까지 기다린다.
}
길을 건넌다.
}
와 같이 조건 안에 조건이 들어가거나,
위의 누적값을 출력하는 코드의 예를 들어 짝수들에 대한 누적값만을 출력한다면.
int sum = 0;
for (int a=1; a < 10; a++) => a라는 variable이 1부터 10까지 변하면서 10번 반복한다는 의미입니다.
{
if (a의 값이 2로 나누어 떨어지면 )
{
sum = sum + i; => 누적값을 계산합니다.
print("% d => % d", a, sum); => 몇 번째 인지와 그때까지의 누적값을 표시합니다.
}
}
와 같습니다.
위의 예에서와 같이 Code Block 안에는 다른 Code Block을 넣을 수 있습니다.
판단문 안에 다른 판단문을 넣을 수도, 판단문안에 다른 반복문을 넣을 수도 있고 이들의 다양한 조합이 가능합니다.
코드 블록 안에는 어떤(if 문이던, for 문이던) 하위 코드 블록도 넣을 수 있으며,
하나의 블록 안에는 여러 개의 블록을 넣을 수 있습니다.
박스 안에 박스를 넣는 단계의 깊이(depth)에는 제약이 없다고 생각해도 됩니다.
Code Block과 Variable (Scope Resolution Rule) : block과 variable 존재 범위
block 내의 variable
코드 블록 내에는 code 들도 적을 수 있지만, 그 block 내에서만 사용할 variable을 가질 수도 있습니다.
block 내에서만 사용할 variable이란 말은
- block 밖의 코드에서는 사용할 수 없고, block 내의 코드에서만 사용할 수 있으며,
- block을 벗어나면 block 내에 있는 variable 은 없어진다.
의 의미입니다.
코딩을 하면 아주 많은 variable들을 사용하게 됩니다.
상태값을 저장하는 variable 이기에 variable 은 컴퓨터의 메모리를 차지하게 됩니다.
프로그램 코딩을 하면서, 아주 많은 variable들을 사용하는 경우, 항상 모든 variable을 메모리에
가지고 있을 필요는 없습니다. 필요할 때만 variable을 위한 메모리를 사용하고, 더 이상 필요가 없는
variable 은 메모리에서 없애주는 게 좋습니다. (컴퓨터 메모리는 컴퓨터의 중요한 자원이니 필요한 만큼만 사용하는 게 좋습니다.)
어떤 기능을 처리하는 code block에서만 필요한 variable은 그 block 이 일을 수행하고 나서는 없어지는 방식으로
컴퓨터의 메모리를 효율적으로 사용하게 됩니다.
이런 목적으로 code block 내에만 존재하는 variable을 만들 수 있습니다.
아래 코드의 예입니다.
if (조건 A)
{
int sum = 0;
for (int a =1; a <= 10; a++)
{
sum = sum + a;
}
printf("% d", sum);
}
참고로 , 위의 코드에서 for 문장은 한 줄밖에 가지지 않은 block 이므로, 굳이 블록이 을 만들 필요가 없으므로,
for (int a =1; a <= 10; a++)
sum = sum + a; 로 적어도 됩니다.
위의 코드에서는 "조건 A"가 참 일경우만 if의 block 이 실행되며, block 내의 variable sum 은 if 문의 block 이 실행될 때만
만들어지는 variable이고, block 이 실행된 후에는 없어지게 됩니다.
이렇게 block 내에서만 필요한 variable은 block 내에만 선언하는 것이 컴퓨터의 메모리를 효율적으로 사용해서 좋고, 전체적으로
프로그램을 코드를 보기 쉽게 만듭니다.
Scope Resolution Rule
block 내에 다른 block이 중첩되어 있을 경우, 내부의 하위 block에서는 자신의 외부 block에 있는 variable은 사용할 수 있지만, block의 외부에서는 내부 하위 block의 variable은 사용할 수는 없습니다.
이는 block 은 해당 block 이 실행될 때만 존재하기 때문에 그렇습니다.
block 은 필요시에만 만들어지고, 사용을 하고 난 후에는 없어지게 됩니다.
상위 블록 내부에 들어 있는 하위 블록은 필요시에만 만들어지기 때문에 상위 코드가 실행될 때는 아직 하부의
블록이 만들어지지 않은 상태입니다. 상위 블록 내의 하위의 블록이 실행될 때는 하위 블록을 포함하는 상위 블록은 만들어진 상태이므로,
하위 블록에서는 상위 블록의 variable은 사용할 수 있지만, 상위 블록에서는 하위 블록 내의 variable은 사용할 수 없습니다.
코드를 예로 들어 보겠습니다. (참고 : 블록은 if 나 for 문에만 만들 수 있는 것이 아니라, 프로그램 어디에서도 만들 수 있습니다. )
{
int a;
a = 1;
{
int b = a + 10;
a = 10;
}
}
하위 블록에서 상위 블록 variable의 값을 참조하거나 바꿀 수 있습니다.
하위 block 이 만들어져서 실행되는 순간에는 하위 block을 포함하고 있는 상위 block 이 만들어진 상태이니 상위 블록의 variable a는 존재하는 상태이므로. variable a를 하위 블록에서 사용할 수 있습니다.)
{
int a;
a = 1;
b = 10; => 1) 오류입니다.
{
int b = a + 10; 상위 블록의 variable a 는 사용할 수 있습니다.
a = 10;
}
b = 0; => 2) 오류입니다.
}
위의 1)번 b = 10은 variable b는 하위 블록 내에 있는데, 이 코드가 실행될 때는 하위 블록이 만들어지기 전이므로 variable b는 존재하기 때문에 오류입니다. ( 블록은 실행이 될 때 만들어집니다.)
위의 2번) b = 0은 이 코드가 실행될 때는 하위 블록은 실행이 되고 난 이후이기 때문에 없어졌고, 블록이 없어지면서 블록내의 변수 b 도 없어졌기 때문에 오류입니다. (블록은 실행이 되고 나면 없어집니다.)
블럭 간의 같은 이름의 variable
{
int a;
a = 10;
{
int = a;
a = 100;
}
printf("%d", a); 이때의 variable a의 값은 무엇일까요?
}
위의 예에서 상위 block의 print 문에서 출력되는 값은 10입니다.
코드를 보면 상위 block 에도 a라는 variable 이 있고, 하위 block 에도 a라는 variable 있습니다.
상위 block 내의 code에서 사용하는 variable a는 자신 block 내부의 variable a입니다. (상위 block에서는 하위 block의 variable을 사용할 수 없으므로, 하부 블록의 variable a일 수는 없습니다. )
하위 블록 내에서는 두 개의 같은 이름 variable a가 보입니다. 이 경우, 하위 블록 내에서의 variable a는 자신블록 내에 선언한 variable a입니다. 그런 이유에서 하위 블록내부에서 variable a의 값을 바꾸는 것은 자신 block 내의 variable a를 바뀌는 것이기 때문에 상위 block의 variable 에는 영향을 안 주게 됩니다.
이와 같이 중첩된 블록 간에 동일한 이름의 variable 이 있을 경우, 자신의 블록 내에 가까운 variable을 사용하게 됩니다.
이를 scope resolution rule이라 합니다.
Code Block과 Function
프로그래밍 언어에서 block이 있는 중요 이유 중 하나는 사실 code block으로 function (함수 : 수학의 sin 함수등과 같이 어떤 값을 주면 결과값을 만드는 기능을 수행하는 코드 블록)을 만들기 때문입니다.
사실 프로그래밍 언어의 function 은 이름이 붙인 code block이라 할 수 있습니다.
이에 대한 내용은 다음 글에 적겠습니다.