개요

 

안녕하세요 피터입니다.    

오늘은 Bash 쉘 스크립트에서 사용되는 변수(variable)에 대해서 설명드리겠습니다. 

변수는 모든 프로그래밍 언어와 스크립트 언어에서 핵심적인 기능을 합니다. 데이터를 조작하기 위한 연산이나 문자열을 파싱(parsing)하는데 있어서 없어서는 안될 꼭 필요한 존재입니다.

 

변수는 단지 데이터를 담고 있는 메모리상의 위치를 나타내는데 어떤 변수에 어떤 데이터가 담겨있는지 쉽게 알 수 있게 이름을 붙여놓은 것입니다. 

 

 

변수 할당(assignment)

 

데이터를 담는 공간인 변수를 사용하려면 먼저 변수를 할당(assignment) 해야 합니다.

 

변수는 할당 연산자 = 를 사용해서 할당합니다.

 

a=100
b="hello"

 

주의 해야 할 것은 할당 연산자 앞뒤로 공백이 없어야 한다는 것입니다.  

(또한 테스트 연산자도 = 심볼을 쓰기 때문에 헷갈리지 말아야 합니다. 상황에 따라 해석이 달라지니 주의해주세요. 이 부분은 나중에 테스트 연산자 설명드릴 때 다시 말씀드리겠습니다.)

 

Bash 는 다른 프로그래밍 언어들과는 달리, 변수를 "타입"으로 구분하지 않습니다.

Bash 변수는 본질적으로 문자열이지만 Bash 가 문맥에 따라서 정수 연산이나 변수를 비교해 줍니다. 이 동작을 결정짓는 요소는 그 변수값이 숫자로만 되어 있는냐 아니냐 입니다.

 

 

let 명령어로 할당 할 수도 있습니다.

let은 bash 의 내장 명령어 중에 하나로 간단한 산술식을 수행 할 수 있습니다.

 

let a=1000+4
let "a = 1000 + 4"   # 위와 같음

 

가독성을 위해서는 " " 를 이용해서 쿼우팅(quoting) 하고 연산자 사이에 빈칸(space)을 넣어주는게 좋습니다. 

 

 

변수를 할당 할 때는 위의 숫자 100이나 문자열 "hello"와 같은 리터럴 상수(literal constant) 뿐만 아니라 명령어의 결과를 할당 할 수도 있습니다. 

 

바로 명령어 치환(command substitution)을 사용하는 방법인데요.  역따옴표(` `) - 백틱(backticks)으로 명령어를 감싸면 해당 명령어의 결과로 치환되어 그 결과를 변수에 바로 할당 할 수가 있습니다. 

 

ret=`ls -l`

 

명령어 치환에 대해서는 다룰 내용이 좀 더 많기 때문에 나중에 포스팅을 추가로 하겠습니다. 

 

 

 

변수 치환(substitution)

 

변수는 데이터를 담고 있는 그릇 역할을 하므로, 할당하였으면 이제 변수에 담겨있는 데이터를 사용 할 수 있어야 합니다. 

변수에는 어떤 계산을 하기 위해 임시로 저장한 중간값이나 특정 명령어의 결과값 등이 저장되어 있는데 이 값들을 확인하거나 적절히 활용하기 위해서는 치환(substitution)을 통해 변수의 데이터를 참조해야 합니다.

 

치환은 ${variable} 구문을 이용하여 사용하는데 $variable 로 줄여 쓸 수 있습니다. 

 

참조되는 값을 큰따옴표(" ")로 묶어도 변수 치환이 일어나는 것을 막지 못합니다.

이를 부분적 쿼우팅(partial quoting)이나 약한 쿼우팅(weak quoting)이라고 합니다. 

 

작은따옴표를 쓰게 되면 변수 이름이 그냥 문자 그대로 해석되어 아무런 일도 일어나지 않습니다.

이를 완전한 쿼우팅(full quoting)이나 강한 쿼우팅(strong quoting)이라고 합니다.

 

#!/bin/bash

a=1004
echo "$a"  # $a 변수 치환이 일어남 
echo '$a'  # $a를 문자 그대로 해석 


실행 결과
100
$a

 

 

변수를 할당하지 않고 참조하게 되면 문제가 생깁니다.

변수에 어떤 값을 처음 할당 하는 것을 초기화(initialize)라고 하는데, 초기화가 안 된 변수는 "null" 값을 가집니다.

이는 값이 할당 안 된 것이지 0 이라는 값을 갖는다는 이야기가 아닙니다. 

 

변수를 참조하기 전에 반드시 할당을 먼저 해주시기 바랍니다. 

 

 

 

 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 남겨주시면 감사하겠습니다.

 

 

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요


안녕하세요 피터입니다.

오늘은 프로그래밍에서의 변수에 대해 알아보겠습니다. 



1. 변수는 무엇인가?

우선 프로그래밍을 할 때 변수라는 것이 왜 필요한지부터 짚어볼 필요가 있습니다.


여러분들이 계산기로 통장에 들어올 실제 월급을 계산해본다고 가정해보겠습니다.


우선 기본급여에 각종 수당을 더하고 보너스(!)도 더해 총 급여를 구합니다.

그리고 급여에 따른 소득세와 4대보험료 등을 더해 총 세금을 구합니다.

이제 총 급여에서 총 세금을 빼면 내 통장에 들어올 실제 월급을 구할 수 있겠죠.


이 과정을 계산기로 하다 보면 총 급여나 총 세금 등 여러 값들을 더해서 구한 중간 값을 어딘가 적어놓지 않으면 잊어먹어서 다시 구해야 할 때가 종종 발생합니다.


프로그램을 개발할 때에도 마찬가지입니다.

위에서 계산기로 월급을 계산할 때처럼 최종적으로 프로그래머가 원하는 기능을 수행하기 위해서는 중간 과정에서 임시로 값들을 저장할 공간이 필요합니다.  이러한 공간이 바로 변수입니다.


즉, 변수(Variable)는 프로그램이 실행되는 동안 계속해서 변하는 값을 저장하는 메모리 공간이라고 할 수 있습니다.


메모리에 필요한 공간을 할당하고 값을 저장하기 위해서는 내가 사용할 메모리 공간에 대해 컴퓨터에게 알려줄 필요가 있습니다.


내가 사용할 값의 자료형(DataType)은 무엇인지

내가 사용할 값이 유효한 범위(Scope)은 어디까지 인지

내가 사용할 메모리 공간의 이름(Name)은 무엇인지


이런 것들을 명시하여 컴퓨터가 메모리 공간을 할당하게 만드는 것을 ‘변수 선언’이라고 합니다. 

이렇게 선언한 메모리 공간. 즉, 변수에 여러분들은 아무때나 자유롭게 값을 저장하고 읽어올 수 있습니다.


2. 개념과 원리에 대한 이해가 중요합니다.

지금까지 변수의 기본 개념에 대해 알아봤는데요. 

이런 개념은 C언어 뿐만 아니라 다른 프로그래밍 언어에도 마찬가지로 적용되는 개념입니다.  


여러분들이 앞으로 프로그래밍을 공부할 때 가장 중요하게 여겨야 할 부분이 바로 이러한 개념과 원리를 이해하는 것입니다.


세상에는 수많은 프로그래밍 언어들이 산재해 있지만 대부분의 프로그래밍 언어들이 문법만 다를 뿐 기본적인 개념과 원리는 같기 때문입니다.


히딩크 감독이 한국축구 국가대표 감독이 되고 나서 가장 중점적으로 훈련을 시켰던 것이 기초 체력 훈련이었다는 것을 알고 계신가요?

전술과 테크닉도 중요하지만 종목을 떠나 모든 스포츠에서 가장 기본이 되는 것이 바로 체력이고, 체력이 뒷받침 되어야 전술과 테크닉도 힘을 발휘할 수 있다는 것을 히딩크 감독은 잘 알고 있었던 것입니다. 

당시 한국 국가대표팀 모든 선수들은 지칠줄 모르는 체력을 바탕으로 4강 신화를 이뤄냈습니다.


프로그래밍의 세계에서 기초체력은 바로 이러한 개념과 원리를 이해하는 것입니다. 

기초가 탄탄한 개발자는 새로운 언어나 기술을 습득하는데 있어서 큰 어려움이 없습니다. 여러분들도 프로그래밍을 공부하는데 있어서 이러한 점을 꼭 기억해주시기 바랍니다.



3. 그렇다면 문법은?

자, 이제 여러분들은 ‘변수’라는 개념을 이해했습니다.

그럼 이제 C언어에서는 변수를 어떻게 다루는지 문법(Syntax)를 알아보겠습니다.


아래 코드를 봐주세요.


int main(void)
{
int sum; 
sum = 17 + 32;

printf(“sum=%d\n”, sum);

return 0;
}


앞서 변수를 선언할 때 명시해야 할 항목에 대해 언급했었는데요.

기본적으로 필요한건 Scope, DataType, Name 세 가지 입니다.


int sum; 에서

int 가 DataType을 명시한 것이고, sum이 변수의 Name을 지정한 것입니다.

즉, int라는 값(Data)을 저장할 공간을 메모리상에 할당하고 sum이라고 이름을 지어준 것이죠. 

그리고 밑에 sum = 17 + 32; 에서 보시는 바와 같이 sum 이라는 이름을 통해 할당한 메모리 공간에 값을 17 + 32 에 대한 결과값을 저장할 수 있습니다.


그렇다면 Scope은 어떻게 표현한걸까요?

변수 선언의 위치를 보시면 main 함수의 body(‘{ }’로 감싸여진 부분)안에 선언되있습니다. 

그렇다는 말은 이 sum이라는 변수는 main 함수 내에서만 유효하다는 것을 알 수 있습니다. 이렇게 특정 함수 내에서만 유효한 변수를 ‘지역 변수(Local variable)’ 라고 합니다.


int sum; 
int main(void)
{
sum = 17 + 32;

printf(“sum=%d\n”, sum);

return 0;
}


위 코드처럼 변수 선언이 특정 함수 내가 아닌 외부에 위치하게 되면 main 함수가 아닌 다른 함수에서도 접근이 가능합니다. 
이처럼 어느 곳에서나 접근 가능한 변수를 '전역 변수(Global variable)'라고 합니다.


컴퓨터는 위와 같은 선언문을 해석하여 메모리에 공간을 할당합니다. 

이 때 Scope에 따라 할당되는 영역이 결정되고 DataType에 따라 할당하는 크기가 결정됩니다.

이 부분에 대한 자세한 설명은 응용프로그래밍 메모리 구조를 참조해주세요.

응용프로그램 메모리 구조


이제 여러분들은 변수에 대한 기본적인 개념을 이해하셨습니다. 

다음 시간에는 변수에 할당할 수 있는 DataType에는 어떠한 것들이 있는지 설명해드리겠습니다.



여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

-Peter의 우아한 프로그래밍

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요