인스턴스 메서드(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의-차이
'JAVA' 카테고리의 다른 글
[JAVA] 생성자(기본 생성자, 매개변수 있는 생성자, 주의할 점) (0) | 2024.04.18 |
---|---|
[JAVA] 클래스, 객체, 인스턴스(인스턴스 생성 및 사용) (0) | 2024.04.17 |
[JAVA] 메서드(리턴 타입의 유무, 매개변수 유무), 지역변수 (0) | 2024.04.17 |
[JAVA] 메서드의 return문(형식, 특징, 주의할 점) (0) | 2024.04.17 |
[JAVA] 배열 관련 메서드(equals, toString, sort) (0) | 2024.04.17 |