티스토리 뷰
# static 메서드와 인스턴스 메서드
메서드 앞에 static이 붙어 있으면 클래스 메서드이고, 붙어 있지 않으면 인스턴스 메서드이다.
또한 인스턴스 변수(iv)의 사용 여부에 따라 나눌 수 있다.
인스턴스 메서드(im)
- 인스턴스 메서드 호출 방법은 인스턴스 생성 후 , '참조 변수. 메서드 이름();'으로 호출한다.
- 인스턴스 메서드는 인스턴스 멤버(im, iv)와 관련된 작업을 하는 메서드이다.
- 메서드 내에서 인스턴스 변수(iv)를 사용할 수 있다.
- 인스턴스 메서드는 매개변수가 없으므로, 인스턴스 변수(iv)를 써서 값을 받는다.
static 메서드(클래스 메서드)
- static 메서드 호출 방법은 객체 생성 없이 '클래스 이름. 메서드 이름();'으로 호출한다.
→ 객체 생성을 안 하기 때문에 참조 변수 대신 클래스 이름을 쓰는 것이다.
- 인스턴스 멤버(iv,im)와 관련 없는 작업을 하는 메서드이다.
- 메서드 내에서 인스턴스 변수(iv) 사용이 불가하다.
- 작업에서 필요한 값은 매개 변수(입력 값)로 받는다.
* static은 언제 붙여야 할까?
- 속성 (멤버 변수) 중에서 공통 속성에 static을 붙인다.
- 메서드의 경우에는 인스턴스 멤버(iv, im)를 사용하지 않는 메서드에 static을 붙인다.
* static메서드 vs 인스턴스 메서드
Static 메서드 | 인스턴스 메서드 | |
인스턴스(객체) 생성 | 생성X | 생성O |
메서드 내에서 iv 사용 | 사용 불가 | 사용 가능 |
작업에 필요한 값을 받는 방식 | 매개 변수(입력 값) | 인스턴스 변수 사용 |
예제) stsic 메서드와 인스턴스 메서드
class MyMath2{
long a, b;
//인스턴스 메서드
long add() {return a + b;}
long subtract() {return a - b;}
long multiply() {return a * b;}
double divide() {return a / b;}
//static 메서드(클래스 메서드)
static long add(long a, long b) {return a + b;} //a,b는 지역변수
static long subtract(long a, long b) {return a - b;}
static long multiply(long a, long b) {return a * b;}
static double divide(long a, long b) {return a / (double)b;}
}
class Ex6_9 {
public static void main(String[] args) {
//클래스 메서드 호출
System.out.println(MyMath2.add(200L, 100L));
System.out.println(MyMath2.subtract(200L, 100L));
System.out.println(MyMath2.multiply(200L, 100L));
System.out.println(MyMath2.divide(200L, 100L));
MyMath2 mm = new MyMath2();
mm.a = 200L;
mm.b = 100L;
//인스턴스 메서드 호출
System.out.println(mm.add());
System.out.println(mm.subtract());
System.out.println(mm.multiply());
System.out.println(mm.divide());
}
}
* 출력 결과
300
100
20000
2.0
300
100
20000
2.0
인스턴스 메서드는 매개변수 없이도 인스턴스 변수인 'long a, b;'를 사용하여 메서드를 작업할 수 있다.
반면에 클래스 메서드는 'add(long a, long b), mutiply(long a, long b)'등은 인스턴스 변수 없이 매개변수를 통해
작업을 수행한다.
클래스 메서드 호출 시에는 객체 생성 없이 '클래스이름.메서드이름()'을 써서 호출한다.
→ MyMath2.add(200L, 100L); //클래스 메서드 호출
인스턴스 메서드를 호출하기 위해서는 먼저 인스턴스(객체)를 생성해야 한다.
→ MyMath2 mm = new MyMath2(); // 인스턴스 생성
인스턴스 생성 후, '참조변수.메서드이름()'을 사용하여 호출한다.
→ mm.add();
# 메서드 간의 호출과 참조
같은 클래스에 속한 멤버들 간에는 별도의 인스턴스(객체) 생성 없이 서로 참조 또는 호출이 가능하다.
단, 클래스 멤버가 인스턴스 멤버를 참조 또는 호출하는 경우에는 인스턴스(객체)를 생성해야 한다.
그 이유는 인스턴스 멤버(iv,im)가 존재하는 시점에 클래스 멤버는 항상 존재하지만,
클래스 멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있기 때문이다.
class TestClass2 {
int iv; //인스턴스 변수
static int cv; //클래스 변수
void instanceMethod() { //인스턴스 메서드 - 객체 생성 후 사용 가능
System.out.println(iv); // 인스턴스 변수 사용가능
System.out.println(cv); // 클래스 변수를 사용가능
}
static void saticMethod() { //static 메서드 - 객체 생성없이 호출 가능
System.out.println(iv); // error - 인스턴스 변수 사용 불가
System.out.println(cv); // 클래스 변수 사용가능
}
}
즉, 인스턴스 메서드는 항상 static메서드를 호출할 수 있지만, static 메서드는 인스턴스 메서드를 호출할 수 없다.
# 정리(Q&A)
Q. static메서드는 staitc메서드 호출이 가능한가?
→ YES!
∵ 같은 메서드끼리는 호출이 가능하다.
Q. static 메서드는 인스턴스 변수 사용가능?
→ NO!
∵ 인스턴스 변수는 객체(iv묶음)를 생성해야 사용이 가능한데
static메서드는 언제나 호출이 가능(객체 생성 없이 사용) 하기 때문에 인스턴스 변수를 사용할 수 없다.
Q. static 메서드는 인스턴스 메서드 호출 가능?
→ NO!
∵ 위의 질문의 답변과 같음.
Q. 왜? ststic메서드는 인스턴스 멤버(iv,im)를 쓸 수 없나요?
∵ static 메서드 호출 시 객체(iv묶음)가 있을 수도 없을 수도 있기 때문이다.
static 메서드는 항상 호출 가능
'개발 공부 > JAVA' 카테고리의 다른 글
[Java] 생성자, 기본 생성자, 매개변수가 있는 생성자 (0) | 2022.02.21 |
---|---|
[Java] 오버로딩(overloading) (0) | 2022.02.17 |
[Java] return문, 호출 스택, 기본형/ 참조형 매개변수 (0) | 2022.02.11 |
[Java] 선언 위치에 따른 변수 종류, 메서드 호출 및 실행 (0) | 2022.02.03 |
[Java] 객체지향언어, 객체, 클래스, 인스턴스 (0) | 2022.01.24 |
- Total
- Today
- Yesterday
- 객체의 구성요소
- Java
- 두 수의 나눗셈
- 조건문 if
- 클래스와 객체
- 기본형/참조형 매개변수
- 기본 생성자
- 매개변수가 있는 생성자
- 메서드 간의 호출과 참조
- JAVA 의 정석
- 코테
- Lv.0
- java의정석 기초
- MySQL
- JAVA의 정석
- SQL
- 객체 배열
- 인스턴스 메서드
- 2차배열 예제
- 생활코딩
- 객체지향 언어
- 호출스택
- 객체지향
- java의 정석기초
- do-while문
- 자바의 정석
- return문
- 프로글개머스 `
- 프로그래머스
- string 배열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |