메서드의 호출
다른 타입으로 호출했을 경우
class MyMathTest { public static void main(String args[]) { MyMath mm = new MyMath(); double result = mm.divide(5L, 3L); System.our.println(result); // prints 1.6666666666666667 } } class MyMath { double divide(double a, double b) P return a / b; }
divide 메서드 선언 시에 패러미터는 double형으로 선언했는데, 실제 아규먼트는 long형으로 대입한 경우,
double a = 5L;
과 같아서, long형 값을 double형 변수에 저장하는 것과 같다. 이 경우 double로 자동형변환 되어 입력값이 long형이어도 연산 결과는 double형이다.
클래스 메서드(static 메서드) 와 인스턴스 메서드
인스턴스와 관계없는 메서드를 클래스 메서드(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는 지역변수. } class MyMathTest2 { System.out.println(MyMath2.add(200L, 300L)); // 클래스 메서드는 인스턴스 생성 없이 바로 사용 가능 MyMath2 mm = new MyMath2(); // 인스턴스 생성 mm.a = 200L; mm.b = 300L; System.out.println(mm.add()); // 인스턴스 메서드는 인스턴스 생성 후 호출 가능 }
클래스 멤버와 인스턴스 멤버 간 참조 및 호출
같은 클래스에 속한 멤버 간에 별도 인스턴스를 생성하지 않고도 참조 및 호출이 가능하다.
그러나 클래스멤버가 인스턴스멤버를 참조 또는 호출하고자 하는 경우, 인스턴스 생성이 선행되어야 한다. 클래스멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수 있기 때문이다.
인스턴스멤버간 호출에는 아무런 문제가 없다.
class MemberCall { int iv = 10; static int cv = 20; void instanceMethod() { System.out.println(cv); System.out.println(iv); // 인스턴스변수, 클래스변수 모두 호출 가능 } static void staticMethod() { System.out.println(iv); // Error! instanceMethod(); // Error! System.out.println(new MemberCall().iv); new MemberCall().instanceMethod(); // 인스턴스를 생성해서 인스턴스 멤버 호출 가능 } }