# 변수 (Variable)
## 변수란?
- 단 하나의 값을 저장할 수 있는 메모리상의 공간을 의미.
- 하나의 변수에 단 하나의 값만 저장 할 수 있고, 새로운 값을 저장하면 기존 값은 사라진다.
## 변수 선언과 초기화
변수 선언
- 변수를 사용하기 위해서는 변수를 선언해야 하고, 아래와 같이 선언 한다.
int age; // 변수 선언.
=>
age 라는 이름의 변수를 선언.
*변수타입 : int
*변수이름 : age
- 변수타입 : 저장될 값이 어떤 타입인지 지정하는 것으로 저장하는 값의 종류에 맞게 변수 타입을 선택해서 작성해야 한다.
- 변수이름 : 변수에 붙이는 이름으로 중복된 변수명을 지정할 수 없다.
- 변수 선언 시 메모리의 빈 공간에 변수타입에 맞는 크기의 저장 공간이 확보 되고, 해당 저장공간은 변수이름을 통해 사용할 수 있게 된다.
변수 초기화
- 변수를 선언하면 변수를 사용할 수 있는데 사용 전 반드시 변수를 초기화 해야 한다. (메모리는 여러 프로그램이 공유하는 자원, 다른 프로그램에 의해 저장된 쓰레기 값이 남아있을 수 있기 때문에 초기화 필수)
- 변수에 값 저장 시 대입 연산자('=') 사용하며, 변수 초기화는 아래와 같이 진행 한다.
int age = 15;
=>
변수 age를 선언하고 15로 초기화.
- 타입이 같은 경우 콤마(',')를 구분자로 여러 변수를 한 줄에 선언 할 수 있다.
int a, b;
int x = 0, y = 0;
- 변수의 종류에 따라 변수 초기화를 생략할 수 있는 경우도 있지만, 변수는 사용되기 전 적절한 값으로 반드시 초기화 되어야 한다.
## 두 변수 값 교환
- 아래와 같이 두 변수에 담긴 값을 서로 바꾸기 위해서는 하나의 값을 임시 저장할 새로운 변수가 필요하다.
int a = 10;
int b = 6;
=>
두 값을 서로 변경하기 위해서는 새로운 변수 필요.
int a = 10;
int b = 6;
int temp = 0;
아래와 같이 임시 변수(temp)에 값을 저장 후 값 변경.
temp = a; // temp에 10 저장.
a = b; // a에 b의 값(6) 저장.
b = temp; // b에 a의 값(temp에 담긴 값) 10 저장.
결과적으로 a와 b의 값이 서로 변경 됨.
a = 6
b = 10
## 변수 명명 규칙
- 식별자(identifier) : 변수 이름처럼 프로그래밍에서 사용하는 모든 이름, 같은 영역 내에서 서로 구분(식별)될 수 있어야 한다.
- 변수의 이름은 짧을수록 좋지만, 용도를 알기 쉽도록 의미있는 이름으로 명명 하는것이 적합하다. (변수 선언문에 주석으로 변수에 대한 정보를 작성하는 것도 적합하다.)
- 대소문자 구분되며 길이에 제한이 없다.
- 예약어를 사용해서는 안 된다. (예약어는 키워드(keyword) 또는 리져브드 워드(reserved word) 라고 함)
- 숫자로 시작해서는 안 된다.
- 특수문자는 '_' 와 '$'만 허용.
- 클래스 이름의 첫 글자는 항상 대문자로 시작.
- 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 지정.
- 상수의 이름은 모두 대문자로 지정. 여러 단어인 경우 '_'로 구분.
## 변수의 타입
- 자료형 : 값의 종류에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것으로 문자형, 정수형, 실수형 등이 존재.
- 자료형은 크게 기본형과 참조형으로 나눌 수 있다.
기본형 변수 (primitive type)
- 실제 값(data)을 저장.
- 기본형에는 모두 개의 자료형(타입)이 존재한다. (논리형, 문자형, 정수형, 실수형 으로 구분)
- 논리형 : boolean
- 문자형 : char
- 정수형 : byte, short, int, long
- 실수형 : float, double
참조형 변수 (reference type)
- 특정 값이 저장되어있는 주소(memory address)를 값으로 갖는 것. (자바의 경우 C언어와 달리 참조형 변수 간 연산을 할 수 없다.)
- 참조형 변수 선언 시 변수의 타입으로 클래스 이름을 사용, 클래스의 이름이 참조변수의 타입이 된다. 그렇기 때문에 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 것과 같다고 할 수 있다.
- 참조형 변수는 아래와 같이 선언.
클래스이름 변수이름; // 변수 타입이 기본형이 아닌 것들은 모두 참조형 변수임.