코린이의 소소한 공부노트

스태틱/인스턴스 메서드 본문

Java

스태틱/인스턴스 메서드

무지맘 2022. 3. 7. 14:05

변수는 선언 위치에 따라 클래스 변수(cv), 인스턴스 변수(iv), 지역 변수(lv)로 나눠졌다. 메서드도 어떤 것을 기준으로 2가지로 나눠지는데, 기준이 무엇일지 읽어보면서 유추해보자.

 

메서드는 스태틱 메서드와 인스턴스 메서드로 나눠진다. 아래 예시 코드를 본 후 설명을 읽어보자.

class Mathfunc {
	int a, b; // iv
	
	int add() { // im
		return a+b; // iv
	}
	
	static int add(int a, int b) { // cm
		return a+b; // lv
	}
}

public class Test{
    public static void main(String args[]) {
    // 1) 스태틱 메서드 사용
        System.out.println(Mathfunc.add(30, 9)); // 39
    // 2) 인스턴스 메서드 사용
        Mathfunc mf = new Mathfunc(); // 인스턴스 생성
        // iv 초기화
        mf.a = 20;
        mf.b = 7;
        System.out.println(mf.add()); // 27
    }
}

1. 스태틱 메서드(static method, sm) = 클래스 메서드(class method, cm)

  - static + 메서드

  - 인스턴스 멤버(iv, im)와 관련 없는 작업을 하는 메서드

  - 객체를 생성하지 않고 호출 가능

  - 호출방법: 클래스이름.메서드이름() -> Mathfunc.add(30, 9);

  - 메서드 내에서 인스턴스 변수 사용 불가 -> 작업에 필요한 값을 매개변수로 받음

2. 인스턴스 메서드(instance method, im)

  - 일반적인 메서드

  - 인스턴스 멤버와 관련된 작업을 하는 메서드

  - 인스턴스 생성 후 호출 가능

  - 호출방법: 참조변수.메서드이름() -> mf.add();

  - 메서드 내에서 인스턴스 변수 사용 가능 -> 매개변수가 필요 없음

두 메서드는 결국 인스턴스 변수 사용 여부를 기준으로 구분이 되는 것이다.

 

[static을 붙이는 경우]

1. 변수: 해당 클래스로 생성하는 모든 객체가 공통적으로 갖는 속성(멤버 변수)일 경우 -> 클래스 변수

  - 각 객체의 개별값은 인스턴스 변수(iv) -> static X

교내 학급별 성비 (객체 = 학생) 트럼프 카드 (객체 = 카드)
클래스 변수 인스턴스 변수 클래스 변수 인스턴스 변수
학교 이름 학년, 반, 이름, 성별 등 카드의 가로, 세로 무늬, 숫자

2. 메서드: iv, im을 사용하지 않는 메서드일 경우 -> 스태틱 메서드 or 클래식 메서드

  - iv, im을 사용하는 메서드는 im -> static X

 

static을 붙이는 기준이 변수와 메서드가 다르다. 스태틱 메서드는 객체 생성 없이 호출이 가능하다. 그래서 객체 생성 후 사용할 수 있는 iv, im이 스태틱 메서드 구현부에 있다면 컴파일러는 에러를 낸다. 왜냐면 스태틱 메서드가 호출됐을 때 객체가 생성되어있다는 보장이 없기 때문이다. 아래 코드를 보면서 위의 내용을 상기시켜보고, 꼭 이해할 수 있도록 노력해보자.

// iv, cv, im, cm

class Test{
	int iv; // 객체 생성 후 사용 가능
	static int cv; // 언제나 사용 가능
	
    // im에서 iv, cv 사용 여부 확인
	void instanceMethod() {
		System.out.println(iv); // OK
		System.out.println(cv); // OK
	}
	
    // cm에서 iv, cv 사용 여부 확인
	static void staticMethod() {
		System.out.println(iv);	// error: Cannot make a static reference to the non-static field iv
		System.out.println(cv); // OK
	}	
	
    // im에서 im, cm 사용 여부 확인
	void instanceMethod2() {
		instanceMethod(); // OK
		staticMethod(); // OK
	}
	
    // cm에서 im, cm 사용 여부 확인
	static void staticMethod2() {
		instanceMethod(); // error: Cannot make a static reference to the non-static method
		                  // instanceMethod() from the type Test
		staticMethod(); // OK
	}
}

 

어느 정도 숙지가 됐다면, 다음 자문자답을 보면서 다져보도록 하자.

1. 스태틱 메서드에서 사용 가능한 것은? sm, cv

  why? 스태틱 메서드와 클래스 변수는 객체 생성 없이 사용할 수 있기 때문

2. 스태틱 메서드에서 사용이 불가한 것은? im, iv

  why? 스태틱 메서드 호출 시 객체가 생성됐다는 보장이 없기 때문

3. 인스턴스 메서드에서 사용 가능한 것은? sm, cv, im, iv

  why? 인스턴스 메서드를 사용한다는 것은 객체가 생성된 것을 의미하므로 sm, cv는 물론 im, iv까지 사용 가능

4. sm과 im 중 매개변수가 필요 없는 것은? im

  why? im은 iv를 사용할 수 있기 때문. sm은 iv 사용을 할 수 없으므로 필요시 매개변수를 받아야 함

5. 내가 만든 메서드는 static을 붙일지 말지를 어떻게 결정하지?

  -> 메서드가 iv, im을 사용하지 않는다면 static을 붙여 메서드 선언

'Java' 카테고리의 다른 글

생성자  (0) 2022.03.12
메서드 오버로딩  (0) 2022.03.09
메서드의 매개변수  (0) 2022.03.06
메서드의 호출 스택  (0) 2022.03.05
메서드의 생성(선언)과 사용(호출)  (0) 2022.03.04