🔸 클래스 메서드도 클래스 변수와 같이 객체를 생성하지 않고도 호출이 가능하다. (클래스 이름.메서드 이름(매개변수))
➡️ 하지만 인스턴스 메서드는 반드시 객체를 생성해야 호출할 수 있다.
🔸 인스턴스 메서드: 인스턴스 변수를 가지고 작업을 하는 메서드.
➡️ 인스턴스 변수는 인스턴스를 생성해야만 만들어지기 때문에 인스턴스 메서드 또한 인스턴스를 생성해야 호출이 가능하다.
생성된 인스턴스는 서로 다른 값을 독립적으로 유지한다. 그렇기 때문에 같은 값이 유지 되어야 하는 변수는 static을 붙여 클래스 변수로 정의해야 한다.
클래스 변수는 클래스가 메모리에 올라갈 때 같이 생성됨.
🔸인스턴스 변수는 인스턴스가 생성되어야만 사용할 수 있는데 반해 클래스 메서드는 인스턴스 생성 없이 호출이 가능하다.
➡️ 클래스 메서드가 호출되었을 때 인스턴스가 생성되어 있지 않은 경우가 발생할 수 있기 때문에 사용할 수 없다.
(인스턴스 메서드에서 클래스 변수 사용은 가능)
메서드 호출 시간이 짧아지기 때문에 성능이 향상된다.
class TestClass{ void instanceMethod() {} static void staticMethod() {} void instanceMethod2(){ instanceMethod(); staticMethod(); } static void staticMethod2(){ staticMethod(); instanceMethod(); // 에러발생함. } } class TestClass2{ int iv; static int cv; void instanceMethod(){ System.out.println(iv); System.out.println(cv); } void staticMethod(){ System.out.println(iv);// 에러 발생함. System.out.println(cv); } }
class Math{ long a, b; // iv long add(){ return a + b;} long subtract(){ return a - b;} long multiply(){ return a * b;} double divide(){ return a / b;} static long add(long a, long b){ return a + b;} static long subtract(long a, long b){ return a - b;} static long multiply(long a, long b){ return a * b;} static double divide(double a, double b){ return a / b;} } class Test{ public static void main(String args[]){ // static 메서드 호출 long a1 = Math.add(100L, 100L); long b1 = Math.subtract(200L, 100L); long c1 = Math.multiply(100L, 100L); double d1 = Math.divide(200.0, 100.0); // Math 인스턴스 생성 후 인스턴스 메서드 호출 Math math = new Math(); math.a = 200L; math.b = 100L; long a2 = math.add(); long b2 = math.subtract(); long c2 = math.multiply(); double d2 = math.divide(); } }