static메서드와 인스턴스 메서드
Static 메서드와 인스턴스 메서드
static 메서드는 메서드 앞에 static이 붙은 것이다. 클래스 메서드라고도 한다.
인스턴스 메서드는 static이 붙지 않은 메서드이다.
이 둘의 차이점에 대해서 공부해 보자.
- 인스턴스 메서드
- 인스턴스 생성 후, '참조변수.메서드이름()'으로 호출
- 인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수(iv) 사용가능
- static 메서드 (클래스 메서드)
- 객체생성없이 '클래스이름.메서드이름()' 으로 호출
- 인스턴스 멤버(iv, im(인스턴스메서드))와 관련없는 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수(iv) 사용불가
static메서드의 예시는 Math.random(), Math.round()등이 있다.
이 메서드를 사용할 때는, 참조변수 없이 '클래스이름.메서드이름()' 으로 호출해서 사용할 수 있다.
이처럼 static 메서드는 객체를 생성하지 않고 사용할 수 있다.
인스턴스 메서드는 인스턴스 멤버를 가지고 작업하는 메서드이다.
결국, static 메서드와 인스턴스 메서드의 차이는,
iv의 사용여부로 갈린다.
iv를 사용하면 인스턴스 메서드고,
iv를 사용하지 않으면 static 메서드이다.
MyMath2라는 클래스가 있고, 그안에 add라는 인스턴스 메서드가 있고, add라는 sattic메서드 이렇게 2가지가 있다.
이 두 메서드의 차이는 뭘까?
우선 살펴보면, 반환타입은 똑같다.
그러나, 인스턴스 메서드 add에는 매개변수가 없고, static메서드 add에는 매개변수가 있다.
long타입의 변수 a, b는 iv이다. 즉, 클래스 전체에서 사용할 수 있따.
그리고 static 메서드 add의 파라미터 a, b는 lv이다.(지역변수)
lv는 자신이 선언된 위치부터 메서드가 종료될 때까지만 유효하다.
그리고, 추가로 static 메서드 add의 return a + b의 a와 b는가까운쪽의 a와 b가 lv이므로 마찬가지로 lv이다.
그러나, 인스턴스 메서드 add의 a + b에 a, b는 iv이다.
즉, 인스턴스 메서드는 iv를 사용하는 메서드이고,
static 메서드(클래스 메서드)는 iv를 사용하지 않는 메서드다.
static메서드는 '클래스이름.메서드이름()'으로 호출한다.
MyMath2클래스의 static메서드 add를 호출하는데, 매개변수로 200L, 100L을 주고,
이 매개변수가 static메서드의 매개변수로 입력된다.
그리고 300이 반환된다.
즉, 클래스메서드(Static 메서드) 는 객체생성없이 호출이 가능한 메서드이다.
근데, 인스턴스 메서드는, 먼저 객체를 만들고,
참조변수를 이용하여 a, b값을 세팅해주고, (iv값을 주고)
'참조변수.메서드이름()' 를 사용해서 인스턴스 메서드를 호출한다.
그러면, 우리가 메서드를 만들었을 때, static을 붙일지, 말지를 어떻게 결정해야 할까?
대부분, "static메서드는 객체생성 없이 호출가능하다" 라는 정도만 알고 그이후는 잘 모른다.
이러면, 남이 만든 메서드를 사용할 수 있을 정도만 되는 수준의 대답인 것이다.
본인이 메서드를 만들었을때, static을 붙힐지 말지를 결정할 줄 알아야 제대로 공부 한 것이다.
우리가 메서드를 만들 때, iv의 사용여부를 판단하고 iv를 사용하면 static을 붙이면 안된다.
그럼 언제 static을 붙이냐면, iv를 사용하지 않을 때 붙인다.
그 이유를 지금부터 알아보자.
이 그림은, 위의 코드에서 Mymath2 mm = new MyMath2();를 그림으로 표현한 것이다.
그다음 여기에 참조변수 mm이 가리키는 a에 200, b에 100을 넣는다.
그다음 add를 호출했다. 200 + 100해서 300이라는 결과가 나온다.
다시 전체적으로 정리를 해보자.
\
인스턴스 메서드의 a, b는 iv이고,
클래스메서드(static메서드)의 a, b는 lv이다.
그리고 위에서 생성한 객체의 ab는 iv이다.
클래스 메서드는 '클래스이름.메서드이름()'이렇게 호출하고,
인스턴스 메서드는 객체를 생성하고, 호출을 하는데, '참조변수.메서드이름()'이렇게 호출한다.
이 static메서드를 보면, 자기작업에 필요한 것들을 매개변수로 받는다.(lv로 해결)
근데, 인스턴스 메서드는 입력값 이 없다. 즉 매개변수가 없다.
iv값을 쓰기 떄문이다.
결국에 두 차이는 iv사용여부로 갈린다.
객체는 iv의 묶음이기 때문이다.
이것만 확실히 알고있어도, 객체지향개념을 이해하는데에 훨씬 수월할 것이다.
그러니까, 인스턴스 메서드를 호출하려면 왜 객체가 필요하느냐면,
인스턴 메서드는 iv로 작업을 하기 때문에, 결국 iv가 필요한데, 객체는 iv 변수 묶음이기 때문에 객체를 생성해야 하는 것이다.
static을 언제 붙여야 할까?
- 속성(멤버 변수) 중에서 공통 속성에 static을 붙인다.
이것은 앞에서 배운 내용이다. 속성중에 공통 속성에 붙인다.
그러면 메서드일 경우에는 언제 붙어야 할까?
- 인스턴스 멤버(iv, im)을 사용하지 않는 메서드에 statiac을 붙인다. (im은 인스턴스 메서드인데, 인스턴스 메서드는 iv를 사용하는 메서드이다. 즉 인스턴스 멤버를 사용하지 않는다는 뜻은, iv를 사용하지 않는다는 뜻이다.)
iv를 사용하면 static을 붙이면 안되고, 첫번째 add의 경우 iv를 사용하므로 인스턴스 메서드이고,
두번째 add는 iv를 사용하지 않고, lv만 사용하므로 static을 붙일 수 있다.
메서드 간의 호출과 참조
static 메서드는 인스턴스 변수(iv)를 사용할 수 없다.
위의 코드에는 iv와 cv가 있고, 인스턴스 메서드, static메서드도 있다.
인스턴스 메서드는 원래 iv로 작업하는 것이므로, iv를 당연히 쓸 수 있다.
그리고 cv도 사용가능하다. 왜냐하면, cv는 객체를 생성하지 않아도 메모리에 바로 올라가기 때문이다.
iv는 객체 생성 후 사용가능하다.
cv는 언제나 사용가능하다.
인스턴스 메서드는 객체 생성 후 호출을 할 수 있다.
그래서 인스턴스 메서드가 호출되었다는 것은, 이미 객체가 생성되었음을 알 수 있다. 즉 iv는 이미 존재한다는 말이다.
그래서 println(iv)를 할 수 있다.
static메서드는 iv를 사용할 수 없다. cv는 항상 사용할 수 있다.
static메서드가 iv를 사용할 수 없는 이유는, static메서드는 객체 생성 없이 호출가능한, 항상 호출이 가능한 메서드이기 때문에 static메서드를 호출 할 때, iv를 사용할 객체가 있다는 보장이 없어서 사용할 수 없다.
static 메서드는 인스턴스 메서드(im)를 호출할 수 없다.
인스턴스 메서드가 다른 인스턴스 메서드를 호출하는 것은 가능하다.
인스턴스 메서드에서 static메서드를 호출하는 것도 가능하다. static메서드는 항상 호출 가능하기 때문이다.
그런데, static메서드는 인스턴스메서드를 호출할 수 없다.
인스턴스 메서드는 iv로 작업하는 메서드다. 즉, 객체가 필요한 메서드다.
근데 static메서드는 항상 호출가능한 메서드이기때문에, 객체가 필요한 인스턴스메서드를 호출 할 수 없다.
객체가 있는지 없는지 알 수 없기 때문이다. static메서드가 iv를 사용할 수 없는 것과 같은 이유라고 생각하면 된다.
메서드 간의 호출과 참조
Q. static 메서드는 static 메서드 호출 가능?
→ 네
Q. static 메서드는 인스턴스 변수 사용가능?
→ 아니요
Q. static 메서드는 인스턴스 메서드 호출가능?
→ 아니요
Q. 왜 static 메서드는 인스턴스 멤버를 쓸 수 없나요?
→ static 메서드 호출 시 객체 (iv묶음)가 없을 수도 있어서
'JAVA' 카테고리의 다른 글
생성자, 기본 생성자 (0) | 2022.03.29 |
---|---|
오버로딩 (1) | 2022.03.28 |
참조형 매개변수, 참조형 반환타입 (0) | 2022.03.27 |
기본형매개변수 (0) | 2022.03.26 |
호출 스택 (call stack) (0) | 2022.03.26 |
댓글
이 글 공유하기
다른 글
-
생성자, 기본 생성자
생성자, 기본 생성자
2022.03.29 -
오버로딩
오버로딩
2022.03.28 -
참조형 매개변수, 참조형 반환타입
참조형 매개변수, 참조형 반환타입
2022.03.27 -
기본형매개변수
기본형매개변수
2022.03.26