변수와 상수
안녕하세요.
오늘은 자바(JAVA)에서 변수와 상수에 대해 알아보겠습니다. 바로 Go.Go!!!
변수
변수(Variable)란 프로그램에 처리할 데이터를 담아둘 수 있는 메모리 공간입니다. 하나의 변수에는 당연하겠지만 하나의 값을 담을 수 있으며, 이 공간의 값은 자유롭게 변경할 수 있기 때문에 변수라 합니다.
변수를 사용하려면 먼저 선언과 초기화 과정을 거쳐야 합니다.
int a = 0;
short b = 1;
char c = 'A';
long d;
위와 같이 선언을 하면서 초기화를 할 수도 있고 하지 않을수도 있습니다. 초기화하지 않아도 괜찮습니다. 나중에 필요할때 값을 대입할 수 있습니다.
위 예제에서 "int", "short", "char", "long" 은 변수에 저장될 데이터 타입 또는 변수형이라고 합니다. 다음 "a", "b", "c", "d"에 해당하는 부분이 변수명이며 변수명을 이용해 값을 변경하거나 불러올 수 있습니다. "="뒤에는 초기값이며, 초기화를 해도 되고 나중에 필요할때 해도 괜찮습니다.
자바(JAVA)에서 변수의 이름을 정할때는 다음과 같은 규칙이 있으며 이를 위반시 컴파일 에러가 발생합니다.
1. 변수 이름은 숫자로 시작할 수 없고, 특수문자는 '$'와 '_'만 사용 가능. 옳은예)MyId, _tmp, 틀린예)3Who, @name
2. 대소문자 구별. ex) MyVar 과 myVar 은 서로 다른 변수
3. 예약어는 변수명으로 사용할 수 없음. ex)break, private, while 등
4. 변수명에 공백문자는 허용하지 않는다.
다음 사항은 에러를 발생시키지는 않지만, 관례적으로 따르는 규칙입니다.
1. 변수명은 문자로 시작한다. (숫자로 시작하면 에러이고, $나 _로 시작은 가능하다)
2. 변수명은 의미있는 구분 가능한 이름으로 만든다. ex)myName, clientId
3. 변수명은 보통 소문자로 시작한다.
자바에서는 다음과 같이 총 8개의 원시적 데이터 타입(Primitive Data Type)을 제공합니다. 자바에서는 크게 Primitive Data Type과 Non-Primitive Data Type이 있으며, Non-Primitive Data Type은 보통 Reference Type에 해당됩니다.
원시적 데이터 타입에는 다음과 같이 정수형, 실수형, 문자형, 논리형 등이 있으며, 표현할 수 있는 범위가 정해져 있어 주의가 필요합니다.
정수형 데이터 타입
데이터 타입 | 바이트 | 범위 |
byte | 1 | -128 ~ 127 |
short | 2 | -32,768 ~ 32,767 |
int | 4 | -2,147,483,648 ~ 2,147,483,647 |
long | 8 | -263 ~ 263-1 |
실수형
float | 4 | 1.4x10-45 ~ 3.4x1038 |
double | 8 | 4.9x10-324 ~ 1.8x10308 |
문자형
char | 2 | 0 ~ 216-1(유니코드 0 ~ 65,535) |
논리형
boolean | 1 | true or false |
※ 실수형의 경우 범위보다는 정밀도가 중요하며, 기본적으로 오차가 따르기 마련입니다. float 32비트(4바이트)의 경우 소수점 이하 6자리, double 64비트(8바이트)는 소수점 이하 15자리까지 안전하다고 볼 수 있습니다.
※ 논리형 boolean 타입은 true 와 false 의 값만 인식합니다. 즉 1비트만 있어도 논리형 데이터를 표현할 수 있지만 자바에서 최소 처리단위가 1바이트이므로 1 바이트를 메모리에 할당합니다.
변수의 형변환
변수의 형변환에는 자동 형변환과 명시적 형변환이 있습니다. 아래 예를들어 보겠습니다.
byte a = 10; // a 변수에 10을 대입
int b = a; // b 변수에 a변수의 값(10)을 대입 , byte -> int 자동 형변환 발생
float c = b; // c 변수에 b변수의 값(10)을 대입, int -> float 자동 형변환 발생
명시적 형변환은 다음과 같이 ()를 이용해 명시적으로 바꾸고자 하는 데이터 타입을 지정해 형변환을 할 수 있습니다.
int a = 300;
byte b = (byte)a; // 명시적 형변환 (byte) 구문을 이용해 강제적으로 int형을 byte형으로 바꿈
명시적 형변환은 강제적으로 형변환을 할 수 있는데, 이 경우 데이터의 손실이 발생할 수 있으므로 주의해야 합니다.
상수
상수의 선언은 변수의 선언과 거의 비슷하고 문장의 가장 앞부분에 'final'예약어를 붙여주어 상수임을 나타냅니다. 상수는 프로그램 내에서 어떠한 경우에도 값을 변경할 수 없습니다.
// final 변수형 상수명 = 값;
final float inch = 2.54;
float my_val = inch; // float타입 변수 my_val에 inch(2.54)를 대입
inch = 3.14; // 상수 inch는 값을 변경할 수 없으므로 에러가 발생한다, 이경우 2.54 = 3.14 로 코딩한거나 마찬가지이다.
※ Tip
상수를 사용하는 이유는, 이미 정해져 있는 값을 그대로 데이터로 사용하여 코딩하면 나중에 그 값이 변경되었을 경우 사용한 모든 부분에서 값을 일일히 변경해야 하는 어려움이 생길 수 있습니다. 상수를 사용하면 상수를 선언한 부분에서 한번만 변경해주면 되기 때문에 코딩이 상대적으로 쉬워질뿐만 아니라, 상수가 표현한 데이터의 의미를 비교적 명확하게 전달할 수 있습니다.
int a = 30;
int b = 30;
int c = 30;
int d = 30;
...
위와 같은 코드를 짤일은 별로 없겠지만, 예를들어 위 코드에서 30이라는 숫자가 "회원수"를 의미하며 각 a, b, c, d변수에 회원수 30으로 초기화하는 코드가 있다고 하고, 혹시 나중에 회원수가 32로 변경되게 되면 개발자는 숫자 30을 모두 찾아 32로 바꿔주어야 합니다. 이렇게 되면 혹시 30이라는 숫자를 변경해야 할 부분에서 변경하지 못한 경우 논리적인 오류도 발생할 수 있습니다. 하지만 다음과 같이 상수를 사용하게 되면,
final int MEMBERS = 30;
int a = MEMBERS;
int b = MEMBERS;
int c = MEMBERS;
int d = MEMBERS;
...
이와 같이 상수를 선언한 선언부에서만 값을 변경해주면 되므로 안전하게 값을 변경할 수 있어 편리하고, 각 변수에 담기는 데이터의 값이 어떤 의미인지 인식하기도 비교적 쉬워집니다.
Non-Primitive Data Type
원시적 데이터 타입이 아닌 데이터 타입은 참조형이라 하는, 오브젝트들을 참조합니다.
원시적 데이터 형과 참조형의 차이는 다음과 같습니다.
1. 원시적 데이터 형은 java에서 기본으로 정의되어 있으나, 참조형은 프로그래머에 의해 생성되고 java에서 정의되어 있지 않습니다. 단, String형은 예외입니다.
2. 참조형은 특정 작업을 수행하기 위해 메서드를 호출하는 데 사용할 수 있지만, 원시적 데이터 형은 그럴 수 없습니다.
3. 원시적 데이터 형은 항상 값(0포함)을 갖고 있어야 하지만, 참조형은 null이 될 수 있습니다.
4. 관례적으로 원시적 데이터 형의 변수명은 소문자로 시작하며, 참조형은 대문자로 시작합니다.
5. 원시적 데이터 형은 그 타입에 따라 할당된(또는 할당할) 사이즈가 각기 다르지만, 참조형은 모두 같은 사이즈를 갖습니다.