PLOD

[Java] 메서드 오버로딩(overloading), 오버라이딩(overriding) 본문

개발 공부/Java

[Java] 메서드 오버로딩(overloading), 오버라이딩(overriding)

훌룽이 2022. 8. 16. 19:45

 

위의 활 그림에서 왼쪽그림을 보면 활 한개로 한번에 여러개의 같은 화살을 날리는 것을 볼수 있다. 또 오른쪽 그림을 보면  활 하나에 다른 화살(기능)을 덧붙여 화살을 날리는 것을 볼 수 있다.

 

자바의 객체지향프로그래밍의 특성 중 다형성을 지원하는 방법으로 메서드 오버로딩과 오버라이딩이 있다. 

overloding(오버로딩)은 같은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술이고 , overriding(오버라이딩)은 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의 해서 사용하는 기술이다.

 

 

 

1.overloding(오버로딩)

메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각 기 다른 이름을 가져야 한다. 그러나 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면 같은 이름을 사용해서 메서드를 정의 할 수 있다. 

오버로딩을 사용하는 이유는 같은 기능과 같은 이름을 하는 메소드를 하나의 이름으로 사용할 수 있고, 메소드의 이름을 절약하여 프로그래머가 메소드 네이밍을 하는 노력을 덜 수 있게 한다.

메소드 오버로딩은 함수명이 같고 매개 변수의 타입이나 개수가 다른 함수를 허용하는 것이다.  오버로딩을 사용하면 한 클래스 내에 같은 이름의 메서드를 여러 개 사용 할 수 있다.

오버로딩을 하기 위해서는 다음과 같은 조건을 만족해야 한다.

Ⅰ . 메서드의 이름이 같아야 한다.
Ⅱ . 매개변수의 개수 또는 타입이 달라야 한다.
class OverloadingTest {

	public static void main(String[] args) {
		OverloadingMethods om = new OverloadingMethods();

		om.print();
		System.out.println(om.print(3));
		om.print("Hello!");
		System.out.println(om.print(4, 5));
	}
}

class OverloadingMethods {
	public void print() {
		System.out.println("오버로딩1");
	}

	String print(Integer a) {
		System.out.println("오버로딩2");
		return a.toString();
	}

	void print(String a) {
		System.out.println("오버로딩3");
		System.out.println(a);
	}

	String print(Integer a, Integer b) {
		System.out.println("오버로딩4");
		return a.toString() + b.toString();
	}

}
더보기

결과 

오버로딩1

오버로딩2

3

오버로딩3

Hello!

오버로딩4

45

 

오버로딩은 함수에만 국한 되는 것이 아니라 생성자에도 사용할 수 있다. 클래스에서 생성자를 만들때 필드값을 저장하지 않도록 생성자를 만들 수 있지만(기본생성자) 필요에 따라 필드값들을 저장하는 생성자들을 만들 수 있다. 

 

class Student{
	
    private String studentName;
    private int studentNum;
    
    
    public Student(){}				//기본 생성자
    
    public Student(String studentName, int studentNum){
    	this.studentName = studentName;
        this.studentNum = studentNum;
    }

}

 

오버로딩을 사용하면 같은 기능을 하는 메서드들의 이름을 다르게 할 필요가 없이 같은 메서드 명을 사용하게 함으로써 메서드의 이름을 절약할 수 있고 오류를 줄일 수 있다. 

2.overriding(오버라이딩)

부모클래스의 메서드가 자식 클래스에도 적합하다면 그대로 사용할 수 있다. 하지만 적합하지 않다면 자식 클래스는 물려받은 메서드를 자신에게 맞도록 수정해야 하는데 이를 메서드 오버라이딩이라고 한다. 

자식 클래스가 부모 클래스의 메서드를 오버라이딩할 때는 부모 클래스의 메서드와 동일한 시그니처와 반환 타입을 가지고 부모 클래스와 메서드보다 접근 범위를 더 좁게 수정할 수 있다. 

 

public class OverridingTest {

	public static void main(String[] args) {
		Person person = new Person();
		Child child = new Child();
		Senior senior = new Senior();
		
		person.cry();
		child.cry();
		senior.cry();
	}
}

class Person {
	void cry() {
		System.out.println("흑흑");
	}
}

class Child extends Person {
	@Override
	protected void cry() {
		System.out.println("잉잉");
	}
}

class Senior extends Person {
	@Override
	public void cry() {
		System.out.println("훌쩍훌쩍");
	}
}

결과

흑흑

잉잉

훌쩍훌쩍

Comments