오버라이드

메소드는 계약서이다.

오버라이딩 하려면 인자는 같아야 하고 이턴 유형도 호환 가능해야 한다.

오버라이드하는 메소드에서는 인자를 변경할 수 없다.

메소드를 더 접근하기 어렵게 만들면 안된다.(private로 설정하면 안되)

다형성이 작동하려면 하위클래스에서 상위 클래스의 메소드를 쓸때 그 메소드가 제대로 실행되어야 한다.

컴파일러에서 메소드 호출을 허가한 후에도 오버라이드하는 메소드의 인자와 리턴 형식이 같을 때만 그 메소드가 제대로 작동한다.

상위 클래스와 하위클래스의 이름이 같다.

매개변수의 타입과 개수, 순서가 같다.

리턴 타입이 같다.

상속받은 메소드의 내용을 변경할수 있다.


================================================

class A {

        void Pmethod() { }

}

class a extends A {

        void Pmethod() { }          //오버라이딩

        void Pmethod(int i) { }   //오버로딩

        void Cmethod() { }          //오버로딩

        void Cmethod(int i) { }    //오버로딩

      // 메소드이름이 같아도 매개변수가 달라서 다른 메소드 취급

}

================================================

   



오버로딩


이름이 같고 인자 목록이 다른 메소드 두 개 만들기.

상속이나 다형성과는 관계가 전혀 없다.

호출하는 쪽의 편의를 위해 같은 메소드를 서로 다른 인자 목록을 가진 여러 버전으로 만들수 있다.

int형을 인자로 받는 메소드를 호출하는 코드에 double을 받으려면 double형을 인자로 받는 메소드를 호출하는 버전의 메소드를 만들면 된다.

오버로드된 메소드의 여러가지(조건들)을 이행할 필요가 없기 때문에 접근단계 설정이 자유롭다.

상위클래스와의 메소드와 이름이 같아도 매개변수의 타입 개수 순서가 다르면 오버로딩이다.

상속 받은것 외에 기존에 없는 새로운 메소드를 정의한다.



시그니처(메소드 이름, 매개변수 리스트)가 다르기 때문에 다음은 각기 다른 메소드이다.

public class SquareOverload {
 public static int square(int n) {
  System.out.println("Integer Square");
  return n*n;
 }
 
 public static long square(long l) {
  System.out.println("long Square");
  return l*l;
 }
 
 public static double square(double d) {
  System.out.println("double Square");
  return d*d;
 }
 
 public static void main(String[] args) {
  int n = 5;
  long l = 100;
  double d = 1000.0;
 
  System.out.println("n Square = " + square(n));
  System.out.println("l Square = " + square(l));
  System.out.println("d Square = " + square(d));
 }
}


반환값도 시그니처의 한 부분이지만 메소드를 구분하는 요소로 쓰이지는 않는다.

다음은 같은 클래스 안에서 정의 될수 없다.

long square(long d)

int square(long d)

Posted by 청웨일