0928 | 자바의 정석 기초편 :: ch6-26~6-31
static 메서드와 instance 메서드
class MyStudy{
long a,b; // 인스턴스 변수 - 클래스 전체에서 사용 가능
long add() // 인스턴스 메서드. 앞에 static이 없는 것.
return a+b; // 인스턴스변수
}
static long add(long a, long b) { // 클래스 메서드. static이 붙어있음. 인스턴스변수 사용불가
// long a, long b는 지역변수로 유효범위가 static 메서드 내부.
return a+b; // 지역변수
}
public static void main(String[]args){
System.out.println(MyStudy.add(200L,100L); // 클래스이름.메서드이름 - 클래스메서드호출
MyStudy mm = new MyStudy(); // 인스턴스 생성
mm.a = 200L;
mm.b = 100L;
System.out.println(mm.add());} // 참조변수.메서드이름 - 인스턴스메서드 호출
}
* 프로그램을 짤때 STATIC을 붙일지 안붙일지 결정할 수 있어야 한다. IV를 안쓸때 붙이면 됨.
STATIC 메서드는 자기 작업에 필요한 것들을 매개변수로 모두 받아둠. 그래서 IV가 필요없음.(IV가 필요없다 == 객체가 필요없다)
인스턴스메서드는 매개변수가 없어서 IV가 필요하기도 하고, IV가 있기때문에 매개변수가 없기도 함. 그래서 STATIC 메서드와 차이가 나게됨.
✔ 인스턴스 메서드 | ✔ 클래스 메서드(static 메서드) |
: 인스턴스 변수나 인스턴스 메서드와 관련된 작업 진행 : 인스턴스 생성후 사용 가능 : 참조변수.메서드이름() 으로 호출 : 메서드 내에서 인스턴스 변수 사용 가능 |
: 인스턴스 변수나 인스턴스 메서드와 관련없는 작업 : 객체 생성 없이 사용 가능 : 클래스이름.메서드이름() 으로 호출 : 메서드 내에서 인스턴스 변수 사용 불가 >> 둘을 가르는 큰 차이점 : 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는게 좋음 |
Math.random() Math.round() |
👉 static 변수: 공통 속성에 static
👉 static 메서드: 공통적인 메서드라 static 메서드인게 아니고, iv안쓰면 붙임.
static 메서드와 instance 메서드간의 호출과 참조
👉 static 메서드는 인스턴스변수 (iv)를 사용할 수 없다.
class SAndI{
int iv ; // 인스턴스 변수 - 객체 생성 후 사용 가능
static int cv ; // 클래스 변수 - 항상 사용가능
void instanceMethod(){ // 인스턴스 메서드 - 객체 생성 후 호출 가능 - 메서드 호출은 iv가 이미 있다는뜻
System.out.println(iv); // 인스턴스 변수 사용 가능
Ststem.out.println(cv); // 클래스 변수 사용 가능
}
static void staticMethod() { // static 메서드
System.out.println(iv); // error! 인스턴스 변수 사용 불가. static 호출시 객체가 있을지 없을지 몰라서.
System.out.println(cv); // 클래스 변수 사용 가능
}
}
👉 static 메서드는 인스턴스메서드 (im)를 사용할 수 없다.
class SAndI{
void instanceMethod() {} // 인스턴스 메서드
static void staticMethod() {} // static 메서드
void instanceMethod2() { // 인스턴스 메서드
instanceMethod(); // 다른 인스턴스메서드 호출
staticMethod(); // static 메서드 호출 (항상 가능)
}
static void staticMethod2(){ // static 메서드
instanceMethod(); // error!인스턴스 메서드 호출 불가.iv로 작업하는 메서드라 객체필요.
statocMethod(); // static 메서드 호출가능
}
오버로딩 (overloading)
: 한 클래스 안에 같은 이름의 메서드를 여러개 정의하는 것
: 매개변수는 다르지만 하는 작업이 같을때 오버로딩 사용
System.out.println()
System.out.println(int x)
System.out.println(char[] x)
System.out.println(object x)
void println()
void println(boolean x)
void println(int x)
컴파일러가 매개변수를 확인해서 그에 맞는 메서드를 연결.
✔ 오버로딩의 조건
: 메서드 이름이 같아야 한다
; 매개변수의 개수 or 타입이 달라야 한다
: 반환타입은 영향 없다 - 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 아니다.