본문 바로가기

언어 기초/JAVA

[자바의정석 | Chapter 06 객체지향 프로그래밍1] 클래스 메서드와 인스턴스 메서드

1. 학습목표

클래스 메서드와 인스턴스 메서드를 이해할 수 있다.

2.필요 개념 문장정리

클래스 메서드와 인스턴스 메서드

  • 메서드 앞에 static이 붙어 있으면 클래스메서드이고 붙어 있지 않으면 인스턴스 메서드이다.
  • 클래스 메서드도 객체를 생성하지 않고도 클래스이름.메서드이름(매개변수)로 호출이 가능하다. 인스턴스 메서드는 반드시 객체를 생성해야만 호출할 수 있다.
  1. 클래스를 설계할 때 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
  2. 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
  3. 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
  4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.
  • 같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다.
  • 클래스멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우에는 인스턴스를 생성해야 한다.
  • 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만 클래스멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있기 때문이다.
  • 같은 클래스 내의 메서드는 서로 객체의 생성이나 참조변수 없이 직접 호출이 가능하지만 static메서드는 인스턴스 메서드를 호출할 수 없다.
  • 메서드간의 호출과 만찬가지로 인스턴스 메서드는 인스턴스변수를 사용할 수 있지만 static메서드는 인스턴스변수를 사용할 수 없다.

 3. 코드작성

class MemberCall {
	int iv = 10;
    static int cv = 20;
    
    int iv2 = cv;
    static int cv2 = iv; // 에러. 클래스변수는 인스턴스 변수를 사용할 수 없음.
    static int cv2 = new Mwmbercall().iv; // 이처럼 객체를 생성해야 사용가능.
    
    static void staticmethod1() {
    	System.out.println(cv);
        System.out.println(iv); //에러. 클래스메서드에서 인스턴스변수를 사용불가.
        membercall c = new MemberCall();
        System.out.println(c.iv); // 객체를 생성한 후에야 인스턴스변수의 참조가능.
    }
    void instanceMethod1() {
    	System.out.println(cv);
        System.out.println(iv); // 인스턴스메서드에서는 인스턴스변수를 바로 사용가능.
    }
    static void staticMethod2() {
    	staticMethod1();
        instanceMethod1(); //에러. 클래스메서드에서는 인스턴스메서드를 호출할 수 없음.
        MemberCall c = new MemberCall();
        c.instanceMethod1(); // 인스턴스를 생성한 후에야 호출할 수 있음.
    }
    void instanceMethod2() { //인스턴스메서드에서는 인스턴스메서드와 클래스메서드 모두 인스턴스 생성없이 바로 호출이 가능.
    	staricMeethod1();
        instanceMethod1(); 
    }
}

 

  • 클래스멤버는 언제나 참조,호출이 가능하기 떄문에 인스턴스멤버가 클래스멤버를 사용가능하다. 클래스멤버간 참조,호출도 가능
  • 인스턴스멤버는 반드시 객체를 생성한 후에만 참조, 호출이 가능하다.
  • 실제로 같은 클래스 내에서 클래스멤버가 인스턴스멤버를 참조,호출해야하는 경우는 드물다. 인스턴스메서드로 작성해야할 메서드를 클래서메서드로 한것은 아닌지 확인해봐야한다. 

4. 마무리

클래스 멤버와 인스턴스 멤버를 구분하고 객체를 생성하여 사용하는 것을 이해할 수 있었다. 

 

MemberCall c = new Membercal();

int result  = c.instanceMethod1();

 다음과 같이 한 줄로 할 수 있다.

int result = new MemberCall().instanceMethod1();

대신 참조변수를 선언하지 않았기 때문에 생성된 MemberCall인스턴스는 더 이상 사용할 수 없다.

 

주어진 코드에서 MemberCall c = new MemberCall();와 int result = new MemberCall().instanceMethod1();은 동일한 작업을 수행합니다. 그러나 참조 변수를 선언하지 않고 직접적으로 인스턴스를 생성하면, 생성된 인스턴스에 대한 참조를 따로 유지할 수 없게 됩니다.

  1. MemberCall c = new MemberCall();: 이 코드는 MemberCall 클래스의 새로운 인스턴스를 생성하고, 이를 c라는 참조 변수에 할당합니다. 이렇게 하면 c를 통해 생성된 인스턴스에 접근할 수 있습니다.
  2. int result = new MemberCall().instanceMethod1();: 이 코드는 MemberCall 클래스의 새로운 인스턴스를 생성하고, 바로 해당 인스턴스의 instanceMethod1() 메소드를 호출하여 결과를 result 변수에 할당합니다. 이 코드에서는 참조 변수를 사용하지 않고 직접 인스턴스를 생성하므로, 생성된 인스턴스에 대한 참조를 따로 유지할 수 없습니다.

따라서, 두 번째 코드에서는 new MemberCall()를 통해 생성된 인스턴스에 대한 참조 변수가 없기 때문에, 이 인스턴스는 한 번의 사용 이후에는 더 이상 참조되지 않으며, Java의 가비지 컬렉터에 의해 메모리에서 제거될 것입니다. 이는 임시적으로 사용되는 인스턴스에 대한 간단한 작업을 수행할 때 유용할 수 있습니다.