[JAVA] 클래스 메서드 vs 인스턴스 메서드

2017. 11. 21. 01:26개발/JAVA

반응형

static이 붙으면 클래스 메서드라 불르고, 붙어 있지 않으면 인스턴스 메서드라 부른다.


클래스 메서드는 객체를 생성하지 않고도 클래스이름.멤버변수 형태로 호출이 가능하다.


하지만 인스턴스 메서드의 경우에는 객체를 생성해야지만 호출할 수 있다.



간단한 예제로 확인!


1. 클래스 메서드를 호출하는 방법 -> 클래스이름.메서드명 형태로 호출


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test {
    public static void main(String args[]) {
        System.out.println(staticIns.st_show());
    }
    
    static class staticIns {
        int a=10;
        static int b = 20;
        int show() {
            return a;
        }
        static int st_show() {
            return b;
        }
    }
}
 
cs



2. 인스턴스 메서드를 호출하는 방법 -> 객체를 생성후 메서드 호출


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test {
    public static void main(String args[]) {
        System.out.println(new staticIns().show());
    }
    
    static class staticIns {
        int a=10;
        static int b = 20;
        int show() {
            return a;
        }
        static int st_show() {
            return b;
        }
    }
}
 
cs





여기서 의문점이 들 수 있다. 만약 객체를 생성한 후 클래스 메서드를 호출할 경우 어떤일이 벌어질까?



실행은 원하는 결과물을 받아볼 수 있다. 하지만 Eclipse 의 Warning Message에는 st_show는 클래스 메서드이므로 static 방법으로 접근하라고 한다.

객체를 생성하게 되면 힙영역에 메모리를 할당하는데 굳이 메모리가 할당되어있는 클래스 메서드를 힙영역에 재할당해줄 필요가 없기때문이다. (자원 낭비로 인해 바꾸라고 추천하는듯 하다.)




그렇다면 객체를 생성하지 않고, 인스턴스 메서드를 호출하면 어떤일이 벌어질까?


이번에는 Warning이 아닌 Error Message를 뿜어낸다.

클래스 메서드가 아닌 인스턴스 메서드 show()는 static 레퍼런스로 만들어질 수 없다고 한다.





즉, 인스턴스 멤버, 메서드를 사용하기 위해서는 꼭 객체의 생성이 필요하고, 클래스 멤버, 메서드는 객체의 생성후 사용대신 직접 접근하여 사용하는 것을 권장한다.






클래스 메서드와 인스턴스 메서드를 구분하여 사용하려면 다음 규칙을 한번 생각해보는것이 좋다.


1. 멤버 변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다.

2. 클래스변수는 인스턴스를 생성하지 않아도 사용가능하다.

3. 클래스 메서드는 인스턴스변수를 사용할 수 없다. (중요 - 클래스 메서드를 사용할때 인스턴스 변수가 힙영역이 있는지 없는지 모르기때문)

4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려하자.







참고자료 : 자바의 정석




반응형