인스턴스 멤버에는 인스턴스 변수, 인스턴스 메소드 이 두가지가 존재하였다. 그중 인스턴스 변수는 인스턴스를 생성하게 되면 생성하는 변수를 의미한다. 만약 '클래스 변수' 라고 한다면 이는 당연히 클래스가 생성되면 생성되는 변수를 의미할 것이다. 이번에는 클래스 변수에 대해 살펴보고자 한다.
클래스 내 선언된 변수 앞에 'static'이라는 키워드를 붙이게 되면 '인스턴스 변수'가 아닌 '클래스 변수'가 된다. 예시코드와 결과값을 한번 살펴보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class clasv { static int a = 0; clasv() { a += 1; System.out.println("인스턴스 총 개수 :" + a); } } class ma{ public static void main(String[] args) { clasv a = new clasv(); clasv b = new clasv(); clasv c = new clasv(); } } | cs |
해당 코드를 해석해 보면 clasv 클래스의 생성자는 인스턴스 하나가 만들어 질 때 마다 클래스 변수 a의 값을 하나씩 증가시키는 기능을 한다는 것을 볼 수 있다, 하지만 하나 수상한 점을 볼 수 있다. clasv클래스에 대해 인스턴스 a,b,c 를 생성 하였고 각각의 독립적인 인스턴스인데 최종적인 c에 대한 출력값을 보면 인스턴스 개수가 총 3개라고 출력되는것을 볼 수 있다. 이말은 즉슨
클래스 변수는 해당 변수가 선언된 클래스의 모든 인스턴스가 함께 공유되는 변수
라는 것이다.
또 하나 클래스 변수에 대한 사실은 클래스 변수는 어떠한 인스턴스에도 속하지 않은 상태에서 메모리 공간에서 하나만 존재하는 변수라는 것이다. 클래스 변수 또한 앞에서 보았던 접근 수준 지시자에 영향을 받기에 public으로 하면 해당 패키지 이외 다른 패키지에서도 참조가 가능해 진다.
그렇다면 클래스 변수에 접근하기 위해서는 어떻게 해야할까? 클래스 변수에 접근한는 방법은 두가지가 존재한다.
1 . 내부접근 : 변수 이름을 통한 접근
2 . 외부접근 : 클래스명 혹은 인스턴스 명을 통한 접근
클래스 변수 접근에 대한 예제 코드를 한번 살펴보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class getclvar { static int num = 0; getclvar(){ access(); } void access() { num ++; } } class ma{ public static void main(String[] args) { getclvar a = new getclvar(); a.num += 1; //외부의 인스턴스 이름을 통한 접근 getclvar.num += 1; //외부의 클래스의 이름을 통한 접근 System.out.println("number : " + getclvar.num); } } | cs |
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 | class circle{ static final double pi = 3.14; private int rad; circle(int r) { rad = r; } void length() { double leng = (rad * 2) * pi; System.out.println("length : " + leng); } void width() { double wid = (rad * rad) * pi; System.out.println("width : " + wid); } } class circleinfo{ public static void main(String[] args) { circle a = new circle(6); a.length(); a.width(); } } | cs |
'Language > Java' 카테고리의 다른 글
public static void main(String[] args)의 의미 (0) | 2019.02.24 |
---|---|
Class Method (0) | 2019.02.23 |
Java JDK, Eclipse 설치 링크 (0) | 2019.02.20 |
캡슐화(Encapsulation) (0) | 2019.02.20 |
접근 수준 지시자(Access-level Modifier) (0) | 2019.02.20 |