카테고리 없음

Variable(변수)

스물훈 2020. 4. 16. 11:41

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 변수

- 변수를 상수화 하는 것

- 읽기 전용을 만들기 위해서 사용

- 이름은 모두 대문자로 하는 것이 일반적

- 용도는 대부분 클래스 내에서 옵션을 만드는 것

- 나눙에 값을 변경하지 못하기 때문에 생성을 할 때 초기화 해야함.