본문 바로가기

Developer/Java-oop

#004. Member변수(instance변수) 와 static변수(class변수) 알아보기...

#004. static변수(class변수) 와 static메소드(class메소드) 알아보기...

 

잡담: 앗. 이전강좌에서 이미 멤버 변수를 사용했었네요..^^;; 그래서 static메소드로 변경했답니다.

 

1. Member변수(instance변수)

객체를 생성할 때, 객체 안에 데이터를 담을 공간이다. 그 공간은 객체 별로 따로 관리가 된다. 이미 이전강좌에서 예제로 확인할 수 있다. (#003 강좌 참고..)

 

2. static변수(class변수)

객체를 생성하지 않고, 클래스명.변수명 으로 사용을 하며, 멤버변수와는 다르게 객체와 상관없이 관리된다. (아래 JVM이 관리하는 메모리 영역 참고)

oop 패키지에 StaticDemo Class 를 만들어 테스트 해보자.

코드

package oop;

public class StaticDemo {

    static int staticint;        //static 변수

    int memberint;            //member 변수

    String memberstr;        //member 변수

    public static void main(String[] args) {

        StaticDemo sd1 = new StaticDemo();

        sd1.memberint++; sd1.memberstr="SD1";

        StaticDemo.staticint++;

        System.out.println("멤버이름:" + sd1.memberstr

                + ", 멤버정수:" + sd1.memberint

                + ", 스태틱정수:" + StaticDemo.staticint);

        StaticDemo sd2 = new StaticDemo();

        sd2.memberint++; sd2.memberstr="SD2";

        StaticDemo.staticint++;

        System.out.println("멤버이름:" + sd2.memberstr

                + ", 멤버정수:" + sd2.memberint

                + ", 스태틱정수:" + StaticDemo.staticint);

    }

}

결과

멤버이름:SD1, 멤버정수:1, 스태틱정수:1

멤버이름:SD2, 멤버정수:1, 스태틱정수:2

설명

클래스 선언 바로 밑에 정의를 한다.

문장3: static 변수로, 객체와 상관없이 클래스명.스태틱변수로 사용이 가능하다.

ex) StaticDemo.staticint

결과1,2: sd1, sd2의 객체의 멤버들은 메모리가 각각 따로 관리되어, 값이 증감을 해도 따로 증가가 된다 (문장8,14) 그에 비해 static 변수는 공용변수로써 1씩 증가를 하는 것을 볼 수 있다. (문장9,15)

아래의 4. JVM의 메모리 할당내용을 보면 이해가 쉬울 것이다.

 

3. static메소드(class메소드)

static메소드는 static변수에만 접근이 가능하다. (역시 객체와는 상관이 없음.)

위 클래스에서 아래 내용으로 변경해본다.

코드

package oop;

public class StaticDemo {

    static int staticint;        //static 변수

    int memberint;            //member 변수

    String memberstr;        //member 변수

    static void view(){

        System.out.println("static view 호출: " + staticint );

    }

    public static void main(String[] args) {

        StaticDemo.staticint++; StaticDemo.view();

        StaticDemo sd1 = new StaticDemo();

        sd1.memberint++; sd1.memberstr="SD1";

        StaticDemo.staticint++; StaticDemo.view();

        System.out.println("멤버이름:" + sd1.memberstr

                + ", 멤버정수:" + sd1.memberint

                + ", 스태틱정수:" + StaticDemo.staticint);

        StaticDemo.staticint++; StaticDemo.view();

    }

}

결과

static view 호출: 1

static view 호출: 2

멤버이름:SD1, 멤버정수:1, 스태틱정수:2

static view 호출: 3

설명

클래스 정의 바로 밑에 작성을 한다. static 변수만 제어 가능하다.

문장6,8: static method 를 정의 및 기능을 구현했다.

문장11: 객체가 생성되기 전부터 문장10에서 static들을 사용하고 있다.

문장10,14,17: static변수를 증가하고, 출력하는 static메소드를 호출한다.

 

4. 위 내용을 보고 JVM이 메모리에 어떻게 할당하는지 확인해 보자.

명령어

클래스 영역

[static 영역]

(같은클래스1번)

메서드 영역(변수)

[stack 영역]

(heap영역을 참조)

객체 영역

[heap 영역]

(실제데이터공간)

StaticDemo.staticint++;

StaticDemo.class

StaticDemo.staticint

StaticDemo.view()

  

StaticDemo sd1 =

new StaticDemo ();

* 이미 로드 되어있음.

* static 변수, 메소드 이미 로드 되어있음.

sd1

 

* 오른쪽의 주소만 참조한다.

staticdemo (sd1)

membername="sd1"

memberint=1

StaticDemo sd2 =

new StaticDemo ();

* 이미 로드 되어있음.

* static 변수, 메소드 이미 로드 되어있음.

sd2

 

* 오른쪽의 주소만 참조한다.

staticdemo (sd2)

membername="sd2"

memberint=1

 

다음시간엔 메소드 중복정의 (method overloding) 에 대해서 알아보겠다.

 

잡담: 아.. 졸립다.. 오늘도 새벽 1시네요.. 흑흑..