(1) "프로그램이 커지면 여러 가지 이유로 이름이 충돌하게 된다. 이를 해결하기 위해서 고안된 것이 유효범위라는 개념이다. 흔히 스코프(Scope)라고도 부른다."
package org.opentutorials.javatutorials.scope;
public class ScopeDemo {
static void a() {
int i = 0;
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
a();
System.out.println(i);
}
}
}
// 결과
0
1
2
3
4
package org.opentutorials.javatutorials.scope;
public class ScopeDemo2 {
static int i;
static void a() {
i = 0;
}
public static void main(String[] args) {
for (i = 0; i < 5; i++) {
a();
System.out.println(i);
}
}
}
static int i; // 선언 -> 클래스 내 모든 메소드, for문 즉, 모든 {} 안에서 접근할 수 있는 전역변수가 되는 것
static void a(){
i=0; // 선언 아닌, 할당만 즉, i는 메소드 a() 안에서 생성된 변수가 아니니 메소드 밖에서도 작동함
}
static void a() {
int i = 0; // int i 라는 변수는 메소드 a()안에서 생성된 변수니까 이 메소드 안에서만 작동하는 것 -> 해당 중괄호 안에서만 작동함
}
static void a(){
i=0;
package org.opentutorials.javatutorials.scope;
public class ScopeDemo2 {
static int i;
static void a() { // i에 int 붙여준다는 건 i가 for문 {} 안에서만 유효한 지역변수가 된다는 뜻
i = 0;
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) { // i에 int 붙여준다는 건 i가 for문 {} 안에서만 유효한 지역변수가 된다는 뜻 -> 밖에서는 작동 안 함
a();
System.out.println(i);
}
}
}
package org.opentutorials.javatutorials.scope;
public class ScopeDemo4 {
static void a(){
String title = "coding everybody";
}
public static void main(String[] args) {
a();
System.out.println(title);
}
}
package org.opentutorials.javatutorials.scope;
public class ScopeDemo6 {
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();
}
}
답은 1 클래스 변수: 메소드 내(b)에서 지역변수가 존재하지 않는다면 그 메소드가 소속된 클래스의 전역변수를 사용하게 된다.
즉, b 메소드의 유효범위는 "b 자기 자신(b 지역 변수)"이거나 "전역 변수" 둘 중 한 쪽 범위에서 접근이 가능하다!
b 메소드를 누가 호출하든지 상관이 없다.
✓지역변수와 전역변수가 중첩이 될 때의 장점
1. 전역변수는 모든 메소드나 지역변수에서 공통적으로 사용할 수 있는 기본값이 된다.
2. 특정 지역변수 내에서만 선언한 변수(i)의 값을 변경하고 싶을 때 변경이 가능하다.(지역변수 우선순위)
( 출처 유튜브 댓글 https://youtu.be/xqPccJqA8kg 작성자 레이유)
package org.opentutorials.javatutorials.scope;
class C {
int v = 10;
void m() {
int v = 20;
System.out.println(this.v);
}
public class ScopeDemo7 {
public static void main(String[] args) {
C c1 = new C();
c1.m();
}
}
** 전역변수에 의존한다는 것은 이 메소드가 다른 완제품의 부품으로서 사용될 수 없다는 의미다. 객체지향 덕분에 좀 더 안심하고 전역변수를 사용하게 되었지만, 객체도 크기가 커지면 관리의 이슈가 생겨난다. 객체지향 프로그래밍에서도 가급적이면 전역변수의 사용을 자제하는 것이 좋고, 동시에 단일 객체가 너무 비대해지지 않도록 적절하게 규모를 쪼개는 것도 중요하다.