자바의 정석 - static메서드와 인스턴스 메서드

Yohan·2023년 11월 19일
0
    class MyMath2 {
        long a, b; // 인스턴스 변수
        
        long add() { // 인스턴스 메서드
            return a + b;
        }
        
        static long add(long a, long b) { // 클래스 메서드 (static 메서드), long a, long b - 지역 변수
            return a + b;
        }
    }

인스턴스 메서드

  • 인스턴스 생성 후, '참조변수.메서드이름()'으로 호출
  • 인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수(iv) 사용가능

static 메서드(클래스메서드)

  • 객체생성없이, '클래스이름.메서드이름()'으로 호출
  • 인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수(iv) 사용불가

인스턴스 메서드 vs static 메서드의 가장 큰 차이

  • 인스턴스 변수 사용여부
    class MyMathTest2 {
        public static void main(String[] args) {
            System.out.println(MyMath2.add(200L, 100L)); // 클래스 메서드 호출
            MyMath2 mm = new MyMath2(); // 인스턴스 생성
            mm.a = 200L;
            mm.b = 100L;
            System.out.println(mm add()); // 인스턴스 메서드 호출
        }
    }

static을 언제 붙여야 할까?

  • 속성(멤버 변수)중에서 공통 속성에 static을 붙인다.
class Card {
	// 인스턴스 변수 (개별 속성)
	String kind; // 무늬
    int number; // 숫자
    
    // 클래스 변수 (공통 속성)
    static int width = 100; // 폭
    static int height = 250; // 높이
}
  • 인스턴스 멤버(iv, im)을 사용하지 않는 메서드에 static을 붙인다.
    class MyMath2 {
        long a, b; // 인스턴스 변수
        
        long add() { return a + b; } // a, b는 인스턴스변수
        
        static long add(long a, long b) { return a + b; } // a, b는 지역변수
    } 

메서드 간의 호출과 참조

  • static 메서드는 인스턴스 변수(iv)를 사용 할 수 없다.
    class TestClass2 {
        int iv; // 인스턴스 변수
        static int cv; // 클래스 변수
        
        void instanceMethod() { // 인스턴스 메서드
            System.out.println(iv); // 인스턴스 변수 사용 o
            System.out.println(cv); // 클래스 변수 사용 o
        }

        static void staticMethod() { // static 메서드
            System.out.println(iv); // 인스턴스 변수 사용 x - static 메서드는 객체 생성을 하지 않기 때문에 객체 생성이 필요한 인스턴스 변수는 사용 불가능
            System.out.println(cv); // 클래스 변수 사용 o
        }
    }
  • 같은 이유로 static 메서드는 인스턴스 메서드도 호출할 수 없다.

  • Q. static 메서드는 static 메서드 호출 가능?
  • Q. static 메서드는 인스턴스 변수 사용가능?
    • 아니요 (인스턴스 변수는 객체를 생성해야 사용 가능하기 때문에)
  • Q. static 메서드는 인스턴스 메서드 호출 가능?
    • 아니요 (위와 같은 이유)
  • Q. 왜? static 메서드는 인스턴스 멤버(iv, im)를 쓸 수 없나요?
    • static메서드 호출 시 객체(iv묶음)가 없을 수도 있어서
profile
백엔드 개발자

0개의 댓글