클래스 변수는 클래스 내에 정의된 변수에 static을 선언해 주면 '클래스 변수' 가 된다. 이와 동일한 방법으로 클래스 내의 메소드에 대해서 static선언을 해주면 '클래스 메소드'가 된다. 클래스 메소드와 클래스 변수는 매우 유사하디. 접근 방법도 동일하고 인스턴스 생성 이전에 호출이 가능하며, 어떠한 인스턴스에도 소속되어 있지 않다는 점 또한 동일하다. 클래스 변수의 특징은 다음과 같았다.
1 . 인스턴스 생성 이전부터 접근이 가능하다.
2 . 어떠한 인스턴스에도 소속되어있지 않다.
클래스 메소드 또한 이와 동일한 특성을 가진다. 우선 예시를 보면서 메소드 호출을 살펴보자.
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 | class clmeth{ private int q = 0; static void show(int a) { System.out.println(a); } static void showd(double b) { System.out.println(b); } void set(int v) { q = v; } void show() { System.out.println(q); } } class ma{ public static void main(String[] args) { clmeth.show(10); clmeth qw = new clmeth(); qw.show(90); qw.showd(10.33); qw.set(90); qw.show(); } } | cs |
우선 23번째 줄을 살펴보자. clmeth.show(10)이라고 되어있다. 이 부분을 보면 단지 클래스 이름을 통해서 클래스 메소드에 접근하는것을 볼 수 있다. 이는 즉 다시 한번 클래스 메소드가 어떠한 인스턴스에도 소속되어있지 않다는것을 말해준다. 클래스 변수와 비교하자면 클래스 변수 또한 클래스 명을 통해서 접근이 가능했었다. 클래스 메소드 또한 클래스 명을 통해 접근이 가능하다는 것이다. 또한 25번줄부터 29번줄까지의 문장을 볼 수 있듯이, 인스턴스를 생성한 후에 접근을 할 수 도 있다.
그렇다면 클래스 메소드는 어떤 경우에 정의해주는것이 좋은것일까? 우선 두가지의 코드를 비교해 보자.
1 .
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 | class cal2{ static final double pi = 3.14; double add(double a, double b) { return a+b; } double min(double a, double b) { return a - b; } double width(double a) { return a*a*pi; } double length(double a) { return 2 * a * pi; } } class ma{ public static void main(String[] args) { cal2 qw = new cal2(); System.out.println("3 + 10 = " + qw.add(3, 10)); System.out.println(qw.width(10)); System.out.println("20 - 5 = " + qw.min(20, 5)); System.out.println(qw.length(10)); } } | cs |
2 .
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 | class cal { static private double pi = 3.14; static double add(double a, double b) { return a + b; } static double min(double a, double b) { return a - b; } static double width(double a) { return a*a*pi; } static double length(double a) { return a*2*pi; } } class ma{ public static void main(String[] args) { System.out.println("3 + 4 = " + cal.add(43,4)); System.out.println(cal.width(10)); System.out.println("10 - 2 = " + cal.min(10, 2)); System.out.println(cal.length(9)); } } | cs |
우선 1번 코드부터 살펴보자. 1번 코드에서 ma클래스를 살펴보면 우선 cal 클래스에 대한 인스턴스를 생성한 다음 인스턴스를 통한 접근을 한다. cal2클래스는 결론적으로 ma클래스에서 연산하고자 하는 값을 매개변수로 준것에 대한 반환값을 내보내 주는 기능을 하는 클래스이다. 결론적으로 말하면 이 cal2라는 클래스는 굳이 인스턴스 안에 소속되어 있을 필요는 없다는 것이다. 그런 점을 보안하여 재작성한 코드가 2번 코드이다. 2번코드가 1번코드와 다른것은 우선 cal클래스 부분에 static선언을 해주어 클래스 변수를 만들어주고, 결과값 출력 부분에서 인스턴스를 생성하지 않고 클래스 메소드 및 변수의 속성중 하나인 클래스 명으로 접근하는 것을 이용해서 결과값 출력하는것을 볼 수 있다. 결론적으로 클래스 메소드를 선언하는 것이 좋은 경우는 굳이 인스턴스의 생성이 필요 없을 경우에 작성해 주면 좋은것이다.
자바를 하면서 헷갈리면 안되는 부분에 대해 하나 짚고 넘어가보자. 그렇다면 클래스 메소드는 인스턴스 변수에 접근이 가능한 것인가? 예시로 다음 코드가 있다고 가정해 보자.
1 2 3 4 5 6 | class a{ int num = 0; static void add(int n) { num += n; } } | cs |
과연 이 코드에서 4번째 줄은 제대로 오류없이 수행이 될까? 결론적으로 말하면 접근이 불가능하다. 그 이유는 인스턴스 변수는 인스턴스 안에 속해져 있어야되며, 무엇보다 더 중요한것은 인스턴스가 생성 된 후 메모리 내에 존재하는 것이다. 하지만 위에서도 말했지만 클래스 변수 및 클래스 메소드는 인스턴스를 생성하기 전부터 호출할 수 있다. 해당 질문에 대한 정리를 해보자면 다음과 같다.
클래스 메소드는 어떠한 인스턴스 내에 소속되어있지 않는 메소드이므로 인스턴스 변수에 접근이 불가능하다.
클래스 메소드는 대신 자신과 동일한 특성을 지닌 클래스 변수나 클래스 메소드에 접근이 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class a{ static int num = 0; static void add() { System.out.println(num); } static void min(int n) { num += n; } static void q() { a.min(10);//동일한 클래스 내의 클래스 메소드 이므로 클래스 명 혹은 인스턴스 명을 통한 참조를 할 필요가 없다. a.min(49); a.add(); } } | cs |
'Language > Java' 카테고리의 다른 글
메소드 오버로딩(Method Overloading) (0) | 2019.03.05 |
---|---|
public static void main(String[] args)의 의미 (0) | 2019.02.24 |
static을 붙여 선언한 클래스 변수 (0) | 2019.02.21 |
Java JDK, Eclipse 설치 링크 (0) | 2019.02.20 |
캡슐화(Encapsulation) (0) | 2019.02.20 |