본문 바로가기

Programming/자바

생활코딩 자바 - 유효범위

int left; => 변수의 이름

public void sum(); => 메소드의 이름

 

프로그램이 커지면 이러한 이름들이 충돌하게 됨 (중복될 수도)

-> 해결 위해 유효범위(scope) 고안됨

 

유효범위
  •  

static void a() {
int i = 0;    => 메소드 a 안에서 i 가 선언되므로 a 밖에선 영향 X (a 메소드 안에서만 유효함) => 유효범위
}

public static void main(String[] args) {
for (int i = 0; i < 5; i ++) {
a();
System.out.println(i);
}

 

//

0

1

2

3

4

 

전역변수, 지역변수

유효범위 비유- 디렉토리

파일 많아지면 관리 어려움 -> 디렉토리 내에서만 파일명 안 겹치게 하고, 밖에서는 중복되도 문제 없도록 함

 

  •  

 

public class ScopeDemo2 {

 

static int i;    => 클래스 바로 밑에서 선언되는 직속 변수 => 전역변수(global variables)

static void a() {
i = 0;   => a 메소드 안에서 선언된 변수 => 지역변수(local variables)
}    => & int가 안 붙으므로 새로 생성 x, 앞의 전역변수 i 사용한 것 (일종의 the인듯)

public static void main(String[] args) {
for (i = 0; i < 5; i ++) {    => 앞에 int가 없으므로 새로 i 선언한 것은 아님 => 이미 존재하던 전역변수 i 사용한 것
a();
System.out.println(i);
}

 

//

0

0

0

...

 

  •  

public class ScopeDemo2 {

 

static int i;

static void a() {
int i = 0;    => i 변수 새로 생성, 세팅 -> 메소드 a 안에서만 유효
}

public static void main(String[] args) {
for (i = 0; i < 5; i ++) {
a();
System.out.println(i);
}

}

 

//

0

1

2

3

4

 

  •  

public class ScopeDemo2 {

static int i;

static void a() {
i = 0;
}

public static void main(String[] args) {
for (int i = 0; i < 5; i ++) {    => for문 중괄호 안에서만 유효한 지역변수 i
a();
System.out.println(i);
}

}

 

//

0

1

2

3

4

 

 

다양한 유효범위
  •  

static void a() {
String title = "coding everbody";
}

public static void main(String[] args) {
a();
System.out.println(title);   => 따로 title에 대한 선언이 존재하지 않음 -> a 안의 title 읽지 못함
}

 

  •  

public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println(i);}

System.out.println(i);   => for문 중괄호 밖에는 선언된 i 가 없으므로 출력 X, 새로 생성시켜야 함
}

}

 

  •  

static int i = 5;

static void a() {
int i = 10;
b();
}

static void b() {
System.out.println(i);  => 전역변수 사용
}

public static void main(String[] args) {
a();
}

 

//5

 

  •  

static int i = 5;

static void a() {
int i = 10;
b();
}

static void b() {
System.out.println(i);
}

public static void main(String[] args) {
int i = 1;
a();
}

 

//5

 

  •  

static int i = 5;

static void a() {
int i = 10;
b();
}

static void b() {
int i = 30;
System.out.println(i);    => 메소드 b의 유효범위 사용
}

public static void main(String[] args) {
int i = 1;
a();
}

 

//30

 

  • 정적인 유효범위(static/lexical scope) :  고정된 형태의 유효범위 - 자기 자신 또는 전역변수에만 접근 가능 = 메소드끼리 링크되지 않는 것? 

( <-> b 호출했는데 a 메소드 지역변수가 출력 : 동적인 유효범위(dynamic scope) )

 

static void a() {
int i = 10;
b();
}

static void b() {    => 선언된 i 가 없음
System.out.println(i);
}

public static void main(String[] args) {
int i = 1;
a();
}

 

 

this
  •  

class C {
int v = 10;   => 전체적으로는 10 / m 메소드라는 특수 상황에서만 20 출력

void m() {
int v = 20;    => 선언된 변수 중복 -> 해당 메소드 안 지역변수가 1순위 
System.out.println(v);
}
}

public class ScopeDemo6 {

public static void main(String[] args) {
C c1 = new C();
c1.m();
}
}

 

//20

 

  • this

class C {
int v = 10;

void m() {
int v = 20;
System.out.println(v);
System.out.println(this.v);    => 인스턴스 그 자체 & 그 객체에 대한 전역
}
}

public class ScopeDemo6 {

public static void main(String[] args) {
C c1 = new C();
c1.m();
}

 

//

20

10

 

 

총정리

유효범위 = 전역변수, 지역변수로 나눠 관리하기 편리하도록 한 것