#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시네요.. 흑흑..
'Developer > Java-oop' 카테고리의 다른 글
#006. 생성자(Constructor) 와 생성자오버로딩(Constructor Overloding) 알아보기... (0) | 2011.03.21 |
---|---|
#005. 메소드 중복정의 (method overloding) 알아보기... (0) | 2011.03.19 |
#003. Class 와 Instance... (0) | 2011.03.18 |
#002. Java 기본 다루기... (0) | 2011.03.17 |
#001. Eclipse java project / package / class 만들기... (0) | 2011.03.17 |