Variable(변수)
1. 변수의 종류
1) Local Variable(지역 변수)
- 메소드 안에서 만들어진 변수
- 생성된 영역에서만 사용 가능
- 제어문, 예외처리 구문에서 만들어진 변수는 해당 영역을 벗어나면 소멸.
- 제어문, 예외처리 구문에서 만들어진 변수는 다른 제어문이나 예외처리 구문에서
다시 만들어 사용 가능하지만, 제어문, 예외처리 구문이 아닌 곳에서 만들어진 지역변수는
제어문이나 예외처리 구문에서 다시 만들어 사용 불가.

2) Instance Variable(인스턴스 변수 - member variable, field 또는 attribute, property 라고도 함)
- 클래스 내부, 메소드 외부에 static이라는 키워드 없이 선언된 변수
- 클래스 안에 만들지만 실제 소유는 인스턴스가 하고 각각의 인스턴스마다 별도로 생성
- 인스턴스 고유의 데이터를 저장할 목적으로 생성
- 자동으로 초기화가 됨(숫자는 0, boolean은 false, 나머지는 null)
ex) Student라는 클래스의 age, name, grade 등을 저장하기 위해서 생성한 변수
*클래스의 참조를 저장하기위한 인스턴스와는 다른 개념임.
3) Static Variable(클래스 변수, 정적 변수)
- 클래스 내부, 메소드 외부에 static이라는 키워드와 함께 선언된 변수
- 클래스 내부에 1개만 만들어지는 변수
- 인스턴스들이 데이터를 공유(통신)할 목적으로 생성
- 자동으로 초기화가 됨(숫자는 0, boolean은 false, 나머지는 null)
4) 변수의 다른 분류
- 객체 지향 언어는 위 3개로 변수를 구분하는데 종종 지역변수와 전역변수로 구분하기도 함.
- 객체 지향 언어에는 static변수를 만들거나 singleton패턴의 클래스를 디자인에서 전역변수를 만든다.
5) 인스턴스 변수 만드는 법
접근지정자 특성 자료형 변수명 = 값;
선언과 동시에 값을 대입하는것은 잘 하지 않음
- 객체 지향 언어에서는 인스턴스 변수의 초기화를 목적으로 하는 생성자를 제공하기 때문에
생성자에서 초기화하는 것을 권장.
접근
- 클래스 내의 메소드에서는 이름만 사용해도 되고 동일한 이름이 있는 경우에는 'this.변수명'으로 접근
- 클래스 외부에서 인스턴스를 이용해서 접근할 때는 인스턴스이름.변수명
6) 접근 지정자
private - 클래스 내에서만 사용 가능,인스턴스가 사용할 수 없음
package(default) - 같은 패키지 안에서는 public, 다른 패키지에서는 private
protected - 같은 패키지안에서만 사용 가능하고, 다른 패키지더라도 상속을 받은 경우에는 하위클래스에서 사용 가능
다른 패키지인 경우 인스턴스가 사용할 수 없음
public - 클래스 내에서 사용이 가능하고 인스턴스도 사용할 수 있음
특성
transient: serialization(직렬화 - 파일이나 통신을 할 때 한번에 전송 가능하도록 하는 것)에서 제외
volatile: 스레드에서 작업할 때 원본 데이터 전체를 가지고 작업하도록 해주는 예약어
static 변수(클래스 변수)
- 클래스 내부, 메소드 외부에 static이라는 키워드를 자료형 앞에 추가해 선언한 변수
- 클래스 안에 1개만 만들어짐.
- 자동으로 초기화 됨.
- 인스턴스들이 데이터를 공유할 목적으로 만듦.
- 이 변수는 외부에서 접근할 때는 "클래스이름.변수명"으로 접근
- 메소드 영역에 생성됨.
- 자바에서는 "인스턴스이름.변수명"으로 접근 가능한데 경고 발생.
* 경고가 발생하는 이유는 인스턴스를 통해 접근하게 되면 stack -> heap -> method영역을 거쳐
static변수에 접근하게 되는데 클래스이름을 통해 접근한다면 바로 method영역의 static변수를 참조
Final 변수
- 변수를 상수화 하는 것
- 읽기 전용을 만들기 위해서 사용
- 이름은 모두 대문자로 하는 것이 일반적
- 용도는 대부분 클래스 내에서 옵션을 만드는 것
- 나눙에 값을 변경하지 못하기 때문에 생성을 할 때 초기화 해야함.