Java 다형성과 오버로딩, 오버라이딩

Gom La·2023년 5월 15일

자바

목록 보기
2/2
post-thumbnail

🍃 Java 다형성

✔️ 다형성 이란 하나의 함수, 클래스가 다양한 방법으로 동작하는 것을 말한다. Java에서는 주로 오버로딩(Overloading)과 오버라이딩(Overriding) 을 통해서 다형성을 지원한다.

🌱 오버로딩(Overloading) : 확장

✔️ 함수가 여러개의 동일한 이름을 가지며 매개변수의 유형개수 가 다르게 설정되어 사용하는 것을 의미한다.

✔️ 오버로딩은 함수 오버로딩생성자 오버로딩 이 있으며 실제 적용되는 것은 같다. 같은 이름의 함수를 여러 개 정의하고, 매개변수의 유형과 개수를 다르게 하여 다양한 유형의 호출에 응답할 수 있게 하는 방식이다.(일반적으로 하나의 클래스 안에 동일한 이름의 함수를 작성하게 되면 에러가 발생한다.)

➤ 오버로딩 예제

public class Overloading {
    
    public void overloading() {
        System.out.println("매개변수 없는 함수");
    }

    public void overloading(int a, int b) {
        System.out.println("int형 인자 2개를 요청하는 함수: " + a + ", " + b);
    }

    public void overloading(String str) {
        System.out.println("String형 인자 1개를 요청하는 함수: " + str);
    }
}

public class App {
    public static void main(String[] args) throws Exception {
        Overloading old = new Overloading();
        old.overloading();
        old.overloading(2, 3);
        old.overloading("문자형 오버로딩 함수");
    }
}

➤ 오버로딩 특징
✔️ 오버로딩의 특징은 접근 제어자를 자유롭게 지정할 수 있다.

  • 오버로딩된 각 함수의 접근 제어자를 public, default, protected, private으로 다르게 지정해줘도 무관한다. 하지만 같은 매개변수 개수와 타입을 가지면서 접근 제어자만 다르게 한다고 오버로딩이 되지는 않는다.
  • 매개변수는 동일하고 반환 타입이 다른 경우는 오버로딩이 성립되지 않는다.

➤ 오버로딩을 사용하는 이유

  • 같은 기능을 하는 함수를 하나의 이름으로 사용할 수 있다.
  • 함수의 이름을 절약할 수 있다.

✔️ 많이 사용하는 println() 함수는 오버로딩 되어 있기 때문에 int형, String형, boolean형, char형 인자 모두 받아서 동작할 수 있다.
✔️ 만약 오버로딩을 이용하지 않는다면 printlnInt(), printlnString() 등 각각 함수의 이름을 따로 만들어줘야 한다.

🌱 오버라이딩(Overriding) : 재정의

✔️ 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 것을 의미한다.

✔️ 상위 클래스가 가지고 있는 멤버 변수가 하위 클래스로 상속되는 것처럼 상위 클래스가 가지고 있는 함수도 하위 클래스로 상속되어 하위 클래스에서 사용할 수 있다.

  • 상속받은 함수를 그대로 사용할 수 있고, 필요에 따라 재정의하여 사용할 수 있음
class Parent {
    public void overriding() {
        System.err.println("부모 메서드 내용");
    }
}

class Child extends Parent{
    @Override
    public void overriding() {
        super.overriding();
        System.err.println("부모 클래스의 함수를 상속받은 함수");
    }
}

public class App {
    public static void main(String[] args) throws Exception {
        Parent parent = new Parent();
        parent.overriding();

        Child child = new Child();
        child.overriding();
    }
}

➤ 오버라이딩 특징

  • 상위 클래스의 함수보다 접근 제어자를 더 좁은 범위로 변경할 수 없다.
  • 상위 클래스의 함수보다 더 큰 범위의 예외를 선언 할 수 없다.
  • 상위 클래스의 static 함수는 클래스에 속하는 함수이기 때문에 상속되지 않고 오버라이드 되지도 않는다.(static 함수는 다형성이 적용되지 않는다.)
  • final이 지정된 함수 역시 오버라이드를 할 수 없으며, private 접근 제어자를 가진 함수는 상속 자체가 불가능하다.

➤ @Overrde 어노테이션❗️
✔️ @Override 어노테이션이 적용되지 않은 상태에서는 전에 오버라이드 한 메서드가 업데이트 이후 그냥 추가적인 메서드로 인식되어 컴파일 오류가 발생하지 않는다. 이때 @Override 어노테이션을 적용함으로써 의도적으로 컴파일 오류를 일으켜 작동방식이 바뀌는 것을 대비할 수 있다.

✔️ 또한 @Override를 표시함으로써 코드 리딩 시에 해당 메서드가 오버라이딩하였다는 것을 쉽게 파악할 수 있다는 장점이 있다.

profile
인생 개발자 라곰!!

0개의 댓글