본문 바로가기
카테고리 없음

[Java] 11. 3가지 범위의 변수

by 슈퍼닷 2015. 1. 23.
반응형

자바에는 3가지 변수가 있다.

 

지역변수 , 멤버변수 , 전역변수가 있다.

 

지역변수는 같은 method 안에서만 존재하며 method가 끝나면 그 변수는 사라진다.

멤버변수는 같은 class 안에서 존재하므로 같은 member method 에서는 그 변수를 사용할 수 있다.

전역변수는 말그대로 전역에서 사용이 가능하다. 스크립트의 어디서든 이 변수는 사용이 가능하다.

 

지역변수를 보자.

 

public class VarTest{

 

public static void main(String args[])

{

xx xxx = new xx();

xxx.method();

System.out.println(x);
}

}

 

class xx

{

public void method()

{

int x=0;
}
}

 

위의 스크립트의 결과는 어떻게 될까 ?
에러가 발생할 것이다.

왜냐하면 int x 는 method () 라는 메소드 안의 지역변수 이기 때문이다.

이처럼 지역변수는 같은 메소드 안에서만 존재한다.

 

이제 멤버변수에 대해 보자.

 

 

public class VarTest {

int x = 0;

public static void main(String args[])

{

VarTest vt = new VarTest();

System.out.println(vt.x);
}

 

}

 

위의 스크립트의 결과는 0 이 출력 될 것이다.

왜냐하면 int x 는 멤버 변수이기 때문에 같은 class에서는 그 변수를 공유하기 때문이다.

 

이제 전역변수 ( static ) 에 대해서 보자.

 

static 이라는 수식어를 어디서 많이 보지 않았는가?
바로 public static void main (String args[]) 라는 main 메소드에서 보았을 것이다.

static에 대해 알아가면서 main의 구조가 왜이런지도 함께 알아가 보자.

public class VarTest {

int x=0; // instance 변수  ( object의 변수)

static int y = 3;

public static void main(String args[])

{

VarTest vt = new VarTest();

System.out.println(vt.x);

System.out.println(y) ;

// y 대신 vt.y 라고 해도 무관하다.
}

}

 

위의 스크립트는 에러가 뜨지않는다 . 왜냐하면 y라는 변수에서 에러가 뜰것같지만 static 이기 때문에 전역변수이다.

그러므로 그냥 y라고만 써도 된다.

그리고 static 변수는 class명.변수명 으로 변수의 호출이 가능하다.

 

그리고 instance 변수는 class 내에서 사라지지만 static 변수는 사라지지 않는다.

 

public class VarTest {

int x = 1;

static y = 1;

 

public static void main(String args[])
{
VarTest vt1 = new VarTest();

VarTest vt2 = new VarTest();

vt1.x++;

vt1.y++;

vt2.x++;

vt2.y++;
}

}

 

int x 와 y에는 각각 무슨 숫자가 들어가 있을까 ?
y에는 일단 3이 들어가 있을것이다.

x의경우 두 변수로 나뉜다. vt1.x 와 vt2.x 모두 2이다.

왜일까?

static변수는 전역변수이기 때문에 사라지지 않으므로 y의 값은 항상 증가된다.

그러나 int x는 instance 변수 이기때문에 오브젝트 vt1 과 vt2 내에서 따로 따로 존재한다.

그러므로 vt1.x 와 vt2.x 는 별개의 존재라고 생각해도 좋다.

 

static 메소드는 instance 변수를 참조를 하지못하지만 , instance 메소드는 static을 참조할수 있다.

 

public class VarTest {

int x = 1 ;

static int method()

{

return x;
}

int methods()

{

return x;
}

public static void main (String args[])

{

VarTest vt = new VarTest();

vt.method();  // error 발생

vt.methods() ; // error 가 발생하지 않는다.
}

}

 

 

위의 스크립트를 보자.

언뜻보면 error 가 발생하지 않을것 같지만 static 메소드는 instance 변수를 참조하지 못한다.

왜일까 ?

static 메소드는 instance 의 생성없이도 호출이 가능하다.

그안에서 instance 의변수를 사용하는 것은 말이 안된다.

왜냐하면  , instance 의 생성없이 static 메소드를 호출이 가능한데 ,  instance 변수는 instance 의 생성이 먼저이기 때문이다.

그러므로 instance를 생성해서 static 메소드를 호출한다고 한들  , instance 를 생성하지 않았을 때의 경우 에서는 실패하기 때문에 이 스크립트는 에러가 되는것이다.

두가지를 만족시키지 못하고 하나만 만족시키기에 error가 뜰 가능성을 배제하기위해 에러가 뜬다고 나는 생각한다.

 

main 메소드는 public static void main (String args[]) 의 구조이다.

 

왜 public 인가??
main 메소드는 main 이다. 프로그램의 중심이다. 그러므로 JVM 은 중심인 main 메소드를 실행할 것이다.

그렇기에 main 메소드는 어디서든 출력이 가능해야 된다. 그러므로 public 이 알맞다.

 

왜 static 인가??
static 은 전역 변수를 생성하는 키워드이다. 그리고 스크립트의 종료까지 살아있는 변수이다.

main 은 프로그램의 중심이라고 했다. 그렇기에 static 을 통해 프로그램의 중심인 main 메소드를 누군가 호출하기전에  미리 준비가 되어 있어야 하므로 , 메모리에 등록이 되있어야 하므로 static을 사용하게 되는것이다.

 

왜 void 인가??

main 은 프로그램의 중심이다. 이것은 값을 반환하지 않는다. 중심은 반환을하는 장소가아니라 반환받은 값을 이용하는 장소이다. 그렇기에  return 값이 없다. return 값이 없는 method 에는 우리는 이런 수식어를 붙여왔다.

바로 void 이다. 그렇기에 main 메소드에는 void가 붙어있다.

 

String args[] 는 무엇일까??

command line argument 이다.  커맨드 라인  ,즉 cmd 에 입력된 argument라고 생각하면 된다.

 

public class Test

{

public static void main(String args[])

{

System.out.println(String args[0]);
}
}

 

Test.class 를 실행할때 우리는 java Test 라고 사용했을 것이다.

java Test 1543 으로 Test.class를 실행 해봐라.

그러면 1543 이 출력될것이다. 왜일까 ?
cmd 에 입력된 인자는 String args[] 라는 배열에 저장된다.

그렇기에 String args[0] = 1543 이 되는것이다.

 

다음 글에서는 여러 수식어에대해 알아보자.

반응형

댓글