일단 시작해보는 블로그

[Java] 정적 변수와 메소드 (static) 본문

개발/Java

[Java] 정적 변수와 메소드 (static)

Selina Park 2019. 8. 8. 17:22

static은 보통 변수나 메소드 앞에 붙여서 사용하게 된다.

static 키워드를 붙이면 자바는 메모리 할당을 딱 한번만 하게 되어 메모리 사용에 이점을 볼 수 있게된다.

 

1. 객체를 선언함에 있어서 메모리를 한번만 할당한다.

public class HousePark  {
    String lastname = "박";

    public static void main(String[] args) {
        HousePark pey = new HousePark();
        HousePark pes = new HousePark();
    }
}

위의 예제의 lastname은 클래스 HousePark의 속성이므로 pey, pes와 같은 객체가 생성될 때마다 메모리를 각각 할당해주게 된다. (lastname의 값은 모든 객체에서 동일하게 'park'인데..!)

 

이런 상황에서 lastname을 static변수로 선언해주면 메모리 할당을 딱 한번만 하게 되어 메모리 사용에 이점을 볼 수 있게 된다.

public class HousePark  {
    static String lastname = "박";

    public static void main(String[] args) {
        HousePark pey = new HousePark();
        HousePark pes = new HousePark();
    }
}

 

 

...더보기

만약, HousePark 클래스의 lastname이 변경되지 않기를 바란다면 static 키워드 앞에 final이라는 키워드를 붙이면 된다.

한번 설정되면 그 값을 변경하지 못하게 하는 기능이 있고, 변경하려면 예외가 발생한다.

 

 

2. 한번 설정하면 같은 곳의 메모리 주소만 바라보기 때문에 static변수의 값을 공유하게 된다.

 

웹 사이트 방문시바다 조회수를 증가시키는 Counter 프로그램이 다음과 같이 있다고 가정해보면

public class Counter {
	int count = 0;
    Counter() {
    	this.count++;
        System.out.println(this.count);
    }
    
    public static void main(String[] args) {
    	Counter c1 = new Counter();
        Counter c2 = new Counter();
    }
}


// 결과
// 1
// 1

  위의 예제는 c1, c2 객체 생성시 count 값을 1씩 증가하더라도 c1.count 와 c2의 count는 서로 다른 메모리를 가리키고 있기 때문에 원하던 결과가 나오지 않음. 객체 변수는 항상 독립적인 값을 갖기 때문에 당연한 결과이다.

 

public class Counter  {
    static int count = 0;
    Counter() {
        this.count++;
        System.out.println(this.count);
    }

    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
    }
}

//결과
// 1
// 2

count변수를 static 으로 선언해줌으로써 객체 사이에서 속성값인 count의 메모리주소를 공유하게 됌. 즉, 한 클래스내의 모든 객체들이 같은 메모리에 있는 변수를 가져다가 쓰게된 것.

 

 

staic method

static이라는 키워드가 메소드 앞에 붙으면 클래스를 통해 호출할 수 있게 된다.

public class Counter  {
    static int count = 0;
    Counter() {
        this.count++;
    }

    public static int getCount() {
        return count;
    }

    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();

        System.out.println(Counter.getCount());
    }
}

...더보기
 ** static 메소드 안에서는 인스턴스 변수 접근이 불가능하다. static 변수는 접근 가능.

static 메소드는 보통 유틸리티 성 메소드(오늘의 날짜 구하기, 숫자에 콤마 추가하기 등)를 작성할 때 많이 사용된다.

 

 

 

https://wikidocs.net/228

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

'개발 > Java' 카테고리의 다른 글

[Java] HashMap  (0) 2019.08.21
[Java] 문자열 포맷 - String.format(), System.out.printf()  (0) 2019.08.20
[Java] call by value  (0) 2019.08.08
[Java] 메소드  (0) 2019.08.08
[Java] Scanner, 입출력 클래스  (0) 2019.08.05
Comments