안녕하세요~ 

이번 시간에는 변수의 종류에 따라 달라지는 범위에 대해 알아보려고 하는데요.

바로 예시코드부터 보시죠!

중괄호 영역에 따라 달라지는 변수의 개념

class Math {
	int num = 10;
	static int number = 100;
	
	void check() {
		int num = 20;
		System.out.println("전역변수 num 값 : " + this.num);
		System.out.println("지역변수 num 값 : " + num);
	}
	void plus(int a) {
		System.out.println("입력받은 숫자 값 : " + a);
		System.out.println("num에 더한 값 : " + (num+a));
	}
}

public class Main {	
	public static void main(String[] args) {
		Math m1 = new Math();
		Math m2 = new Math();
		
		m1.check();
		m1.plus(10);
		System.out.println();
		m2.check();
		m2.plus(20);
		System.out.println();
		System.out.println("m1의 정적변수 : "+m1.number);
		System.out.println("m2의 정적변수 : "+m2.number);
		System.out.println();	
		Math.number = 30;
		System.out.println("정적변수를 30으로 바꾼 후");
		System.out.println("m1의 정적변수 : "+m1.number);
		System.out.println("m2의 정적변수 : "+m2.number);
		
	}	
}

 Math 객체를 활용해 다양한 변수를 출력하는 코드.

오늘의 핵심 키워드

1.  클래스 영역에 선언되는 전역변수는 선언된 영역 전체에서 사용 가능하다.

2. 조건문, 반복문, 메소드 안에 선언되는 지역변수는 그 내부영역에서만​ 사용 가능하다.

3. 앞에 static이 붙는 정적변수는 가장 먼저 메모리가 올라가 모든 객체가 공용으로 사용한다.  ※ 객체 생성 필요 없이 사용 가능하다.


Math 클래스를 살펴보면,
- 1번 규칙에 따라서 맨 처음에 있는 num 변수는 클래스 영역에 선언되어  전역변수라는 것을 알 수 있고, 
- 2번 규칙에 따라서 그 밑에 있는 number 변수는 static이 붙어있는  정적변수인 것을 알 수 있습니다.  
- 3번 규칙에 따라서 check 메소드 안에 선언된 num 변수는 그 안에서만 사용할 수 있는 지역변수입니다.
이클립스 실행화면

** m1 객체

전역변수 num = 10

check메소드 num = 20

main메소드에서 호출할 때 넣어준 매개변수 = 10

전역변수 num에 매개변수를 더해준 값 = 30


** m2 객체

전역변수 num = 10

check메소드 num = 20

main메소드에서 호출할 때 넣어준 매개변수 = 20

전역변수 num에 매개변수를 더해준 값 = 30


m1의 정적변수 number = 100

m2의 정적변수 number = 100


-- 정적변수 number를 30으로 바꾸고 나서

m1의 정적변수 number = 30

m2의 정적변수 number = 30


정적변수 number는 메모리에 고정적으로 존재해 모든 객체가 공유하여 하나의 객체에서 값을 변경해도 모든 객체가 동일하게 변경되는 것을 확인할 수 있습니다.

참고로 정적변수 number는 객체 생성 필요 없이 사용가능하기 때문에 예시코드처럼 앞에 클래스 이름만 붙여서 Math.number = 30 ; 으로도 사용할 수 있습니다.

꼭 봐야되는 마무리 꿀팁!
  • 전체 영역에서 자주 사용하는 변수는 전역변수로 선언하기!
  • 모든 객체에서 공통으로 사용하는 변수는 정적변수로 선언하기!
  • 한정적으로 반복문, 조건문, 메소드 안에서만 사용하는 변수는 지역변수로 선언하기!

▲영상으로 한번 더 복습하세요 :)