본문 바로가기
JAVA

[JAVA] instance 메서드, static 메서드

by 정공자씨 2024. 4. 17.

 

인스턴스 메서드(Instance Method)

 

정의

  • 객체를 생성해야 사용할 수 있는 메서드
  • 즉, 이 메서드를 호출하기 위해서는 메서드가 정의되어 있는 클래스로 객체를 생성해야 함

 

메모리 할당

  • 인스턴스 메서드는 컴파일 과정에서 MetaSpace 메모리 영역에 담김
  • 메서드 내의 지역 변수, 파라미터, 반환 값은 stack 메모리 영역에 할당

 

특징

  • 인스턴스 변수(iv)와 관련된 작업을 함
  • 즉,  메서드가 작업을 수행하는데 인스턴스 변수를 사용함
  • 인스턴스 메서드를 사용할 때는, 클래스로 객체를 생성하고 그 객체를 통해서만 호출이 가능 
    • (예) [Multiply] 라는 이름의 클래스에 선언된 인스턴스 메서드[add()]를 사용할 때
    • Multiply mm = new Multiply( );     →  클래스로 객체 생성(new 연산자 사용)
    • mm.add()       →    add 메서드 호출
  • 참조변수(mm)는 메모리가 할당 되어 있는 곳의 주소를 담고 있기 때문에, 메서드를 호출하면 메모리 주소를 통해 메서드를 호출
  • 인스턴스 메서드는
    • static 메소드 호출 가능
    • 다른 인스턴스 메소드를 호출 할 수 있다

 

예제

class Multiply{	
	int a, b; 
	
	// 인스턴스 메서드
	int add() { 
		return a+b;
	}
	int subtract() {
		return a-b;
	}
	
	// 정적 메서드(static이 있음)
	static int staticAdd(int a, int b) {
		return a+b;
	}
	static int staticMinus(int a, int b) {
		return a-b;
	}	
}


public class MyMath {
	public static void main(String[] args) {
	
        Multiply mm = new Multiply(); // 클래스(Multiply)로 객체 생성(new연산자로 생성)
        mm.a = 20; // 변수에 값 초기화
        mm.b = 10;

        System.out.println(mm.a); // a = 20
        System.out.println(mm.b); // b = 10

        System.out.println(mm.add()); // 30
        System.out.println(mm.subtract()); // 10		
	}
}

 

① 인스턴스 변수(a, b)에 접근하여 변수 초기화

  • mm.a = 20 (multiply 클래스의 변수 a의 값 = 20)
  • mm. b = 10 (multiply 클래스의 변수 b의 값 = 10)

 

② 메서드의 작업을 수행(add, substract 메서드)하는데, 인스턴스 변수(a, b)를 필요로 함

 

 

③ 클래스로 객체를 생성하여 사용 시에, 인스턴스 변수, 인스턴스 메서드, 정적 메서드 접근 가능

 

 

 

 

 

정적 메서드(static method)

 

정의

  • 클래스로 객체를 생성하지 않아도 호출이 가능한 메서드
  • 메서드가 정의되어 있는 클래스 이름이나 생성된 객체 통해 호출할 수 있음
    • 호출 형식 : 클래스이름.정적메서드이름
  • 인스턴스 변수나 인스턴스 메서드를 사용하지 않는( 인스턴스와 관계 없는 ) 메서드
static void staticMeth() {

}

 

 

메모리 할당

  • 정적 메서드가 정의된 클래스와 함께, 컴파일 과정에서 Metaspace라는 메모리에 할당
  • 정적 메서드 내의 파라미터, 지역변수, 반환 값은 stack 메모리 영역에 할당

정적 메서드가 클래스와 함께 메모리에 할당된 이후에는 클래스로 객체를 생성할 필요 없이, 정적 메서드 호출 가능

 

 

 

특징

  • 인스턴스 변수(iv)와 관련 없는 작업을 함
    • 따라서, 메서드 내에서 인스턴스 변수를 사용할 수 없음
  • 정적 메서드는 메서드가 정의된 클래스에 속해있는 것으로 취급
    • 따라서, 별도의 객체를 생성할 필요 없이
    • 클래스명을 참조하여 호출할 수 있음
  • 정적 메서드는
    • 다른 정적 메소드를 호출할 수 있음
    • 인스턴스 메소드를 호출할 수 없음(불가)
  • 정적 메소드는 오버라이드(Override)될 수 없음
    • 컴파일 과정에서 메서드 타입이 정해짐 → 정적 바인딩(static binding)

 

 

예제

class Multiply{	
	int a, b; 
	
	// 인스턴스 메서드
	int add() {
		return a+b;
	}
	int subtract() {
		return a-b;
	}
	
	// 정적 메서드
	static int staticAdd(int a, int b) {
		return a+b;
	}
	static int staticMinus(int a, int b) {
		return a-b;
	}	
}


public class MyMath {
	public static void main(String[] args) {
		// 정적메서드 호출: 클래스명.정적메서드명
		System.out.println(Multiply.staticAdd(10,20)); // 30
		System.out.println(Multiply.staticMinus(20,10)); // 20						
	}	
}

 

 

① 객체를 생성하지 않고서, 클래스이름으로 정적 메서드를 접근할 수 있음

 

 

 

 

 

 

 

 

출처

https://ykh6242.tistory.com/entry/Java-인스턴스-메소드instance-methods와-정적-메소드static-methods의-차이