본문 바로가기
JAVA

JAVA_오버로딩(Overloading)과 오버라이딩(Overriding)

by haheaven 2021. 7. 29.

<(메서드) 오버로딩 Overloading >

: 한 클래스 내에 이름이 같은 메소드를 여러 개 정의 

 

- 조건,

① 같은 이름의 메서드인 경우 

② 매개변수(parameter)가 다른 타입이거나 타입의 수가 다른 경우

③ 리턴값은 영향을 주지 않음

- 장점, 

이름이 같으니, 같은 기능임을 파악할 수 있으며, 메서드 이름을 절약할 수 있음 

 

class OverloadingTest {
 public static void main(String[] args){
 Calculator cal = new Calculator();
 //모두 cal.add로 메서드이름이 같지만 매개변수 타입이 다르기 때문에 출력이 가능하며,
 //메서드 이름으로 모두 더하는 메소드이구나 임을 파악할 수 있음
 System.out.println("cal.add(2,3) => " + cal.add(2,3));
 System.out.println("cal.add(2,3l) => " + cal.add(2,3l));
 System.out.println("cal.add(4l,3) => " + cal.add(4l,3));
 System.out.println("cal.add(4l,5l) => " + cal.add(4l,5l));
 int[] a = {10, 30, 40};
  System.out.println("cal.add(a) => " + cal.add(a));
  }
 }
  
 class Calculator {
   int add(int a, int b) {
    System.out.print("int add(int a, int b)");
    return a+b;
    }
    long add(int a, long b) {
    System.out.print("int add(int a, long b)");
    return a+b;
    }
    long add(long a, int b) {
    System.out.print("int add(long a, int b)");
    return a+b;
    }
    long add(long a, long b) {
    System.out.print("int add(long a, long b)");
    return a+b;
    }
    int add(int[] a){
    System.out.println("ind add(int[] a)");
    int sum =0;
    for(int i = 0; i<a.length; i++) {
      sum += a[i];
      } return sum;
     }
 } // end of class

 

 

 


 

< 오버라이딩(Overriding) >

: 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것자손클래스에서 오버라이딩할 때 메소드 조건,

 

- 자손클래스에서 오버라이딩하는 메서드 조건,

① 조상메서드와 자손메서드 이름이 같아야 한다.

② 조상메서드와 자손메서드 타입변수가 같아야한다.

③ 조상메서드와 자손메서드 반환타입이 같아야한다.

 

- 조상클래스의 메서드를 자손클래스에서 오버라이딩 할 때 조건,

① 접근제어자를 조상클래스의 메서드보다 좁은 범위로 변경할 수 없다.

② 예외는 조상클래스의 메서드보다 많이 선언할 수 없다.

③ 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수없다.

 

- super(참조변수)

: 조상의 멤버와 자손의 멤버를 구별하는데 사용하는 것으로, super는 조상의 멤버를 가리킴(this 와 사용방법이 같음) 

(this : 인스턴스 자신을 가리키는 참조변수)

 

 

 

public class Overriding_SuperTest {
  public static void main(String[] args) {
   Child c = new Child();
   c.method();
   }
 }
 class Parent {
   int x = 10;
  }
 class Child extends Parent {
  int x =200;
     
   void method() {
    System.out.println("x : " + x);             // x : 200
    System.out.println("this.x : " + this.x);   //this.x : 200
    System.out.println("super.x : " + super.x); //super.x : 10
   }
 }

- 위의 코드를 그림으로 살펴보면,

 

 

 

* 오버로딩 vs 오버라이딩

오버로딩  : 자식클래스의 메서드는 조상클래스의 메서드와 이름이 같고, 매개변수 타입이나 수를 다르게 하여 새로운 메서드를 정의함(new)

오버라이딩 : 자식클래스의 메서드는 조상클래스의 메서드와 이름과 매개변수가 같아 내용을 변경하는 것(change)

 

 

 

 

 

 

참고 : 자바의 정석(남궁성)

 

'JAVA' 카테고리의 다른 글

JAVA_생성자(Constructor)  (0) 2021.07.31
JAVA_상속  (0) 2021.07.31
JAVA_객체지향(매개변수, 메서드 구분 )  (0) 2021.07.28
JAVA_JVM 메모리 구조  (0) 2021.07.28
JAVA_객체지향 프로그래밍2(변수, 메서드)  (0) 2021.07.28

댓글