변수에 대해서는 다들 알것이다. 이전 포스트에서도 간략하게 설명하였지만 하지만 이번에는 변수가 가지는 범위에 대해서 자세히 알아볼 것이다.
변수의 범위는 두가지로 나눌수가 있다. 전역변수와 지역변수 이다.
지역변수는 메서드 내에서만 사용이 가능하고 전역변수는 다른 메서드 에서도 사용이 공통적으로 가능하다. 코드를 실행 순서대로 읽어보며 설명하겠다.
public class range3 {
int a= 1; //인스턴스 전역변수
static int b = 2; //클래스 전역변수
public void num() {
int a=10; //지역변수
System.out.println(a);
System.out.println(this.a);
}
static public void num2(){
System.out.println(b);
}
public static void main(String[] args) {
//System.out.println(a);
range3 c1 = new range3();
c1.num();
num2();
}
}
실행 결과는 아래와 같다.
10
1
2
강조하면 항상 지역 변수가 전역 변수보다 우선 처리 된다. 중간 중간 의문이 들어도 일단 천천히 읽어보자.
1. 먼저 메인을 살펴보자. range3 c1 = new range3 를 선언하여 인스턴스인 c1을 만든것이 보일것이다. 그후 인스턴스는 num();을 호출하여 num 인스턴스 메서드로 이동할것이다.
public static void main(String[] args) {
//System.out.println(a);
range3 c1 = new range3();
c1.num();
num2();
}
2. 잘 보니 num 메서드에서 출력을 두번하는데 먼저 변수로 int a= 10이라는 값이 있다. 이게 지역변수이다. 다른 메서드에서는 int a = 10을 읽지 못한다. 오직 num 메서드 에서만 사용이 가능하다. 그래서...
System.out.println(a); 에는 10이라는 값이 들어가게 된다.
public void num() {
int a=10; //지역변수
System.out.println(a);
System.out.println(this.a);
}
3.
System.out.println(this.a);
이건 또 무엇인가? this 이런거 보면 생소해서 짜증나지 않는가? 간단하다 인스턴스 전역변수 a를 가져온다는 뜻이다. 잘 보면 class 바로 아래에 int a= 1 이 선언되어 있는데 이게 전역변수 이다. 전역 변수는 클래스 아래에 선언되어 다른 메서드에서도 공통으로 사용이 가능한 변수이다. 따라서 전역 변수 a를 가져오기에 1을 출력하게 된다.
3-1) 왜 int a 가 중복이 안되냐고 물어 볼수도 있어서 쓰면 타입과 문자는 같아도 지역변수 전역변수 따로따로 할당하는 거라 충돌 나지 않는다.
3-2) 전역변수면 static 이 붙는거 아니냐구...? static 붙으면 인스턴스에서는 사용할수가 없다.
3-3) int a =1; 인 인스턴스 변수는 전역 변수니깐 num2에 넣으면 어떻게 되냐구? 에러뜬다. (클래스의 것은 인스턴스의 것을 사용할수 없음) (참고 (JAVA)클래스 맴버, 인스턴스 맴버. https://acid7937.tistory.com/14)
따라서 만약 int a =1; 이 아래에 인스턴스 선언이 안되어 있으면 빨간색 밑줄뜨면서 에러 뜰꺼다 빨리빨리 앞에다 static 붙이라고...
static public void num2(){
System.out.println(b);
}
static 으로 선언 하는 변수는, 이런 클래스 메서드 에서만 사용이 가능하다.
4.
static int b = 2;
클래스 아래에 이것또한 보일것이다. 전역변수 이다. 인스턴스에서도 사용이 가능하지만 클래스 메서드에서 사용하려면 static 이 붙은 전역 변수가 필요하다.
5.
public static void main(String[] args) {
//System.out.println(a);
range3 c1 = new range3();
c1.num();
num2();
}
num2();에서 메서드를 호출하는건 알고 있겠지요... 후후...
num2 메서드를 잘 보면 값이 딱히 지정되어 있지 않는데 앞서 말한 전역변수 static int b =2; 를 끌고와서 2라는 값을 넣게 되는 것이다.
'자바 > 정리' 카테고리의 다른 글
(JAVA)상속 (0) | 2022.11.10 |
---|---|
(JAVA)생성자 (0) | 2022.11.10 |
(JAVA)클래스 맴버, 인스턴스 맴버. (0) | 2022.11.09 |
(JAVA)클래스와 인스턴스 (1) | 2022.11.09 |
(JAVA)메서드 (0) | 2022.11.08 |