메서드 - 문장들을 묶어놓은것
값(입력)을 받아 처리하고 결과를 반환(출력) - 코드의 중복을 줄이고, 코드의 관리가 쉽다, 코드 재사용 가능, 가독성 향상
메서드와 함수는 비슷한 개념이라고 보면 되는데 주요 차이점은
메서드 - 클래스 내부에 존재
함수 - 클래스 내부, 외부에 존재
메서드 - 선언부와 구현부로 구분되며 이를 합하여 메서드영역 이라고 칭한다.
int add(int a, int b) //선언부
{ //구현부 시작
int result = a+b;
return result;
} //구현부 끝
호출스택 (call stack) - 메서드 수행에 필요한 메모리가 제공되는 공간
메서드가 호출되면 호출스택에 메모리가 할당되며 사용이 종료된경우 해제된다 (GC와 같은 원리)
스택- LIFO(후입선출)의 원리로
public static void main(String args[]){
System.out.println("test");
}
상단의 코드를 실행시 하단의 순서에따라 스택이 push되고 pop 되는구조다.
스택구조의 원리를 참고해서 설명하자면
① - 초기상태
② - main이 실행된 상태
③ - main은 대기, println은 실행상태
④ - println이 사용이 끝나 Pop(메모리 반환)되어 바로 밑에 있는 main이 다시 실행
⑤ - 프로그램 종료
메서드는 맨위의 1개만 실행중이며 나머지는 대기중이다.
static메서드, 인스턴스 메서드
IV -> Instance Variable(인스턴스변수)
IM -> Instance Method (인스턴스 메서드)
LV -> Local Variable(지역변수)
CV -> Class Variable(클래스변수)
인스턴스 메서드
인스턴스맴버 (IV,IM) 관련 작업을 하는 메서드
인스턴스 생성후 "참조변수.메서드 이름()"으로 호출
메서드 내에서 인스턴수 변수 (IV)사용가능 -> 객체가 있기 때문에 사용가능?
static 메서드 (클래스 메서드)
객체생성없이 "클래스이름.메서드이름()"으로 호출
인스턴스멤버와 관련없는 작업을 하는 메서드
메서드 내에서 인스턴스 변수(IV) 사용불가 -> 객체가 없기 때문에 사용불가?
두 메서드의 차이점은 하단의 코드를 확인하길 바란다.
//메서드 정의
class MyMath2 {
long a,b; //인스턴스변수 (구분을 위하여 하단의 설명에선 a,b를 aa,bb로 지칭한다.)
long add() { //인스턴스 메서드 -> (I)
return a+b;
}
static long add(long a, long b){ // 클래스메서드 (static메서드) -> (J)
return a+b;
}
}
메서드 정의 코드에서 (I)와 (J)의 차이점은 매개변수가 들어간것, 앞쪽에 static이 붙은것 2가지 차이인데 상세하게 설명하자면
(I)는 파라미터를 없이 a+b를 계산하는데 여기서 a,b는 인스턴스 변수인 aa,bb를 의미한다. (IM는 IV,CV 둘다 사용가능)
(J)는 파라미터(지역변수)를 받고 (a와 aa 다른변수이다.) 호출할시 파라미터가 주어지지 않으면 오류를 출력하게 된다.
(static메서드는 CV만 사용가능 -> IV를 사용하기 위해선 객체가 필요한데 static은 객체가 없으니 사용불가능)
//메서드 호출
class MyMath2Test2
public static void main (String args[]){
system.out.println(MyMath2.add(200L,100L)}; //클래스메서드 호출 (J)호출 -> 편의상 P로 칭함
//클래스이름(Mymath2).메서드이름(add)
MyMath2 mm = new MyMath2(); //인스턴스 생성 (I) 호출 -> 편의상 K로 칭함
mm.a = 250L;
mm.b = 100L;
system.out.println(mm.add())}; //인스턴스 메서드 호출
//참조변수(mm).메서드이름(add)
}
메서드 호출 방식에도 차이점을 확인할수 있다.
(J)호출과 (I)호출에선 파라미터가 다르게 출력됨을 확인할수 있는데
(P)는 (J)를 호출 : 호출과 동시에 매개변수만 넣으면 실행되는것 (객체의 생성이 없다! -> IV를 사용하지 않을때 사용한다)
(K)는 (I)를 호출한다 : 인스턴스(객체) 생성 -> 기존 메서드의 값 삽입 -> println 실행
여기서 의문이 생기는점은 static은 어느 기준으로 붙이면 되는건지 궁금한것인데
1. 클래스변수(공통속성)으로 사용되는 경우에 붙인다.
2. IV를 사용하지 않는 메서드에 static을 붙인다 (상단의 "//메서드정의" 코드 참조)
추가로 덧붙이자면 IM(인스턴스메서드)에서 다른 static메서드,IM호출이 가능하지만, static 메서드는 다른 static메서드 호출이 되지만 IM는 호출불가하다 (IV는 객체가 필요하기 때문!)