본문 바로가기
study/Java

자바 Java 선언 위치에 따른 변수의 종류

by 고기만두(개발자) 2021. 8. 17. 18:50
728x90
반응형
package study;

class Variables {
	int iv; //instance variable
	static int cv; //class variable
	
	void method() {
		int lv = 0; //local variable
	}
}
/* 코드와 텍스트를 함께 봐 주세요! */

위 코드의 3가지 변수 중 iv인스턴스 변수, 인스턴스가 생성될 때 지정됩니다.

인스턴스마다 다른 값을 가질 수 있으므로, 필요에 따라 값을 새롭게 지정할 수 있습니다.

반면 클래스 변수 cv는 고정된 값으로, 이 클래스를 통해 인스턴스화된 객체들이 공통된 변수를 공유하게 됩니다.

그래서 클래스 변수는 공유 변수라고도 부릅니다.

한편 lv지역 변수로 메서드 안에서만 사용이 가능합니다.  

다시 말해, 메서드가 종료되면 사용할 수 없다는 뜻입니다.

이 내용을 새로운 예제를 통해 이해해 보도록 하겠습니다.

아래의 코드를 함께 봐 주세요.

class Card{
	String kind;
	int number; //인스턴스 변수로 카드의 종류와 숫자를 지정
	static int width = 100;
	static int height = 250; //클래스 변수로 카드의 폭과 높이를 지정
}

public class CardTest {
	public static void main(String[] args) {
		System.out.println("카드의 폭은 "+ Card.width);
		System.out.println("카드의 길이는 "+ Card.height); 
//클래스 변수는 따로 객체를 생성하지 않아도 읽어올 수 있음
		
		Card c1 = new Card();
		c1.kind = "Heart";
		c1.number = 7;
		
		Card c2 = new Card();
		c2.kind = "spade";
		c2.number = 4; //새로운 객체를 생성하며 인스턴스변수 값을 변경
		
		System.out.println("c1은 " + c1.kind + " " + c1.number + "이며 크기는 " + c1.width + "*" + c1.height + "이다.");
		System.out.println("c2는 " + c2.kind + " " + c2.number + "이며 크기는 " + c2.width + "*" + c2.height + "이다.");
		
		System.out.println("그런데 카드의 크기를 다음과 같이 변경하게 되면");
		
		c1.width = 50;
		c1.height = 80; //클래스 변수 값 변경
		
		System.out.println("c1은 " + c1.kind + " " + c1.number + "이며 크기는 " + c1.width + "*" + c1.height + "이다.");
		System.out.println("c2는 " + c2.kind + " " + c2.number + "이며 크기는 " + c2.width + "*" + c2.height + "이다.");
		
	}
}

Card 클래스에서 kind number는 인스턴스 변수로, width height는 클래스 변수로 지정했습니다.

따라서 어떤 카드를 생성하더라도 모두 같은 크기 규격으로 만들어질 것입니다.

하지만 카드의 종류와 숫자는 인스턴스가 생성될 때마다 새로 지정되어 고유의 속성을 가질 수 있겠죠.

실제로 CardTest 클래스에서 인스턴스 c1 c2는 서로 다른 종류와 숫자를 가진 카드로 탄생했습니다.

그리고 클래스 변수의 값을 변경하자 모든 카드의 width height에 변경이 생겼습니다.

코드를 실행하면 다음과 같은 결과가 나옵니다.

이번 예제를 통해 변수의 적용범위에 대해 알아보았습니다.

이 내용을 표로 정리하면 다음과 같습니다.

 

변수의 종류 선언 위치 생성 시기 필요한 상황
멤버 변수 클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때 모든 객체가 공통적으로 같은 상황
인스턴스 변수 인스턴스가 생성되었을 때 인스턴스마다 개별 속성이 필요할 때
지역변수 클래스 영역 외
(메소드/생성자 내부)
변수 선언문이 수행되었을 때 메소드/생성자 안에서 개별 속성이 필요할 때

덧붙여서, 클래스 변수 값을 변경할 때는 인스턴스 변수를 불러와서 c1.width 와 같은 형태로도 변경할 수 있지만,

클래스 변수를 인스턴스 변수로 오해하게 될 여지가 생기므로 Card.width와 같이 클래스명.클래스변수 의 형태로 소환해 주는 것이 가독성이 더 좋다고 하니 참고하시면 도움이 될 것 같습니다.

728x90
반응형

댓글