2 minute read

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);      // 클래스 변수는 사용할 수 있다.
    }
}

오버로딩

오버로딩이란?

  • 한 클래스 내에서 같은 이름의 메서드를 여러 개 정의하는 것을 ‘오버로딩’이라 한다.

오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
    • 이때, 반환타입은 오버로딩을 구현하는데 아무런 영향도 주지 못한다.

오버로딩 구현

  • 아래 메서드들은 정의된 매개변수가 서로 다르긴 해도, 세 메서드 모두 매개변수로 넘겨받은 값을 더해서 그 결과를 돌려주는 일을 한다.
  • 같은 일을 하지만 매개변수를 달리해야하는 경우에, 이와 같이 이름은 같고 매개변수를 다르게 하여 오버로딩을 구현한다.
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;
}

오버로딩의 장점

  • 같은 기능을 하는 메서드의 이름을 기억하기 쉽고 이름도 짧게 할 수 있어 오류의 가능성을 줄일 수 있다.
  • 메서드의 이름을 절약할 수 있다. 사용되어야 할 메서드 이름을 다른 메서드의 이름으로 사용할 수 있기 때문이다.

Tags:

Categories:

Updated: