'오버라이딩'에 해당되는 글 2건

  1. 2008.03.25 메소드 오버라이딩, 하이딩, 오버로딩
  2. 2008.03.24 오버라이드와 오버로딩

메소드의 오버라이딩, 하이딩, 오버로딩을 테스트 해 보았다.

오버라이딩과 하이딩의 차이점은 메소드를 static 으로 선언하지 않느냐, 하느냐의 차이이다.

즉 서브클래스의 인스턴스 메소드는 수퍼클래스의 인스턴스 메소드를 오버라이딩한다고 말하고,

서브클래스의 스태틱 메소드는 수퍼클래스의 스태틱 메소드를 하이딩한다고 말한다.

스태틱 메소드가 인스턴스메소드를 오버라이딩하거나 하이딩할 수는 없으며 그 역도 성립하지 않는다.

오버라이딩과 오버로딩의 차이점은 인자가 같으냐 마느냐의 차이이다.

인자가 같다면 메소드 오버라이딩이라 하고, 인자가 다르면 오버라이딩이라고 한다.



/**
 * 메소드 오버라이딩, 하이딩, 오버로딩 테스트
 */
public class ClassA {

 public void methodOne( int i) {
 
 }
 public void methodTwo(int i) {
  System.out.println("메소드2_클래스A");
 }
 public static void methodThree(int i) {
 
 
 }
 public static void methodFour(int i) {
  System.out.println("메소드4_클래스A");
 }
}


public class ClassB extends ClassA {

 /* 컴파일 에러
 public static void methodOne(int i) {
 
 }
public void methodThree(int i) {
 
 }*/
 public void methodTwo(int i) {                         /// 메소드 오버라이딩
  System.out.println("메소드2_클래스B");
 }
 
 
 public static void methodFour(int i) {                ///  메소드 하이딩
  System.out.println("메소드4_클래스B");
 }
 
 public void methodTwo() {                            /// 메소드 오버로딩
  System.out.println("메소드 오버로딩");
 }
 
 public static void methodFour() {                     /// 메소드 오버로딩
  System.out.println("메소드 오버로딩");
 }
 
 public ClassB() {
  methodTwo(1);
  methodTwo();
  super.methodTwo(1);
 
  methodFour(1);
  methodFour();
  super.methodFour(1);
 
 
 }
 
 public static void main(String [] args) {
 
  ClassB cb = new ClassB();
 
 
 }
}

결과는 다음과 같이 나올 것이다.

메소드2_클래스B
메소드 오버로딩
메소드2_클래스A
메소드4_클래스B
메소드 오버로딩
메소드4_클래스A

Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요

제대로 좀 알고 있자;

오버라이드

메소드는 계약서이다.

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

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

메소드를 더 접근하기 어렵게 만들면 안된다.(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 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요