본문 바로가기

책 공부/자바의 신

오버로딩(overloading) vs 오버라이딩(overriding)

반응형
overloading vs overriding

overloading

오버로딩 사전적 의미로는 "과적하다, 너무 많이 부하를 주다"라는 뜻이다. 이걸 자바에 대입해 보자면 하나의 메소드 이름을 사용하면서 여로 기능을 제공한다는 의미로 해석할 수 있고, 하나의 메소드 이름으로 많은 부하를 준다고도 볼 수 있다.

 

오버로딩은 메소드들은 모두 이름이 동일하지만 각 메소드 매개변수의 종류와 개수, 순서가 다르다.

여기서 매개변수의 개수가 같더라도 타입의 순서가 다르다면 다른 메소드로 인식한다. ( 중요! 매개 변수의 이름이 아니라 매개 변수의 타입)

타입이 다르다면 다른 메소드로 인식하지만 타입이 같다면 같은 메소드로 인식한다.

+ return type, 접근 제어자는 영향을 주지 않는다.

public class Main
{
	public void print(int date){
	    
	}
	
	public void pirnt(String name){
	    
	}
    	// error: method print(int) is already defined in class Main
	public void print(int age){ 
	    
	}
}

overloading은 같은 역할을 하는 메소드는 같은 이름을 가져야 한다는 모토로 사용되었다. 이점을 기억하면 쉽게  overloading의 개념을 이해할 수 있을 것이다. (생성자도 overloading처럼 매개 변수가 다르면 다르게 인식한다.)

 

 

상속

extend라는 자바의 예약어를 사용하며 사용자가 원하는 클래스를 상속받는다. 상속은 하나의 클래스를 만들어 놓고 추가적인 부분을 넣을 때 새로운 클래스를 만들고 기본 기능이 있는 클래스를 상속받아 기본 기능은 따로 구현하지 않고 사용자가 원하는 추가적인 기능만을 구현하면 된다는 장점과 하나의 메소드에 문제가 발생할 경우 그 메소드를 하나하나 수정하는 것이 아니라 부모 클래스에서 문제가 되는 메소드만 수정하면 매우 빠르게 문제를 해결할 수 있다. 상속을 사용하는 이유를 쉽게 말하자면 배우지 않아도 되는 것들(공통으로 구형해야 하는 기능)이 바로 자바에서는 부모 클래스에 있는 변수와 메소드라고 생각하고 해당 부분을 상속만 받고 사용이 가능하게 만드는 것이다.

 

class Parent{
    String name;
    public Parent(){ // 자식 클래스의 모든 생성자가 실행 될 때 부모 클래스의 기본 생성자를 찾는다.
        System.out.println("Parent basic Constructor");
    }
    public Parent(String name){
        this.name=name;
        System.out.println("Parent Constructor");
    }
    public void setName(String name){
        this.name = name;
    }
    public void printName(){
        System.out.println("Name: "+ name);
    }
}
 
class Child extends Parent{

    public Child(){
    }
    public Child(String name){
        this.name = name;
        System.out.println("Child Constructor");
    }
    public void setName(String name){
        this.name = name;
        System.out.println("Child setName");
    }
}
public class Main {
 
    public static void main(String[] args){
        Child child=new Child("JIWON");
        child.printName();
        child.setName("YUKANG");
        child.printName();
    }
}

결과 

Parent basic Constructor
Child Constructor
Name: JIWON
Child setName
Name: YUKANG

상속의 특징

  1. 부모 클래스에서 기본 생성자를 만들어 놓는 것 이외에는 상속을 위해서 아무런 작업을 할 필요가 없다.

    부모 클래스에서 기본 생성자가 반드시 필요한 이유는?
    자식 클래스의 모든 생성자가 실행될 때 부모 클래스의 기본 생성자를 찾는데 부모의 기본 생성자가 존재하지 않아 기본 생성자를 찾을 수 없기 때문에 오류가 발생한다.

    해결방법
    부모 클래스에 매개 변수가 없는 기본 생성자를 만든다.
    자식 클래스에서 부모 클래스의 생성자를 명시적으로 지정하는 super()를 사용한다. (부모 클래스의 생성자를 명시적으로 호출)
  2. 자식 클래스는 클래스 선언 시 extends 다음에 부모 클래스 이름을 적어줘야 한다.

  3. 자식 클래스의 생성자가 호출되면, 자동으로 부모 클래스의 매개 변수 없는 생성자가 실행된다.

  4. 자식 클래스에서 부모 클래스에 있는 public, protected로 선언된 모든 인스턴스, 클래스 변수, 메소드를 사용할 수 있다.

 

상속관계를 보다 유연하게 활용하기 위해서 overriding을 사용한다.

 

overriding이란?

오버라이딩은 단어의 사전적 의미는 다른 무엇보다 더 중요한, 최우선시되는 이라는 뜻이다. 자바에서는 자식 클래스에서 부모 클래스에 있는 메소드와 동일하게 선언하는 것을 overriding이라고 한다. (접근 제어자, 리턴 타입, 메소드 이름, 매개 변수 타입 및 개수가 모두 동일해야 한다.)

 

 

 

overriding의 특징

  1. 메소드 Overring은 부모 클래스의 메소드와 동일한 시그니처를 갖는 자식 클래스의 메소드가 존재할 때 성립된다.
    부모 클래스에서 오버라이딩한 메소드를 자식 클래스에서 수정한다면 오류가 발생한다. ( ~ cannot override method in ~)

  2. Overriding 된 메소드는 부모 클래스와 동일한 리턴 타입을 가져야 한다.

  3. Overriding 된 메소드의 접근 제어자는 부모 클래스에 있는 메소드와 달라도 되지만 접근 권한이 확장되는 경우에만 허용된다.
    (접근 권한이 축소될 경우 부모 public -> 자식 private 일 경우 컴파일 에러가 발생한다. weaker access privileges)

부모 자식 생성자의 타입을 알 수 있는 instanceof

 

자식 타입의 객체를 부모 타입으로 형 변환을 할 때에는 명시적으로 타입을 지정해 주어야 한다.

instanceof 예약어를 사용하면 객체 타입을 확인할 수 있다.

instanceof 예약어로 타입을 확인할 때에는 자식 타입 instanceof 부모 타입도 true로 반환하기 때문에 가장 하위에 있는 자식 타입부터 확인해야 제대로 된 타입 점검이 가능하다.

 

public class CheckParent{
	public static void main(String[] args){
        // Child child=new Child("JIWON");
        // child.printName();
        // child.setName("YUKANG");
        // child.printName();
        
        Parent parent = new Parent();
        Child child = new Child();
        
        if(parent instanceof Parent){
        	System.out.println("Parent");
        }
        if(child instanceof Parent){
        	System.out.println("Child in Parent");
        }
        if(child instanceof Child){
        	System.out.println("Child");
        }
    }
}

결과

Parent basic Constructor
Parent basic Constructor
Parent
Child in Parent
Child

 

overriding 정리
  • 자식 클래스에서 메소드를 부모 클래스에 선언된 메소드들이 자신의 클래스에서 선언된 것처럼 사용할 수 있다.
  • 부모 클래스에 선언된 메소드와 동일한 시그니처를 사용함으로써 메소드를 overriding 할 수 있다.
  • 자식 클래스에서 부모 클래스에 선언되어 있지 않은 이름의 새로운 메소드를 선언할 수 있다.

 

 

 

overloading과 overriding의 차이점

overloading은 확장의 개념(매개 변수들의 확장)으로 overriding은 덮어쓰기(부모 클래스의 메소드를 복제하여 자식 클래스에서 새로운 메소드 형식으로 사용)로 한 줄 정리가 될 것이다.

 

반응형

'책 공부 > 자바의 신' 카테고리의 다른 글

interface 와 abstract class  (0) 2024.03.12
Java에서 this란 무엇인가?  (0) 2022.09.01
java final 알아보기  (1) 2022.08.29
자바의 신 기본 정리  (0) 2022.08.14