본문 바로가기

자바/정리

(JAVA)Overriding 과 Overloading

Overriding 과 Overloading.

 

갈수록 개념이 어려워 지고 있다. 힘들어도 계속 나아가다 보면 익숙해질 날이 올거라고 믿는다.

 

오버라이딩(Overriding)  뭔가 더 탑승 시켜서 본질을 바꾸는 것이다.

 

상속 개념에서 자식이 부모로 부터 메서드 값을 받는데 이걸 자식이 메서드를 그대로 복사 붙여넣기로 끌고온뒤 내용을 수정해서 사용하면 그게 오버라이딩 이다. (코드를 보는게 이해가 빠를것이다.)

 

즉 오버라이딩을 하려면 메서드 시그니처가 일치해야 한다는 뜻이다. (메서드 시그니처 = 메서드의 변수타입, 리턴타입, 이름, 순서)

 

 

오버로딩(Overloading)은 본연의 모습은 살아 있는데 여러 값을 추가로 얹어서 여럿이서 사용하는것이다.

 

오버로딩은 굳이 상속과는 관련은 없다.(상속이 아닌 상황에서도 사용이 가능하다.) 같은 메서드인데 여러 종류의 매개변수를 입력 하는 행위를 오버로딩 이라고 한다.

 

저번 상속2에 쓰던 코드에서 조금만 수정을 하였다. 쓰지 않는 기능도 약간은 있지만 지장은 없다. 코드를 보면서 알아보자.

 

class HCalculator {
    int left, right,more;
    public HCalculator(int left, int right){
        this.left = left;
        this.right = right;
    }
    public HCalculator(int left, int right, int more){
        this.left = left;
        this.right = right;
        this.more = more;
    }
    public void avg() {
        System.out.println((this.left + this.right) / 2);
    }
    public void sum() {
        System.out.println(this.left + this.right+this.more);
    }
}
class subtractable extends HCalculator{
    public subtractable (int left, int right){
        super(left,right);
    }
    public subtractable (int left, int right, int more){
        super(left,right,more);
    }
    public void subtract(){
        System.out.println(this.left - this.right);
    }
}
class multipliable extends subtractable
{
    public void sum(){
        System.out.println("실행결과는!!! 뚜둥 = " + (this.left +this.right+this.more));
        System.out.printf("한번더 출력!"); super.sum();
    }
    public multipliable(int left,int right){
        super(left,right);
    }
    public multipliable(int left,int right,int more){
        super(left,right,more);
    }
    public void multiply(){
        System.out.println(this.left * this.right);
    }
}
public class inherit {

    public static void main(String[] args) {

        HCalculator c1 = new HCalculator(20,40);
        c1.sum();
        subtractable c2 = new subtractable(30,40);
        c2.sum();
        multipliable c3 = new multipliable(80,40);
        c3.sum();
        multipliable c4 = new multipliable(10,20,30);
        c4.sum();
    }
}

먼저 출력은 다음과 같다.

60
70
실행결과는!!! 뚜둥 = 120
한번더 출력!120
실행결과는!!! 뚜둥 = 60
한번더 출력!60

 

 

우리에게 경계심을 주는 것들을 우선 나열해 보면...

1.

multipliable c3 = new multipliable(80,40);
c3.sum();

multipliable c4 = new multipliable(10,20,30);
c4.sum();

맨아래에 인스턴스를 두개 만들었는데 c3는 인자를 2가지의 수를 입력 받고 c4는 3가지를 입력받는다.

 

2.

public multipliable(int left,int right){
        super(left,right);
    }
    public multipliable(int left,int right,int more){
        super(left,right,more);
class subtractable extends HCalculator{
    public subtractable (int left, int right){
        super(left,right);
    }
    public subtractable (int left, int right, int more){
        super(left,right,more);
    }
public HCalculator(int left, int right){
    this.left = left;
    this.right = right;
}
public HCalculator(int left, int right, int more){
    this.left = left;
    this.right = right;
    this.more = more;
}

 

부모 자식쪽 생성자에도 매개변수를 두개 받는 녀석이 있고 세개 받는 녀석도 생겼다.

 

3.

class multipliable extends subtractable
{
    public void sum(){
        System.out.println("실행결과는!!! 뚜둥 = " + (this.left +this.right+this.more));
        System.out.printf("한번더 출력!"); super.sum();
    }

 

여기에 sum() 메서드에 글씨가 추가 되었고 super.sum(); 이라는 이상한것도 생기고 결론은 메서드가 수정이 된뒤에 의미가 재정의 되었다.

 

4.

public void sum() {
    System.out.println(this.left + this.right+this.more);
}

sum 메서드가 한개만 있는데 3개의 수를 받는 것으로 보인다.

 

오버라이딩 이라는 것부터 살펴보면 앞에서 같은 메서드에 입력 값을 다르게 줘서 재활용 하는 것이라고 정의 하였다.

 

실제로 생성자가 이름은 같지만 두개가 만들어져서 값을 두개를 받고 세개를 받는것을 알수 있다. 이게 오버로딩이다. 오버로딩을 하기위해선 위와 같이 예시로 클래스 안에 매개변수를 두개 받는 메서드와 세개 받는 메서드를 만들어 주고 인스턴스 에서 인자값을 두개 혹은 세개를 넣어주면 자바에서 알아서 메서드를 사용한다.

 

 

예를들어 sum 함수에는 this.more 까지 3개를 입력 받는것이 보일것이다 그런데 c3에서는 80과 40의 숫자만 집어 넣는데 

multipliable c3 = new multipliable(80,40);
c3.sum();

multipliable c4 = new multipliable(10,20,30);
c4.sum();

그러면 자바에서 알아서 sum 메서드에서

public void sum() {
    System.out.println(this.left + this.right+this.more);
}

마지막 부분인 this.more을 탈락 시킨다던지 

public HCalculator(int left, int right){
    this.left = left;
    this.right = right;
}
public HCalculator(int left, int right, int more){
    this.left = left;
    this.right = right;
    this.more = more;
}

생성자가 두가지가 있지만 위에껄 사용하는 것이다.

 

주의할점이 오버로딩은 말그대로 쌓는것이기 때문에 작은범위에서 큰범위로 확장해 나가야 한다. 위에 예시에서 c4가 c3보다 먼저 선언이 되면 c3는 c4의 값으로 덮히게 될 것이다. (둘다 60이 출력될 것이다.)

 

------------------------------------------------------------------------------------------------------------------------------------

 

오버라이딩은 설명이 적다.

 

class multipliable extends subtractable
{
    public void sum(){
        System.out.println("실행결과는!!! 뚜둥 = " + (this.left +this.right+this.more));
        System.out.printf("한번더 출력!"); super.sum();
    }

자식은 extends를 통해 이미 sum의 기능을 사용할수 있는데 부모로 부터 sum 함수를 자식이 가지고 왔다. 그러면 자식은 부모의 sum을 더이상 사용하지 않고 부모로 부터 직접 가져온 sum함수를 사용하게 되는데 sum함수는 가져온 목적에 맞게 수정을 한뒤에 사용되게 된다. 이게 오버라이딩 이다.

 

추가로 super.sum();이 보일것이다. super.메서드를 입력하면 간편하게 메서드를 가지고 올수 있다.

 

------------------------------------------------------------------------------------------------------------------------------------

 

또한 위에서 오버로딩은 상속에서만 사용하는것이 아니라고 했는데... 다른 코드를 만들어 봤다.

 

class exemple {
    int left, right,more;

    public void enter(int left, int right) {
        this.left = left;
        this.right = right;
    }
    public void enter(int left, int right, int more) {
        this.enter(left, right);
        this.more = more;
    }
    public void sum(){
        System.out.println("계산 결과는 = "+(this.left + this.right + this.more));
    }
}
public class hehe {
    public static void main(String[] args) {
        exemple c1 = new exemple();
            c1.enter(10,20);
            c1.sum();
            c1.enter(10,20,30);
            c1.sum();
    }
}

실행 결과는 다음과 같다.

계산 결과는 = 30
계산 결과는 = 60

 

여기서 새로운 점이.

public void enter(int left, int right, int more) {
    this.enter(left, right);
    this.more = more;
}

이부분일 것이다.

 

중복을 피하기 위해 자기 자신을 호출하면 저렇게 줄일수가 있다.(두개가 아니라 천개라고 생각해보자)

 

또한 마지막 예시는 상속과는 관련이 없다. 그래서 오버로딩은 상속과는 굳이 관련이 없다고 하는것이다.(상속에서도 쓰이지만)

'자바 > 정리' 카테고리의 다른 글

(JAVA)캡슐화 (접근제어자)  (0) 2022.11.13
(JAVA)객체지향  (0) 2022.11.12
(JAVA)상속2  (0) 2022.11.11
(JAVA)상속  (0) 2022.11.10
(JAVA)생성자  (0) 2022.11.10