"변수 (프로그래밍)"의 두 판 사이의 차이
잔글 (→같이 보기) |
잔글 (→같이 보기) |
||
194번째 줄: | 194번째 줄: | ||
* [[파이썬]] | * [[파이썬]] | ||
* [[매개 변수]] | * [[매개 변수]] | ||
− | |||
{{프로그래밍|검토 필요}} | {{프로그래밍|검토 필요}} |
2020년 8월 12일 (수) 14:20 판
변수(變數)란 컴퓨터 프로그램에서 그 값이 일정하지 않고 상황에 따라 변경되는 값을 말한다. 실제 값을 가진 변수와 값이 들어가 있는 주소를 가리키는 참조변수(Reference Variable)가 있다. 반대말은 상수(Constant)이다.
목차
개요
변수는 특정 값을 저장하는 메모리 공간을 뜻한다. 메모리 공간에 저장되는 값은 정수형(integer( int )), 실수형(float, double), 문자열(char[]) 등 여러가지 형식이 있으며 이를 이용하여 프로그래밍 한다. 해당 메모리 공간에는 허용되는 범위 내에 어떤값이든 저장할수 있으므로 변수라고 한다. 각 프로그래밍 언어에 따라 변수의 선언 방법 및 값 대입방법, 연산하는 방법등, 문법에는 비슷한 점이 많으나 조금씩 차이가 있다. [1]
특징
변수는 데이터 값을 저장하기 위해 이름을 가지고 있는 공간이다.[2] 모든 프로그램들은 수많은 변수들로 구성되어있다. 프로그래밍을 처음 접하게 되면 빠지지 않고 변수를 접할 수 있는데, 프로그램에서 특정 값을 입력하거나 출력하기위해 사용된다. 데이터가 사라지지 않기 위해서는 저장소에 데이터를 저장해두어야 하는데 그 부분을 변수가 해준다.[3]
예를 들어서 ATM기기에 1000원을 넣었는데 다음날 확인해보니 0원이 되어있고 다시 2000원을 넣었는데 0원이라고 출력되는 일을 막기 위해서 변수라는 저장소에 값을 저장해두는 것이다.
형태
변수를 만들 때에는 자료형을 정해주고 이름이 필요하기 때문에 적절한 이름을 선언해준다. 이 때 '='를 이용하면 적절한 값을 대입해 줄 수 있다. 변수는 '변화할 수 있는 수'라는 뜻을 지니고 있어 대입을 통해 언제든지 값을 변화 시킬 수 있다. 우선 변수를 먼저 선언 한 후 값을 대입할 수도 있고, 변수를 선언하면 동시에 대입할 수도 있다. 변수를 선언과 동시에 값을 대입하는 것을 초기화라고 한다. 값을 대입할 때 프로그래밍에서는 '='를 사용하는데 수학에서 사용하는 '='는 '같다.'라는 표현으로 사용되어 혼동될 수 있다. 프로그래밍에서는 어떠한 값을 대입할 때 '='부호를 사용하고 '같다'라는 의미를 가질 때에는 '=='로 등호 두 개를 연속으로 사용한다.[3]
규칙
변수를 생성할 때에는 생성 규칙을 따라주어야한다. 프로그래밍 언어마다 다른 규칙을 가지고 있지만 대부분 비슷한 형태를 지니고 있다.
우선 변수의 이름은 영문자, 숫자, 언더스코어(_)만을 사용해야한다. 영문자의 경우 대소문자 전부 사용이 가능하며 이 외의 특수문자를 사용할 수는 없다. 그리고 변수의 이름은 숫자로 시작할 수 없다. 그 이유는 컴파일러가 코드 조각을 컴파일 하면서 어휘 분석을 할 때 역 추적을 피할 수 있기 때문이다. 변수임을 식별하기 위해서는 역 추적이 필요한데 변수 앞에 숫자가 붙으면 컴파일러는 숫자 혹은 식별자가 문자에 도달할 때까지 결정할 수 없기 때문이다.[4] 그리고 변수의 이름 사이에는 공백을 포함할 수 없으며 변수의 이름으로 프로그래밍 언어에서 미리 정의한 키워드는 사용할 수 없다. 변수의 이름 사이에 공백을 포함할 수 없는 이유는 위에서 말했듯이 추적이 어렵기 때문이며, 프로그래밍 언어에서는 특정 키워드들을 미리 정해놓고 사용할 수 있도록 하는데 이 특정 키워드를 사용하게 되면 컴파일러가 변수인지 키워드인지 구분하지 못해 에러가 발생하는 것이다.
메모리
변수는 기본적으로 메모리의 주소를 기억하는 역할을 한다. 메모리 주소란 물리적인 메모리 공간을 서로 구분하기 위해 사용되는 일종의 식별자이다. 즉, 메모리 주소란 메모리 공간에서의 정확한 위치를 식별하기 위한 고유 주소를 의미한다. 변수를 참조할 때에는 메모리의 주소를 참조하는 것이 아닌, 해당 주소에 저장된 데이터를 참조하게 된다. 따라서 변수는 데이터가 저장된 메모리의 주소뿐만 아니라 저장된 데이터의 길이와 형태에 관한 정보도 같이 기억해야한다.[5]
선언
변수를 사용하기 전에 반드시 먼저 해당 변수를 저장하기 위한 메모리 공간을 할당 받아야 한다. 이렇게 해당 변수만을 위한 메모리 공간을 할당하는 행위를 변수의 선언이라고 부르는데 프로그래밍에서 변수를 선언하는 방법은 다음과 같은 방법이 있다. 첫번째로 변수의 선언만 하는 방법이다. 우선적으로 변수를 선언하고 나중에 데이터를 대입해주는 방식으로 변수를 선언했을 때 변수 내에 어떠한 값이 들어있는지는 모르지만 이후에 대입을 통해 변수에 원하는 값을 넣을 수 있다.
int main(){ int a; a=10 return 0; }
두번째 방법으로는 변수의 선언과 동시에 초기화를 하는 방법으로 선언과 동시에 메모리 공간에 데이터를 대입하는 형식이다. 이는 초기화라고 하는데 선언한 변수 내에 어떠한 값이 들어있는지 확인할 수 없기 때문에 선언과 동시에 데이터 값을 지정해준다.
int main(){ int a = 10; return 0; }
코끼리를 냉장고에 넣을 수 없는 것과 같이 데이터의 크기에 따라 변수의 크기 또한 달라져야한다. 정수를 저장하기 위한 메모리 공간을 할당 받으면, 반드시 해당 타입의 데이터만을 저장해야한다. 만약 그렇지 않고 다른 타입의 데이터를 저장할 경우에는 저장된 데이터에 변형 및 손실이 일어나거나 코드에 에러를 유발할 수 있다.[5]
자료형
변수를 선언하기 위해서는 자료형에 맞추어야하는데 이는 아래 표에서 확인하듯이 범위를 맞추어 줘야 데이터의 변형과 손실, 에러를 생기지 않게 할 수 있다.
자료형 크기 표현 범위 문자형 char 1바이트 -128 이상 +127이하 unsigned char 4바이트 0이상 +255이하 정수형 short 2바이트 -32,768이상 +32,767이하 int 4바이트 -2,147,483,648이상 +2,147,483,648이하 long 4바이트 -2,147,483,648이상 +2,147,483,648이하 long long 8바이트 -9,223,372,036,854,775,808이상 +9,223,372,036,854,775,807이하 실수형 float 4바이트 ±3.4X10^-37이상 ±3.4X10^+38 double 8바이트 ±1.7X10^-307이상 ±1.7X10^+308 long duble 8바이트 이상 double 이상의 표현 범위 논리형 boolean 1바이트 True / False
종류
프로그래밍 언어에서의 변수는 종류가 다양하며 각 언어별로 사용하는 변수들 또한 다르다.
C언어
C언어에서 사용하는 변수는 크게 5가지로 분류할 수 있는데 이 5개의 변수로는 전역 변수, 지역 변수, 정적 변수, 외부 변수, 레지스터 변수가 있다.[6]
전역 변수
전역 변수란 프로그램 전체에서 사용할 수 있는 변수를 의마한다. 함수의 구분 없이 프로그램 전체에서 사용할 수 있기 때문에 프로그램의 시작과 동시에 우선적으로 선언이 되며, 전역 변수의 종료는 프로그램의 종료 직전에 일어납니다. 즉, 전역 변수의 선언이 종료되었다는 것은 프로그램이 종료된다는 의미다. 변수는 초기값으로 이상한 값을 가지고 있는데 이것을 선언할 때 초기화 시켜주거나 다른 값으로 변형을 시켜주어야한다. 그것과 달리 전역변수의 경우 초기화 과정이 없더라도 선언시 자동으로 초기화를 시켜준다. 하지만 전역 변수는 너무 많이 사용하게 되면 프로그램의 무게가 무거워지고, 보안성이 떨어지게 된다.[6]
지역 변수
지역 변수는 특정 지역에서 사용하는 변수로 모든 중괄호 내부에서 사용하는 변수를 의미한다. 지역 변수의 선언은 해당 함수 및 중괄호의 시작과 동시에 일어난다. 이 후 함수 및 중괄호가 종료되는 시점에서 변수 또한 소멸하게 된다. 전역 변수의 경우 초기화를 시키지 않아도 자동으로 초기화되지만 지역 변수의 경우 초기화를 시켜주지 않기 때문에 별도로 초기화를 시켜주어야한다.
정적 변수
정적 변수는 기본적으로 자료형 앞에 static을 붙여준다. 변수를 정적 변수로 사용할 경우 별도의 초기화를 시키지 않아도 선언과 동시에 초기화가 이루어진다. 다만 정적 변수는 프로그램이 시작되면 초기화는 단 한번 진행된다.[6]
외부 변수
외부 변수는 외부 파일에서 선언된 변수를 참조하는 변수이다. 자료형 앞에 extern 키워드를 사용해, 다른 파일에 있는 전역 변수를 참조해온다. 만약 특정 전역 변수를 외부에서 참조하지 못하게 하고 싶다면 정적 변수를 활용한다.
레지스터 변수
레지스터에 변수를 할당하여 사용하기 위해서는 자료형 앞에 register를 붙여준다. 레지스터 변수의 특징은 처리속도가 빠르지만 무리하게 많은 변수를 사용할 경우 CPU가 고장날 수 있다. 최근에는 CPU처리속도가 빨라 레지스터를 잘 쓰지 않는다.[6]
JAVA
자바에서의 변수는 인스턴스 변수, 클래스 변수, 지역 변수, 전역 변수가 있다. 지역 변수와 전역 변수의 경우 C언어와 같은 역할을 하기 때문에 인스턴스 변수와 클래스 변수를 작성했다.
클래스 변수
클래스 변수는 인스턴스 변수에 static만 붙여주면 된다. 인스턴스 변수는 특정 값을 가지고 있지만 클래스 변수는 모든 인스턴스가 공통된 값을 가지게 된다. 한 클래스의 모든 인스턴스들이 통일적인 값을 가질 때 클래스 변수를 생성한다. 만약 클래스 변수에 public을 붙이게 되면 같은 프로그램 내에서 어디서든 접근할 수 있는 전역 변수가 된다. 또한 인스턴스 변수와 다르게 클래스이름.클래스변수명을 통해 접근 가능하다.
인스턴스 변수
인스턴스 변수는 인스턴스가 생성될 때 함께 생성된다. 인스턴스 변수의 값을 읽어오거나 저장하려면 인스턴스를 먼저 생성해야한다. 인스턴스 별로 다른 값을 가질 수 잇으므로, 각 인스턴스마다 고유의 값을 가져야할 때는 인스턴스 변수로 선언한다.[7]
활용
변수의 활용은 각 프로그래밍 언어들 마다 형태, 용도 등이 다르다. 하지만 변수에 데이터를 저장하는 저장소 역할로 사용하는 것은 다르지 않으면 활용 방법이 조금씩 다르다.
JavaScript
JavaScript에서 변수는 var로 시작한다. var은 변수를 선언하겠다는 것을 의미한다. var을 생략 할수도 있지만 이것은 유효범위라는 것에 영향을 미친다. 그렇기 때문에 var의 의미를 명확하게 이해하기 전까지는 var를 사용하는 것이 권장된다. 유효범위에 대해서는 뒤에서 살펴볼 것이다. 변수의 이름은 $, _, 혹은 특수 문자를 제외한 모든 문자로 시작할 수 있다. [8]
JAVA
자바에서는 기본 데이터 타입에 추가적으로 레퍼런스 타입과 문자열 타입이 존재한다. 레퍼런스 타입은 배열에 대한 레퍼런스, 클래스에 대한 레퍼런스, 인터페이스에 대한 레퍼런스가 있다. 문자열의 경우 기본 데이터 타입에는 속하지 않으며, 'String' 클래스를 이용해서 선언할 수 있다. 문자열의 표현은 큰 따옴표("")로 표현 가능하며, 문자열과 문자열 간의 연결은 '+'연산을 이용해 연결이 가능하다.
자바에서는 표현되어 있는 데이터가 서로 다른 타입으로 사용되었을 때, 그 데이터의 표현 방식을 다른 타입으로 변환하는 자료형 변환이 가능하다. 방법으로는 두가지로 '자동 타입 변환'과 '강제 타입 변환'이 존재한다.
자동 타입 변환
수식 내에서 대입 연사자 '='의 왼쪽과 오른쪽에 위치한 두 피연산자 간의 자료형이 일치하지 않을 때, 컴파일러에 의해 자동으로 발생하는 형 변환 방법이다. 원래의 자료형보다 큰 자료형으로 자동 변환되며 자료형의 우선 순위는 아래와 같다.
byte -> short,char -> int -> long -> float -> double
데이터의 표현 범위가 넓은 자료형으로 형 변환 시 데이터 손실이 발생하지 않지만, 표현 범위가 좁은 자료형으로 변환 시에는 손실이 발생하며 컴파일 오류가 발생한다.
강제 타입 변환
프로그래머가 의도적으로 형 변환 연산자를 사용해 강제로 타입을 변환하는 방법이며, 이 방법은 캐스팅이라 부르기도 한다. 강제로 타입을 변환시킬 때에는 변환하고자 하는 데이터 앞에 '(자료형)'을 입력하면 된다. 하지만 기존의 자료형보다 표현범위가 좁은 자료형으로 변환 시에는 손실이 발생한다.[9]
파이썬
파이썬의 경우 변수를 선언할 때 자료형을 선언하지 않아도 상관없다. 기본 구조인 '자료형 변수명'을 사용할 수 있지만 파이썬의 경우 자료형을 자동으로 정해버리기 때문에 자료형까지 선언하지 않아도 괜찮다.
a = 1 b = 2 print(a+b)
위와 같이 작성했을 때 값은 3이 나오며 a와 b의 자료형을 int로 자동 지정해줬다.
a = 1 b = 2 a = "안녕하세요" print(a+b)
이렇게 작성하면 오류가 발생한다. a의 자료형이 int형에서 String으로 바뀌었기 때문에 서로 다른 자료형에서 '+'연산을 사용 할 수 없게 된 것이다.[10]
각주
- ↑ 나무위키, <변수>, 《나무위키》
- ↑ 코코넛랩, <코딩 기초 개념 이해하기>, 《개인블로그》
- ↑ 3.0 3.1 한 눈에 끝내는 C언어 기초, <변수란?>, 《edu.goorm.io》
- ↑ 열코의 프로그래밍 일기, <C언어 변수 이름이 숫자로 시작할 수 없는 이유>, 《열코의 프로그래밍 일기》,2018-11-13
- ↑ 5.0 5.1 TCPSCHOOL, <변수>, 《TCPSCHOOL.com》
- ↑ 6.0 6.1 6.2 6.3 realMarketing, <C언어 변수의 종류>, 《개인블로그》, 2015-10-28
- ↑ 광부 금광캐는 광부, <자바의 변수(클래스 변수, 인스턴스 변수, 지역 변수)>, 《개인블로그》, 2016-07-19
- ↑ 생활코딩, <변수>, 《생활코딩》, 2013-06-24
- ↑ VIOLET QUARTZ, <변수 선언하기, 데이터 타입과 타입 변환>, 《개인블로그》, 2017-04-18
- ↑ Crocus, <파이썬변수 선언 및 출력 방법>, 《개인블로그》, 2017-04-28
참고자료
- 나무위키, https://namu.wiki/w/%EB%B3%80%EC%88%98 변수]>, 《나무위키》
- 코코넛랩, <코딩 기초 개념 이해하기>, 《개인블로그》
- 한 눈에 끝내는 C언어 기초, <변수란?>, <<edu.goorm.io>>
- TCPSCHOOL, <변수>, 《TCPSCHOOL.com》
- 열코의 프로그래밍 일기, <C언어 변수 이름이 숫자로 시작할 수 없는 이유>, 《열코의 프로그래밍 일기》,2018-11-13
- 생활코딩, <변수>, 《생활코딩》, 2019-02-13
- VIOLET QUARTZ, <변수 선언하기, 데이터 타입과 타입 변환>, 《개인블로그》, 2017-04-18
- Crocus, <파이썬변수 선언 및 출력 방법>, 《개인블로그》, 2017-04-28
- realMarketing, <C언어 변수의 종류>, 《개인블로그》, 2015-10-28
- 광부 금광캐는 광부, <자바의 변수(클래스 변수, 인스턴스 변수, 지역 변수)>, 《개인블로그》, 2016-07-19
같이 보기