오버로딩과 오버라이딩

이강용·2024년 1월 31일
0

CS

목록 보기
10/109

오버로딩(Overloading)

  • 오버로딩은 같은 이름을 가진 메서드를 여러 개 가지면서 매개변수의 타입이나 개수를 다르게 하는 기법. 즉, 하나의 클래스 내에서 같은 이름의 메서드가 여러 개 있지만, 각 메서드는 서로 다른 매개변수 목록을 가짐. 오버로딩을 통해 다양한 매개변수를 받아들이는 메서드를 여러 개 만들 수 있으며, 이를 통해 메서드 호출 시 제공되는 인수에 따라 적절한 메서드가 실행 됨

pulbic class Example{
	public int add(int a , int b){
		return a + b;
	}
    
    public int add(int a , int b, int c){
		return a + b + c;
	}
    
    public int add(double a , double b){
		return a + b;
	}


}
package programmers;

class Calculator{
	void multiply(int a, int b){
		System.out.println("결과는 : "+(a * b) + "입니다."); 
	}
	void multiply(int a, int b,int c){ 
		System.out.println("결과는 : "+(a * b * c) + "입니다.");
	}
	void multiply(double a, double b){
		System.out.println("결과는 : "+(a * b) + "입니다."); 
	}
}

public class MyClass {
	
	public static void main(String[] args) {
		int a=1;
		int b=2;
		int d=4;
		Calculator c = new Calculator(); c.multiply(a, b);
		c.multiply(a, b, d);
		double aa = 1.2;
		double bb = 1.4;
		c.multiply(aa, bb);
		
	}

}
package programmers;

class Person {
	void pay(String a, int b) {
		System.out.println(a + "가 " + b + "원만큼 계산합니다.");
	}
	
	void pay(int a , String b) {
		System.out.println(b + "가 " + a + "원만큼 계산합니다.");
	}
}

public class MyClass {
	
	public static void main(String[] args) {
		
		Person c = new Person();
		c.pay("영주", 100_000_000);
		c.pay(100_000_000, "영주");
		
	}

}


오버라이딩(Overriding)

  • 오버라이딩은 하위 클래스가 상위 클래스의 메서드를 재정의하는 기법. 상속 관계에 있는 클래스 간에 발생하며, 하위 클래스는 상위 클래스의 메서드와 같은 이름, 같은 매개변수 목록을 가진 메서드를 제공하여 상위 클래스의 구현을 새로운 구현으로 대체함. 이를 통해 다형적 행위를 달성할 수 있음. 즉, 같은 메서드 호출이지만 객체의 실제 타입에 따라 다른 동작을 수행하게 할 수 있음
class Animal {
    public void sound() {
        System.out.println("The animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("The dog barks");
    }
}

상속

package programmers;

class Animal {
	void eat() {
		System.out.println("먹습니다.");
	}
}

class Person extends Animal {
	@Override
	void eat() {
		System.out.println("맛있게 먹습니다.");
	}
}

public class MyClass {
	
	public static void main(String[] args) {
		
		Person a = new Person();
		a.eat();
		
		
	}

}

구현

package programmers;

interface Animal {
	public void eat();
}

class Person implements Animal {
	@Override
	public void eat() {
		System.out.println("맛있게 먹습니다.");
	}
}

public class MyClass {
	
	public static void main(String[] args) {
		
		Person a = new Person();
		a.eat();
		
		
	}

}

interface 메서드는 왜 public을 사용해야 하는가?

  • 인터페이스 내의 모든 메서드는 기본적으로 public이고 abstract입니다. 즉, 인터페이스를 구현하는 모든 클래스는 이 메서드들을 public 접근 제한자를 사용하여 구현해야 합니다.

  • 이는 인터페이스가 정의하는 메서드가 계약(contract)의 일부이기 때문입니다. 계약을 준수하기 위해서는 구현된 모든 메서드가 인터페이스에서 약속한 대로 외부에 공개(public)되어야 합니다.

  • 클래스가 인터페이스의 메서드를 구현할 때 public을 생략하면, 메서드는 디폴트 접근 제한자를 가지게 되고, 이는 인터페이스에서 요구하는 public보다 더 제한적인 접근 수준이므로 오류가 발생합니다.

profile
HW + SW = 1

0개의 댓글