티스토리 뷰

반응형

변수의 Scope와 static

변수가 선언된 블럭이 해당 변수의 사용범위이다

public class ValueScope{
    int global = 0;

    public int func(int val) {
        int local = 1;
    }
}
  • 클래스 속성의 변수
    • global 변수로서, ValueScope 전체 범위가 해당 변수의 Scope이다.
  • 매개변수로 선언된 변수
    • val 변수로서, func 메소드 블럭만이 해당 변수의 Scope이다.
  • 메소드 블럭 내에 선언된 변수
    • local 변수로서, 매개변수와 마찬가지로 func 메소드의 블럭만이 해당 변수의 Scope이다.

static

공유 자원이며, 객체가 인스턴스화 되지 않아도 호출하여 사용할 수 있는 특징을 가지고 있다.

좀 더 자세한 설명을 봐보자

  • 메모리 할당 지역 및 실행 시점

    • static의 메모리 할당 지역은 어디일까? 그곳은 바로 클래스 영역(메소드 영역)이다.
    • 그럼 왜 static은 객체가 인스턴스화 되지 않아도 사용이 가능하지?
      • 보통 프로그램이 실행하면 필요한 클래스가 JVM 메모리상에 로딩되는 과정을 거치게 된다. 그리고 한번 로딩된 클래스는 별 이상이 없지 않는 한, 객체를 생성할 수 있도록 메모리에 위치하게 된다. static은 이 시점에서 메모리에 올라가 동작 처리하는 것이다.
    • 그렇다면 왜 공유자원이 되는 것이지?
      • JVM 메모리상에 로딩이 되는 과정에서 static 뿐만 아니라, 클래스, 변수, 메소드, 상수 pool를 클래스 영역에 올라가 있고, 해당 영역은 모든 스레드가 공유하는 영역이기 때문이다.
  • 주 목적

    • 클래스를 설계할 때 다른 클래스에서도 자원을 공통적으로 사용하고자 할 때 static을 사용한다.
    • 만약 메서드 내에서 인스턴스 변수를 사용하지 않는다면, 해당 메서드를 static 메서드로 변경하는 것을 고려하는 것이 좋다.
      • why? static 메서드는 인스턴스 메서드보다 호출시간이 짧기 때문이다(인스턴스 메서드는 실행 할 때 호출되어야하는 메서드를 찾는 시간이 더 걸린다.)
  • static 주의

    • static 메서드를 사용할 때, 인스턴스 변수를 사용할 수 없다.

      • 인스턴스 변수 사용시 해당 인스턴스가 메모리에 올라가 있지 않으니깐!
    • 클래스 멤버와 인스턴스 멤버를 혼용하여 사용할 시 주의해야한다.

      class test{
          static int a = 10;
          int b = 20;
      
          static int c = b;    //에러 발생
          //c(클래스 멤버)가 할당 받는 b(인스턴스 멤버)는 인스턴스가 생성되어야지만 존재하는 값이기 때문이다.
      }
반응형

'Java > Java 기초' 카테고리의 다른 글

[Java 기초] 상속과 구성  (2) 2020.01.04
[Java 기초] 오버로딩  (0) 2020.01.03
[Java 기초] enum  (0) 2020.01.01
[Java 기초] 제네릭  (0) 2019.12.14
[Java 기초] 팩토리 메서드 패턴  (0) 2019.12.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함