변수(Variable)
변수는 값을 저장할 수 있는 메모리의 특정 번지에 붙이는 이름이다.
프로그램은 변수를 통해 메모리의 특정 번지에 값을 저장하고 읽을 수 있다.
메모리에 값을 저장하고 싶다면 변수를 선언하고 변수에 값을 지정하면 된다. 그러면 메모리의 어디에 저장하고, 어떤 방식으로 저장할지는 프로그래밍 언어와 운영체제가 알아서 정해준다. 자바의 경우 JVM이 하는 일이다.
프로그래밍 인어마다 다르지만, 자바의 변수는 다양한 타입의 값을 저장할 수 없다.
정수 타입 변수에는 정수값만 저장할 수 있고, 실수 타입 변수에는 실수값만 저장할 수 있다.
하나의 변수에 동시에 두가지 값을 저장할 수 없고, 하나의 값만 저장할 수 있다.
변수 선언
변수를 사용하기 위해서는 먼저 변수를 선언해야 한다. 변수 선언은 변수에 어떤 타입의 데이터를 저장할 것인지 그리고 변수 이름은 무엇인지 결정한다.
변수의 선언은 다음과 같다.
// 타입 변수이름;
int age; // 정수(int)를 저장할 수 있는 age 변수 선언
double value; // 실수(double)를 저장할 수 있는 value 변수 선언
타입은 변수에 저장되는 값의 종류와 범위를 결정짓는 요소이기 때문에 충분히 생각한 다음 결정해야 한다.
같은 타입의 변수는 콤마(,)를 이용해서 한번에 선언할 수 있다.
// 기존 생성 방식
int x;
int y;
int z;
// 변수 한번에 선언하기
int x, y, z;
변수 이름은 자바 언어에서 정한 명명 규칙을 따라야 하는데 규칙은 아래와 같다.
| 작성 규칙 | 예 |
| 첫 번쨰 글자는 문자이거나 '$', '_' 이어야 하고 숫자로 시작할 수 없다.(필수) |
가능 :price, $price, _companyName, ... 불가능 : 1v, @speed, $#value, ... |
| 영어 대소문자를 구분한다.(필수) | firstname 과 firstName은 다른 변수 |
| 첫 문자는 영어 소문자로 시작하되, 다른 단어가 붙은 경우 첫 문자를 대문자로 한다(관례 -> 카멜 케이스) |
maxSpeed, firstName, carBodyColor, ... |
| 문자 수(길이)의 제한은 없다. | |
| 자바 예약어는 사용할 수 없다(필수) | 아래 표 참조 |
예약어란 이미 해당 프로그래밍 언어에서 의미를 갖고 사용되고 있는 단어로, 변수 이름으로 사용할 수 없다.
예약어로 변수 이름을 선언하면 컴파일 에러가 발생한다.
자바의 예약어는 아래와 같다.
| 분류 | 예약어 |
| 기본 타입 | boolean, byte, char, short, int, long, float, double |
| 접근 제한자 | private, protected, public |
| 클래스와 관련된 것 | class, abstract, interface, extends, implements, enum |
| 객체와 관련된 것 | new, instanceof, super, null |
| 메소드와 관련된 것 | void, return |
| 제어문과 관련된 것 | if, else, switch, case, default, for, do, while, break, continue |
| 논리값 | true, false |
| 예외 처리와 관련된 것 | try, catch, finally, throw, throws |
| 기타 | package, import, synchroized, final, static |
값 저장
변수에 값을 저장할 때에는 대입 연산자(=)를 사용한다.
수학에서 등호(=)는 '같다'는 의미지만, 자바 언어에서는 오른쪽의 값을 왼쪽의 변수에 저장한다는 의미를 갖는다.
아래 코드는 int 타입으로 ㄴcore 변수를 선언하고, 90이라는 정수값을 score 변수에 저장하는 코드이다.
int score; // 변수 선언
score = 90; // 값 저장
자바에서는 변수에 값이 저장되지 않으면 변수가 생성되지 않는다. 선언과 생성은 다른 이야기이다.
변수 선언은 저장되는 값의 종류와 이름만 언급한 것이고
변수가 최초로 값이 저장될 때 변수가 생성되는데 이것을 변수 초기화 라고 한다.
그리고 이때 사용된 값을 초기값이라고 한다.
위의 코드에서는 90이 초기값에 해당된다.
초기값은 아래의 코드와 같이 변수를 선언함과 동시에 제공할 수 있다.
// 변수를 선언함과 동시에 초기화를 진행
int score = 90;
변수가 초기화되면 메모리 번지 정보를 갖고, 해당 메모리 번지에 값이 저장된다.
초기화 되지 않은 변수는 아직 메모리 번지 정보를 가지고 있지 않으므로 변수를 통해 메모리 값을 읽을 수 없다.
변수 사용
변수는 출력문이나 연산식 내부에서 변수에 저장된 값을 출력하거나 연산할 때 사용한다.
다음 코드를 보면 변수 hour 과 minute 에 각각 3과 5를 저장하였다.
int hour = 3;
int minute = 5;
println() 메소드의 매개값에 변수를 사용하면 변수에 저장된 값을 사용해서 출력한다.
// 변수 hour 과 minute 값을 출력 : 3시간 5분
System.out.println(hour + "시간 " + minute + "분");
그리고 산술 연산식에서 사용하면 저장된 값으로 연산을 수행한다.
아래의 코드는 연산을 수행하는 과정을 보여주는 코드이다.
int totalMinute = (hour * 60) + minute;
int totalMinute = (3 * 60) + minute; // 변수 hour에 저장된 값으로 대치
int totalMinute = 180 + 5; // 변수 minute에 저장된 값으로 대치
int totalMinute = 185; // 185를 변수 totalMinute에 저장
변수는 또 다른 변수에 대입하여 값을 복사할 수 있다.
아래의 코드는 변수 x 값을 변수 y 값으로 복사하는 코드이다.
int x = 10; // 변수 x 에 10을 저장
int y = x; // x 에 저장된 값을 변수 y 에 복사(저장)
변수 사용 범위
자바의 모든 변수는 중괄호 {} 블록 내에서 선언되고 사용된다. 메소드 블록 내에서 선언된 변수를 로컬 변수 라고 부르는데,
로컬 변수는 메소드블록 내부에서만 사용되고 메소드 실행이 끝나면 메모리에서 자동으로 삭제된다.
다음은 main() 메소드 블록 내에서 변수가 선언된 모습이다.
public class valueUseRange{ // 클래스 블록
public static void main(String[] args){ // 메소드 블록
int vlaue = 10; // 로컬 변수 vlaue
int sum = value + 20; // 로컬 변수 sum
System.out.println(sum);
} // 메소드 블록
} // 클래스 블록
변수는 블록 내 어디에서든 선언할 수 있지만, 변수 사용에는 제한이 따른다. 변수는 자신이 선언된 위치로부터 자신이 속한 블록 내부에서만 사용할 수 있다.
메소드 블록 내에는 다른 중괄호 {} 블록들이 작성될 수 있다.
예를 들어 조건문에 해당하는 if(){}, 반복문에 해당되는 for(){}, while(){} 등이 중괄호 블록을 가질 수 있다. 이러한 중괄호 블록 내에서 선언된 변수는 해당 중괄호 블록 내에서만 사용할 수 있고 밖에서는 사용할 수 없다.
public static void main(String[] args){ // 메소드 블록
int var1; // 메소드 블록에서 선언
if(...){ // if 블록
int var2; // if 블록에서 선언
//var1 과 var2 사용 가능
} // if 블록
for(...){ // for 블록
int var3; // for 블록에서 선언
// var1 과 var3 사용 가능
// var2 는 사용 불가
} // for 블록
// var1 사용가능
// var2와 var3는 사용 불가
} // 메소드 블록
변수를 선언할 때에는 다음과 같은 사항을 주의해야 한다.
- 변수가 어떤 범위에서 사용될 것인지를 생각하고, 선언 위치를 결정해야 한다.
- 메소드 블록 전체에서 사용하고 싶다면 메소드 블록 첫머리에 선언한다.
- 특정 블록 내부에서만 사용된다면 해당 블록 내에 선언한다.