본문 바로가기

JAVA

클래스 변수, 인스턴스 변수, 지역 변수, 생성자

1. 변수

변수는 타입 이외에도 선언되는 위치에 따라서도 그 종류를 구분한다.

변수 종류 선언 위치 생성 시기 종료 시기
클래스 변수
(class variable)
클래스 영역 클래스 로딩 시 단 한 번 생성 프로그램이 종료될 때
인스턴스 변수
(instance variable)
생성자를 호출 GC에 의한 자원 반환 시
지역 변수
(local variable)
클래스 이외의 영역
(메서드, 생성자, 초기화 블럭 내부)
변수가 선언될 때 변수가 선언된 블록이 끝날 때

- 클래스 변수

🔹선언 : 인스턴스 변수 앞에 'static' 키워드 추가

🔹호출 : 클래스명.클래스변수명

               👉 클래스 변수는 클래스를 로딩하고자 할 때 method area 영역에 생성되기 때문에,

                     인스턴스를 생성하지 않고서도 사용할 수 있다.

🔹특징 : 클래스 변수를 가진 클래스를 통하여 생성된 인스턴스는 모두 같은 클래스 변수의 저장 공간을 공유한다.

                때문에 모든 인슨턴스가 같은 특성을 가져야 할 때 해당 특성을 클래스 변수로 선언하는 것이 좋다.

 

- 인스턴스 변수

🔹선언 : 클래스 내부에 선언하는 변수나 메서드 앞에 static이 없으면 인스턴스 변수

🔹호출 : 인스턴스 생성 후 사용 가능, 참조변수명.인스턴스변수명

               👉 인스턴스 변수는 인스턴스 마다 다른 값을 가지고 있기 때문에 해당 인스턴스를 바라보는 주소값이 필요하다.

🔹특징 : 생성된 인스턴스 마다 서로 다른 속성을 가져야 할 때 인스턴스 변수로 선언하는 것이 좋다.

 

- 지역 변수

🔹선언 : 메서드 블럭 내부에서 선언된다.

🔹호출 : 선언된 블럭 외부에서는 호출이 불가하다.

              👉 때문에 접근 제어자를 사용할 수 없다.

🔹특징 : 블럭 내부에서 일련의 연산을 위해 사용하기 때문에 초기화 되어 있지 않으면 컴파일 에러를 발생시킨다.

 

 


2. 변수의 초기화

- 클래스 변수 

🔹초기화 시점 : 클래스의 최초 로딩 시, 단 한 번 초기화 진행

🔹초기화 순서 : 타입의 기본값 ➡️ 명시적 초기화 ➡️ 클래스 초기화 블럭

 

- 인스턴스 변수

🔹초기화 시점 : 인스턴스 생성 시, 인스턴스별 초기화 진행

🔹초기화 순서 : 타입의 기본값 ➡️ 명시적 초기화 ➡️ 인스턴스 초기화 블럭 ➡️ 생성자

 

2-1. 명시적 초기화 

변수를 선언하며 대입 연산자를 통해 초기화 하는 것을 의미한다.

int num = 10;
String = "ABC";
Car car = new Car();

2-2. 초기화 블럭

명시적 초기화에 비하여 다소 복잡한 초기화 작업을 수행할 수 있다.

초기화 블럭에는 초기화 대상이 되는 변수에 따라 '인스턴스 초기화 블럭'과 '클래스 초기화 블럭' 두 가지 종류가 있다.

- 인스턴스 초기화 블럭 : 주로 생성자를 사용하여 생성자에서 공통으로 수행하는 코드를 넣는다. (중복 제거)

- 클래스 초기화 블럭 : 'static' 키워드와 함께 사용하며, 클래스가 로딩될 때 최초 1회만 실행하는 코드를 넣는다.

 

 

 


3. 생성자

생성자는 반환 타입이 없는 인스턴스 초기화 메서드로 인스턴스 변수의 초기화 작업에 주로 사용된다.

생성 규칙은 다음과 같다.

1. 생성자의 이름은 클래스의 이름과 일치
2. 리턴 값이 없다. (모든 생성자는 리턴 값이 없기 때문에 void는 생략됨)

🔹생성자 호출 : new 연산자를 통해 생성자를 호출하여 인스턴스를 생성할 수 있다.

                           또는 다른 생성자 내부에서 this()를 활용하여 호출할 수도 있다.

3-1. 기본 생성자

클래스 내부에 별도의 생성자 선언을 하지 않으면 컴파일러에 의하여 자동으로 추가되는 생성자를 '기본 생성자'라고 한다.

class Car {
	int num;
    // 기본 생성자
    Car() {}
}

만일 클래스 내부에 선언된 생성자가 하나라도 있으면 자동으로 생성되지 않기 때문에 주의해야 한다.

 

3-2. 매개변수가 있는 생성자

생성자는 메서드이기 때문에 오버라이드가 가능하다.

생성되는 인스턴스마다 다른 속성을 주기 위해서 매개변수를 통한 생성자를 활용할 수 있다.

class Car {
	String color;
    int door;
    
    // 기본 생성자
    Car() {}
    // 매개변수가 있는 생성자
    Car(String color, int door) {
    	this.color = color;
        this.door = door;
    }
}

class CarTest {
	// 기본 생성자를 활용한 인스턴스 생성
	Car car1 = new Car();
    // 매개변수를 활용한 인스턴스 생성
    Car car2 = new Car("Black" , 4);
}

🔹매개변수 활용 장점

// 매개변수를 사용하지 않을 때
Car car1 = new Car();

car1.color = "Black";
car1.door = 4;

Car car2 = new Car();

car2.color = "Red";
car2.door = 4;

// 매개변수를 사용할 때
Car car1 = new Car("Black", 4);
Car car2 = new Car("Red", 4);

매개변수를 사용하는 생성자를 활용하는 경우에 보다 객체에 대한 정보가 직관적으로 보이게 된다.

또한 코드의 길이도 간결해져 코드 가독성이 더욱 좋아진다는 장점이 생긴다. 

 

3-3. 생성자에서 다른 생성자 호출하기 - this()

클래스 내부에서 정의된 다른 생성자를 활용할 때 쓰이는 방법이다.

호출하는 생성자에 매개변수가 필요하다면 괄호 안에 넣어 주면 된다.

✍️ 주의 : this() 호출 시에는 반드시 첫 줄에서 한 번만 호출이 가능하다.

      (초기화 중 다른 생성자를 다녀와서 또다시 초기화를 하면 작업이 무의미 해질 수 있기 때문)

Car () {}

// 매개변수 1개를 사용하는 생성자
Car (String color) {
	// 매개변수 2개를 사용하는 생성자 호출
	this(color, 4);
}

// 매개변수 2개를 사용하는 생성자
Car (String color, int door) {
	this.color = color;
    this.door = door;
}

Car(String color) 생성자를 활용하여 인스턴스를 생성하면 기본적으로 door 속성 값은 4로 고정되어 만들어진다.

door의 개수를 변경하고 싶으면 Car(String color, int door) 생성자를 활용하여 인스턴스를 생성하면 된다.

생성자를 오버라이드 할수록 활용할 수 있는 경우의 수가 많아진다.

 

🔹this 키워드

this는 참조변수로 인스턴스 자신을 가리킨다. 

해당 인스턴스는 미래에 생성될 것이라고 기대되는 객체로 그 객체의 주소값을 의미한다.

이러한 특징 덕분에 this 키워드로 인스턴스 변수에 접근이 가능해진다.

앞서 사용한 this.door 은 인스턴스의 변수 door에 생성자 매개변수로 들어온 door의 값을 넣겠다라는 의미를 갖게 된다. 

 

 

 

'JAVA' 카테고리의 다른 글

오버로딩(Overloading)  (0) 2022.09.17
클래스 메서드와 인스턴스 메서드  (0) 2022.09.17
배열  (1) 2022.09.10
클래스 객체 인스턴스  (0) 2022.09.09
깊은 복사와 얕은 복사  (0) 2022.08.24