JAVA/객체지향프로그래밍1

[JAVA] 변수와 메서드-변수

prize1209 2021. 6. 19. 21:46

1. 선언 위치에 따른 변수의 종류

 

변수는 클래스변수, 인스턴스변수, 지역 변수 3종류가 있다.

변수의 종류를 결정짓는 중요한 요소는 '변수의 선언된 위치'다.

 

멤버변수를 제외한 나머지 변수들은 모두 지역변수이며,

멤버변수 중 static이 붙은 것은 클래스변수, 붙지 않은 것은 인스턴스 변수다. 

 

iv,cv는 클래스 영역에 선언되어 있으므로 멤버변수다. 그 중 cv는 키워드 static과 함께 선언되어 있으므로 클래스 변수이며, iv는 인스턴스 변수다. 그리고 lv는 메서드인 method()의 내부, 즉 '메서드 영역'에 선언되어 있으므로 지역변수다.

 

 

 

 

 

인스턴스변수(instance variable)

 

- 각 인스턴스의 개별적인 저장공간. 인스턴스마다 다른 값 저장가능

- 인스턴스 생성 후, 참조변수.인스턴스변수명으로 접근

- 인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 가비지컬렉터에 의해 자동제거됨

 

클래스변수(class variable)

 

- 같은 클래스의 모든 인스턴스들이 공유하는 변수

- 인스턴스 생성없이 클래스이름.클래스변수명으로 접근

- 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸

 

지역변수(local variable)

 

- 메서드 내에 선언되며, 메서드의 종료와 함께 소멸

- 조건문, 반복문의 블럭{} 내에 선언된 지역변수는 블럭을 벗어나면 소멸

 

 

 

2. 클래스 변수와 인스턴스 변수 

 

인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만,

클래스변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.

 

 

 

 

예5)

public class CardTest {
	public static void main(String[] args) {
		System.out.println("card.width=" + Card.width);
		System.out.println("card.height=" + Card.height);
		// 클래스변수(static 변수)는 객체 생성 없이 '클래스이름.클래스변수'로 직접 사용 가능

		// c1 객체 생성
		Card c1 = new Card();
		c1.kind = "Heart";
		c1.number = 7;

		// c2객체 생성 . 인스턴스 변수의 값을 변경한다.
		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와 height를 각각 50, 80으로 변경합니다");
		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 + ")");

	}
}

class Card {
	String kind;
	int number;
	static int width = 100;
	static int height = 250;
}

 

cv는 클래스 이름이 앞에 붙어야한다. 

Card 클래스의 클래스변수(static 변수)인 width, height는 Card클래스의 인스턴스를 생성하지 않고도

'클래스이름.클래스변수'와 같은 방식으로 사용 가능하다. 

 

Card 인스턴스인 c1과 c2는 클래스 변수인 width와 height를 공유하기 때문에 

c1의 width와 height를 변경하면 c2의 width와 height도 바뀐 결과를 얻는다. 

 

Card.width, c1.width, c2.width는 모두 같은 공간을 참조하므로 항상 같은 값을 갖는다. 

 

 

클래스변수를 사용할 때는 Card.width와 같이 '클래스이름.클래스변수' 형태로 하는 것이 좋다.

참조변수 c1,c2를 통해서도 클래스 변수를 사용할 수 있지만 이렇게 하면 클래스 변수를 인스턴스 변수로 오해하기 쉽다.

 

 

정리

인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만,

클래스변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 가진다. 

 

 

'JAVA > 객체지향프로그래밍1' 카테고리의 다른 글

[JAVA] return문  (0) 2021.06.20
[JAVA]메서드  (0) 2021.06.20
[JAVA] 객체 배열  (0) 2021.06.18
[JAVA] 객체와 인스턴스  (0) 2021.06.18
[JAVA] 클래스와 객체  (0) 2021.06.18