🚀 Programming/JAVA+Spring

[Java] 변수 구분하기 (클래스변수/ 인스턴스변수/ 지역변수)

jishushu 2022. 8. 28. 18:20
728x90
반응형

변수는 3종류로 나눌 수 있다.

클래스변수, 인스턴스 변수, 지역변수

클래스변수와 인스턴스 변수는 묶어서 멤버변수라고도 하며 클래스 내에서 선언된다.

반면 지역변수는 메서드 안에서 선언되고 해당 메서드 안에서만 사용 가능하다.

 

멤버변수를 클래스변수와 인스턴스 변수로 구분할 수 있는 기준:

1. 클래스변수는 static을 붙여서 만든다.

2. 인스턴스 변수는 객체 생성을 해야 사용가능하다

 

아래의 내용을 실행하기 이전,

prog클래스에서 메인 메서드 안에 Test.a 는 빨간줄이 생긴다.

인스턴스 변수인 a를 객체 생성없이 사용할 수 없기 때문이다.

(change 'a ' to 'static') 이라는 메시지를 볼 수 있다.

이를 제외하고 실행하면,

package testprepare;
public class Test {
	int a=1; //멤버변수-인스턴스변수
	int b; //멤버변수-인스턴스변수
	static String st="I'm a static variable"; //멤버변수-클래스 변수
}
class prog {
	static int b=3; //prog의 클래스변수 b 
	public static void main(String[] args) {
	 System.out.println(Test.st); //클래스 변수는 객체 생성 없이 사용가능
	 String st="new variable"; //지역변수 st(메서드 안에 위치하고 있다)
	 System.out.println(st); 
	 System.out.println(Test.a); //인스턴스변수는 객체 생성없이 사용할 수 없다 (change 'a' to 'static')
	 Test exercise = new Test(); //객체 생성
	 System.out.println("인스턴스 a값은 "+exercise.a); //객체의 a값을 가져온다.
	 exercise.a=2; //a값을 바꾸면
	 System.out.println("새로운 a값은 "+exercise.a); //a=2가 된다
	 System.out.println("b값은 "+b+" >>클래스변수를 가져옵니다"); //b만 쓸경우 prog의 클래스변수를 가져온다
	 System.out.println("인스턴스 b값은 "+exercise.b); //exercise.b 라고 표시를 해주면 exercise에서 인스턴스변수를 가져온다
	 int c=4;	//지역변수 c(메서드 안에 위치하고 있다)
	 System.out.println("지역변수 c값은 "+c);
	}
}

다음과 같은 결과를 얻을 수 있다.

I'm a static variable
new variable
인스턴스 a값은 1
새로운 a값은 2
b값은 3 >>클래스변수를 가져옵니다
인스턴스 b값은 0
지역변수 c값은 4

1. 클래스 변수는 객체 생성없이 사용할 수 있다. (Test.st 로 바로 접근 가능)

위에서 말했듯 인스턴스 변수는 객체 생성없이 사용할 수 없다. (Test.a 불가)

2. 클래스변수든 인스턴스 변수든 클래스명이나 객체명을 표시하지 않으면 못가져온다.

(st 와 b 둘다 prog클래스내의 st와 b값을 가져온다)

 

그럼 클래스변수는 왜 쓰는걸까?

  • 인스턴스에 따라서 변하지 않는 값이 필요한 경우
  • 인스턴스를 생성할 필요가 없는 값을 원하는 경우
  • 변경 사항을 모든 인스턴스가 공유해야 하는 경우

가령,

a,b,c 세가지 라인의 제품코드번호를 만들때

대충

a라인 제품 코드번호 만들 메서드 "aaa"+(가로+세로)%높이

b라인 제품 코드번호 만들 메서드 "bbb"+(가로+세로)%높이

c라인 제품 코드번호 만들 메서드 "ccc"+(가로+세로)%높이

라고 만들었다 치자. (동일 라인내라도 제품 크기는 제각각)

그럼 가로, 세로, 높이가 변수가 되어

a라인메서드(가로, 세로, 높이)

b라인메서드(가로, 세로, 높이)

c라인메서드(가로, 세로, 높이)

...이런식으로 입력하겠지

여기서 조건을 추가해서 높이는 항상 10으로 같다고 치자 (인스턴스에 따라서 변하지 않는 값이 필요한 경우)

그럼 모든라인의 메서드에서 굳이 매번 높이를 입력할 필요없이 높이는 클래스변수로 두는것이다.

게다가 원가 상승으로 높이를 5로 줄이기로 한다면 (변경 사항을 모든 인스턴스가 공유해야 하는 경우)

클래스변수 높이의 값만 5로 수정해주면 

모든 제품에서 줄어든 높이로 코드번호가 만들어진다.

 

머리속에서는 알겠는데...?

 

훨씬 잘 정리된 페이지>>

 

클래스 맴버와 인스턴스 맴버 - 생활코딩

맴버 맴버(member)는 영어로 구성원이라는 뜻이다. 객체도 구성원이 있는데 아래와 같다. 객체를 만들기 위해서 우선 클래스를 정의하고, 클래스에 대한 인스턴스를 만들었다. 복습을 해보자. 이��

opentutorials.org

 

반응형