JAVA (오버로딩과 오버라이딩) 💻

12071 단어 JavaJava

DAY7


1.메서드 오버로딩과 오버라이딩

1) 메서드 오버로딩(method overloading)

메소드 오버로딩(overloading)이란 같은 이름의 메소드를 중복하여 정의하는 것을 의미합니다.

자바에서는 원래 한 클래스 내에 같은 이름의 메소드를 둘 이상 가질 수 없습니다.

하지만 매개변수의 개수나 타입을 다르게 하면, 하나의 이름으로 메소드를 작성할 수 있습니다.

즉, 메소드 오버로딩은 서로 다른 시그니처를 갖는 여러 메소드를 같은 이름으로 정의하는 것이라고 할 수 있습니다.

이러한 메소드 오버로딩을 사용함으로써 메소드에 사용되는 이름을 절약할 수 있습니다.

또한, 메소드를 호출할 때 전달해야 할 매개변수의 타입이나 개수에 대해 크게 신경을 쓰지 않고 호출할 수 있게 됩니다.

메소드 오버로딩은 객체 지향 프로그래밍의 특징 중 하나인 다형성(polymorphism)을 구현하는 방법 중 하나입니다.

메소드 오버로딩의 대표적인 예로는 println() 메소드를 들 수 있습니다.

println() 메소드는 전달받는 매개변수의 타입에 따라 다음과 같이 다양한 원형 중에서 적절한 원형을 호출하게 됩니다..

ex)
sum (int x, int y) & sum (int a, int b)
sum (int x, int y) & sum (double a, double b)
sum (int x, int y) & sum (double a, int b)

🔷 JAVA에서 메서드를 구분하는 방법?

(1) 메서드명
(2) 매개변수의 개수
(3) 메서드의 반환타입
🡪 반환타입(리턴타입)”만” 다른건 얄짤없이 안됩니다.

✅ 여기서 잠깐

[static]

-객체 생성없이 바로 사용 가능하도록 만들어 준다.
-즉 보통의 경우 객체를 만들고 객체.필드 또는 객체.메서드 형식을 이용하지만 static으로 지정된 필드 또는 메서드는 그냥(클래스.필드) 사용할 수 있다.

<코드 예시>

package day07;
public class replay {
	public static void main(String [] args) {
		replay R = new replay();
		System.out.println(R.print(10));
		R.sum(1,2);
		R.sum(1,2.0);
		R.sum(1.0,2.0);
	}
	void print() {
		System.out.println("Hello");
	}
	int print(int a) {
		return a*2;
	}
	void sum (int x, int y) {
		System.out.println("int " + x +", int " + y);
	}
	void sum (int x, double y) {
		System.out.println("int " + x +", double " + y);
	}
	void sum (double x, double y) {
		System.out.println("double " + x +", double " + y);
	}
}
}

2) 메서드 오버라이딩(method overriding)

앞서 배운 오버로딩(overloading)이란 서로 다른 시그니처를 갖는 여러 메소드를 하나의 이름으로 정의하는 것이었습니다.

오버라이딩(overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것이라고 할 수 있습니다.

자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메소드를 상속받습니다.

이렇게 상속받은 메소드는 그대로 사용해도 되고, 필요한 동작을 위해 재정의하여 사용할 수도 있습니다.

즉, 메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것을 의미합니다.

🔷 오버라이딩의 조건

(1) 오버라이딩이란 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존     메소드와 완전히 같아야 합니다. 하지만, 메소드의 반환 타입은 부모 클래스의 반환     타입으로 타입 변환할 수 있는 타입이라면 변경할 수 있습니다.
(2) 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없습니다
(3) 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없습니다.

<코드 예시>

class Parent {
    void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}
class Child extends Parent {
    void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
}
public class InheritanceDay07 {
    public static void main(String[] args) {
        Parent pa = new Parent();
        pa.display();
        Child ch = new Child();
        ch.display();
        Parent pc = new Child();
        pc.display(); // Child cp = new Parent();
    }
}

좋은 웹페이지 즐겨찾기