TIL-23-03-03
Updated:
클래스 메서드와 인스턴스 메서드
인스턴스 메서드
- 인스턴스 생성 후, ‘참조변수.메서드이름()’으로 호출
- 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로하는 메서드
클래스 메서드
- 객체 생성없이, ‘클래스이름.메서드이름(매개변수)’로 호출
- 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드
- 메서드 중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드에는 static을 붙이는 것을 고려한다.
class MyMath2 {
long a, b;
// 인스턴스변수 a,b만을 이용해서 작업하므로 매개변수 불필요
long add(){
return a + b; //a, b는 인스턴스변수
}
// 인스턴스변수와 관계없이 매개변수만으로 작업이 가능하다.
static long add(long a, long b){ // a, b는 지역변수
return a + b;
}
}
class main
{
public static void main(String[] args)
{
// 클래스메서드 호출. 인스턴스 생성없이 호출가능
System.out.println(MyMath2.add(200L, 100L));
MyMath2 mm = new MyMath2(); // 인스턴스를 생성
mm.a = 300L;
mm.b = 200L;
// 인스턴스 메서드는 객체생성 후에만 호출이 가능함.
System.out.println(mm.add());
}
}
클래스 멤버와 인스턴스 멤버간의 참조와 호출
- 같은 클래스의 멤버간에는 객체생성이나 참조변수없이 참조할 수 있다. 그러나 static 멤버들은 인스턴스멤버들을 참조할 수 없다.
// 메서드 간의 호출
class TestClass {
void instanceMethod() {} // 인스턴스 메서드
static void staticMethod() {} // static 메서드
void instanceMethod2() { // 인스턴스 메서드
instanceMethod(); // 다른 인스턴스메서드를 호출한다.
staticMethod(); // static 메서드를 호출한다.
}
static void staticMethod2() { // static 메서드
instanceMethod(); // 에러. 인스턴스메서드를 호출할 수 없다.
staticMethod(); // static 메서드는 호출할 수 있다.
}
}
- 인스턴스메서드는 인스턴스변수를 사용할 수 있지만, static 메서드는 인스턴스변수를 사용할 수 없다.
// 변수와 메서드 간의 호출
class TestClass2 {
int iv; // 인스턴스 변수
static int cv; // 클래스 변수
void instanceMethod() { // 인스턴스 메서드
System.out.println(iv); // 인스턴스 변수를 사용할 수 있다.
System.out.println(cv); // static 메서드를 사용할 수 있다.
}
static void staticMethod2() { // static 메서드
System.out.println(iv); // 에러!! 인스턴스 변수를 사용할 수 없다.
System.out.println(cv); // 클래스 변수는 사용할 수 있다.
}
}
오버로딩
오버로딩이란?
- 한 클래스 내에서 같은 이름의 메서드를 여러 개 정의하는 것을 ‘오버로딩’이라 한다.
오버로딩의 조건
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
- 이때, 반환타입은 오버로딩을 구현하는데 아무런 영향도 주지 못한다.
오버로딩 구현
- 아래 메서드들은 정의된 매개변수가 서로 다르긴 해도, 세 메서드 모두 매개변수로 넘겨받은 값을 더해서 그 결과를 돌려주는 일을 한다.
- 같은 일을 하지만 매개변수를 달리해야하는 경우에, 이와 같이 이름은 같고 매개변수를 다르게 하여 오버로딩을 구현한다.
int add(int a, int b) { return a+b;}
long add(long a, long b) { return a+b;}
long add(int[] a) {
long result = 0;
for(int i=0; i < a.length; i++) {
result += a[i];
}
return result;
}
오버로딩의 장점
- 같은 기능을 하는 메서드의 이름을 기억하기 쉽고 이름도 짧게 할 수 있어 오류의 가능성을 줄일 수 있다.
- 메서드의 이름을 절약할 수 있다. 사용되어야 할 메서드 이름을 다른 메서드의 이름으로 사용할 수 있기 때문이다.