티스토리 뷰

반응형

 

🤔 인스턴스 메서드란?

인스턴스 생성 후, '참조변수.메서드이름()'으로 호출

인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드

메서드 내에서 인스턴스 변수(iv) 사용 가능

 

🤔 static 메서드란?(클래스 메서드)

객체 생성없이 '클래스이름.메서드이름()'으로 호출

인스턴스 멤버(iv, im)와 고나련없는 작업을 하는 메서드

메서드 내에서 인스턴스 변수(iv) 사용불가

 

 다음의 결과를 예측해보라.

class MyMath {
    long a, b;

    long add() { // 인스턴스 메서드
        return a + b;
    }

    static long add(long a, long b) { // 클래스 메서드(static 메서드)
        return a + b;
    }
}

public class Ch6_27Static메서드와인스턴스메서드 {
    public static void main(String[] args) {
        System.out.println(MyMath.add(200L, 100L)); // 클래스 메서드 호출

        MyMath mm = new MyMath(); // 인스턴스 생성
        mm.a = 200L;
        mm.b = 200L;
        System.out.println(mm.add()); // 인스턴스 메서드 호출
    }
}

 

출력결과

300
400

 


 

🤔 언제 static 메서드를 사용할까?

IV(Instance Variable) 사용하지 않을 때!

 

 

🤔 언제 static을 붙일까?

속성(멤버 변수) 중에서 공통 속성에 static을 붙인다!!

 

 

class Test {
    int iv; // 인스턴스 변수
    static int cv; // 클래스 변수
    
    void instanceMethod() { // 인스턴스 메서드
        System.out.println(iv); // 인스턴스 변수 사용 가능
        System.out.println(cv); // 클래스 변수 사용 가능
         }
         
         static void staticMethod() { // static 메서드
             System.out.println(iv); // 에러!! static 메서드에서 iv 사용할 수 없다.
             System.out.println(cv); // 클래스 변수 사용 가능 
              }
}

cv는 언제나 사용가능하다!

그러나 iv는 객체 생성 후에 사용 가능하다.

 

인스턴스 메서드에서 iv 호출은 객체가 생성된 후 이므로 가능하다.

인스턴스 메서드에서 cv 호출은 당연히 가능하다.(cv는 언제나 호출가능하니까)

 

static 메서드에서 iv 호출은 불가능하다.

(왜냐? iv는 객체 생성 후에 호출 가능인데,

static 메서드에서 객체 생성 후에 호출한건지 생성 전에 호출한 건지 알 수 없기 때문)

static 메서드에서 cv 호출은 당연히 가능하다. (cv는 언제나 호출가능하니까)

 

 

✅ 메서드에서 또한 마찬가지이다.

static 메서드는 인스턴스 메서드를(im) 호출할 수 없다!! ❌

 

class Test {
    void instanceMethods() {} // 인스턴스 메서드
    static void staticMethod() {} // static 메서드
    
    void instanceMethods2() { // 인스턴스 메서드
        instanceMethods(); // 다른 인스턴스 메서드 호출
        staticMethod(); // static 메섣 호출
    }
    
    static void staticMethods2() { // static 메서드
        instanceMethods(); // 에러!! 인스턴스 메서드를 호출할 수 엇다.
        staticMethod(); // static 메서드는 호출할 수 있다.
    }
}

 

 


🤔 오버로딩(overloading)이란?

한 클래스 안에 같은 이름의 메서드 여러 개 정의하는 것

 

🤔 오버로딩이 성립하기 위한 조건

✔ 메서드 이름이 같아야 한다.

✔ 매개변수의 개수 또는 타입이 달라야 한다.

✔ 반환 타입은 영향 없다. 

 

 


🤔 생성자(constructor)란?

인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'

인스턴스 생성시 수행할 작업(iv 초기화)에 사용

 

 

✅ 생성자를 만들기 위한 조건

1. 생성자의 이름이 클래스 이름과 같아야 한다.

2. 리턴값이 없다. (void 안붙임)

3. 모든 클래스는 반드시 생성자를 가져야 한다.

 

 

🤔 기본 생성자(default constructor)란?

1. 매개변수가 없는 생성자

2. 생성자가 하나도 없을 때만, 컴파일러가 자동 추가

 

class Data1 {
    int value;
}

class Data2 {
    int value;

    Data2(int x) {
        value = x;
    }
}

public class Ch6_27Static메서드와인스턴스메서드 {
    public static void main(String[] args) {
        Data1 d1 = new Data1(); // OK
        Data2 d2 = new Data2(); // Compile Error 발생 
        /**
         * compile error가 발생하는 이유
         * Data1의 경우 생성자가 없어서 default constructor를 컴파일러가 만들어줌.
         * But, Data2의 경우 Data2(int x) 생성자가 있는데 기본 생성자를 만들어 주지 않아 에러 발생.
         * 에러 메세지 내용 : cannot resolve symbol : constructor Data2()     
         * (해석 : 찾으려는 생성자 Data2()를 찾을 수 없다.) 
         */
    }
}

 

 


그럼 오늘도 열공하자. 🔥

반응형