본문 바로가기
Java/Basic

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

by 최로이 2021. 3. 19.

1. 클래스 메소드: static이 붙어 있는 메소드

 

클래스 메소드도 클래스변수처럼 객체를 생성하지 않고도 호출이 가능하다.

 

1) 형태: 클래스명.메소드명(매개변수)

2) 사용시기와 정의

  :: 메소드 중에서 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메소드를 사용하지 않는) 메소드를 클래스 메소드(static메소드)로 정의한다. 그렇다고 인스턴스 변수를 사용하지 않는다고 해서 반드시 클래스 메소드로 정의하는 것은 아니지만 특별한 이유가 없는 한 그렇게 하는 것이 일반적이다.

**클래스 영역에 선언된 변수를 멤버변수라고 하는데 이중 static이 붙은 것은 클래스변수(static변수), static이 붙지 않은 것은 인스턴스변수라고 한다. 멤버변수는 인스턴스 변수와 static 변수를 모두 통칭하는 말이다.

3) 특이사항

① 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다.

-생성된 각 인스턴스는 서로 독립적이기 때문에 각 인스턴스의 변수(iv)는 서로 다른 값을 유지한다. 그러나 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여서 클래스 변수로 정의해야 한다.

 

② 클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.

-static이 붙은 변수(클래스변수)는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문.

 

③ 클래스 메소드(static메소드)는 인스턴스 변수를 사용할 수 없다.

-인스턴스변수는 인스턴스가 반드시 존재햐야만 사용할 수 있지만 클래스메소드는 인스턴스 생성 없이 호출 가능하므로 클래스 메소드가 호출 되었을 때 인스턴스가 존재하지 않을 수도 있다. 그래서 클래스 메소드에서 인스턴스변수의 사용을 금지한다.

-반면에 인스턴스변수나 인스턴스 메소드에서는 static이 붙은 멤버들을 사용하는 것이 가능하다. 인스턴스변수가 존재한다는 것은 static변수가 이미 메모리에 존재한다는 것을 의미하기 때문이다.

 

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

-메소드의 작업내용 중에서 인스턴스변수를 필요로 한다면 static을 붙일 수 없다. 반대로 인스턴스변수를 필요로 하지 않는다면 static을 붙이면 된다. 메소드 호출시간이 짧아지므로 성능이 향상되기 때문이다. static을 붙이지 않은 메소드(인스턴스 메소드)는 실행 시 호출 되어야할 메소드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.

 

① 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야 하는 것이 있는지 보고 있다면 static을 붙인다.
② 작성한 메소드 중에서 인스턴스변수나 인스턴스 메소드를 사용하지 않는 메소드에 static을 붙이는 것을 고려한다.

 

2. 인스턴스 메소드: static이 붙어있지 않은 메소드

인스턴스 메소드는 인스턴스 변수와 관련된 작업을 하는, 즉 메소드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메소드다. 그런데 인스턴스 변수는 인스턴스(객체)를 생성해야만 만들어지므로 인스턴스 메소드 역시 인스턴스를 생성해야지만 호출할 수 있다.

 

클레스 메소드와 인스턴스 메소드의 특성을 코드로 비교해 보면 다음과 같다.

예제)

class MemberCall {
	int iv = 10;
	static int cv = 20;

	int iv2 = cv;
//	static int cv2 = iv;		// 에러. 클래스변수는 인스턴스 변수를 사용할 수 없음.
	static int cv2 = new MemberCall().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() {	// 인스턴스메서드에서는 인스턴스메서드와 클래스메서드
		staticMethod1();		//  모두 인스턴스 생성없이 바로 호출이 가능하다.
		instanceMethod1();
	}
}

 

'Java > Basic' 카테고리의 다른 글

변수의 초기화  (0) 2021.03.23
생성자(Constructor)  (0) 2021.03.23
기본형 매개변수, 참조형 매개변수  (0) 2021.03.19
JVM의 메모리 구조  (0) 2021.03.19
객체지향  (0) 2021.03.03

댓글