유효 범위
우리는 변수와 인스턴스 메서드 등을 사용하기 위해 각각 이름을 붙여줘서 사용하게 된다.
프로그램이 거대해진다면 여러 가지 이유로 이름들이 충돌해서 예기치 못한 오류가 발생할 수 있습니다.
이를 해결하기 위해 유효 범위라는 기능이 있습니다. 유효 범위
전역 변수와 지역변수
전역 변수는 클래스 전역에서 참조하거나 사용할 수 있는 변수입니다.
package blog;
public class Example {
static int i = 10; // 클래스의 전역변수 i
public static void main(String[] args) {
Example ex = new Example();
System.out.printf("%d Class에 존재하는 i입니다 \n", i );
ex.a();
for (int i = 0; i < 5; i++)
System.out.printf("%d for문에 존재하는 i입니다 \n", i );
}
public void a() {
int i = 3; // a메소드안에서만 사용되는 i변수
System.out.printf("%d a()메소드에 존재하는 i입니다 \n", i );
}
//this에대해서 알아보자.
public void b() {
int i =20;
System.out.println();
}
}
public class Example안에서 선언한 static int i라는 변수는 클래스 전역에서 사용할 수 있는 변수입니다.
for문이나 a() 메서드 안에 선언된 i와 달리 클래스 내부에서 선언과 초기화를 해줬기 때문에 클래스 내부 어디에서든 사용할 수 있습니다.
for문 안에 선언된 int i는 외부에 영향을 끼치지 않으며 for문{} 안에서만 효력이 발휘됩니다. 전역 변수와 변수 이름이 같다고 해도 유효 범위를 for문안으로 정해주어서 내부에서만 사용할 수 있습니다.
public void a()라는 메서드 안에 선언된 i라는 변수는 메서드 안에서만 사용할 수 있습니다.
외부 i라는 변수에 영향을 받지 않고 지역 내 선언된 변수 바로 지역변수입니다.
실행결과입니다.
만약 다음과 같은 코드에서 전역 변수를 사용하고 싶을 때는 어떻게 해야 할까요?
public void b() {
int i =20;
System.out.println(i);
System.out.println(this.i);
}
이때 사용하는 키워드가 this입니다. this를 사용하게 되면 인스턴스 자신을 의미하게 됩니다.
그리고 this가 붙게 되면 그 객체에 대한 전역의 값을 가지게 됩니다.
유효 범위란 변수를 전역 변수와 지역변수로 나눠서 관리하기 편리하도록 한 개념입니다.
객체라는 개념이 도입되지 않은 절차 지향 프로그래밍에서는 전역 변수의 사용을 꺼리는 경향이 있습니다.
전역 변수는 프로그램 전체에서 영향을 끼치는 확률이 매우 높습니다. 그러한 이유 때문에 절차 지향 프로그래밍에서는 사용을 하지 않습니다.
연관된 변수와 메서드를 그룹핑하는 객체지향 프로그래밍에서는 전역 변수에 대한 부담을 줄여주게 됩니다.
그 객체 안에서만 전역 변수가 영향을 미치는 범위를 객체 안으로만 한정하기 때문에 사용하기에 부담이 줄었습니다.
하지만 객체지향에서도 전역 변수를 사용하게 되면 전역 변수를 사용하는 메서드는 이 객체에 종속되어있다는 것입니다.
전역 변수에 영향을 받는 메서드는 그 객체 안에서만 활동할 수 있다는 것을 뜻하며 확장에 대해서 닫혀있다는 것을 의미합니다. 그러므로 과도한 전역 변수보다는 객체가 비대해지지 않도록 객체를 작게 쪼개서 역할 분담을 해주는 것 또한 중요한 일입니다.
메서드를 작성할 때 전역 변수에 영향을 미치게 만든다면 외부에서 메서드를 사용할 때 전역 변수가 메서드에 어떠한 영향을 미치는지 알 수 없습니다. 하지만 메서드의 매개변수를 통해서 지역변수를 세팅할 수 있다면 외부에서 매개변수가 미치는 영향을 알 수 있는 더 좋은 방법일 수 있습니다.
유효 범위는 공부를 하다 보면 자연스럽게 익히는 과정입니다. 끝까지 달려서 원하는 끝맺음을 맺었으면 좋겠습니다.
'JAVA > [JAVA] 바구니' 카테고리의 다른 글
[JAVA] Java.lang 패키지 (0) | 2020.04.08 |
---|---|
[JAVA] Anonymous Class (0) | 2020.04.08 |
[JAVA] SOLID 객체지향설계 (0) | 2020.03.25 |
[JAVA] Java Thread (0) | 2020.03.12 |
JAVA GUI (0) | 2020.03.11 |
댓글