ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 오버로딩(Overloading)이란?
    Java 2022. 1. 5. 00:01

    오버로드(Overload)란?

    Overload를 번역하면 초과 적재라는 뜻을 가지고 있는데 자바에서 오버로드란 어떤 의미로 사용되는 걸까요?

    변수와 메서드의 차이점을 보면서 알아보겠습니다.

     

    보통 변수와 달리 하나의 클래스에 동일한 이름의 메서드를 여러 개 정의할 수 있습니다.

    하지만 변수 이름이 동일한 경우는 허용하지 않습니다.

     

    변수의 이름이 동일한 경우

    public class Employee {
    	
        int age;
        String name;
        char grade;
        String grade;
    }

    char grade와 String grade는 데이터 타입이 다르지만 변수명이 동일하여 에러가 발생합니다.

    클래스 안에 동일한 이름의 변수를 사용했을 때, 프로그램이 모호해지기 때문입니다.

     

    메서드의 이름이 동일한 경우

    public class Employee{
    	int age;
        String name;
        
        void setEmployee(String name, int age){
        	this.name = name;
            this.age = age;    
        }
        
        void setEmployee(String name){
        	this.name = name;
        }
        
        void setEmployee(){
        	name = "No name";
            age = 0;
        }
    }

    매개변수만 다르게 설정한 setEmployee라는 메서드를 여러개 정의하였습니다. 하지만 에러가 발생하지 않습니다.

    메서드의 경우는 변수와 다르게 동일한 이름으로 여러 개 정의할 수 있습니다.

    매개변수의 개수와 타입을 통해 실행될 메서드를 구분할 수 있기 때문입니다.

     

    이를 메서드 오버로딩이라 합니다.

     

    메서드 오버로딩이란?

    하나의 클래스에 동일한 이름의 메서드가 여러개 중복되어 정의되는 것입니다.

    매개변수의 개수와 타입만 다르다면 다른 메서드로 인식합니다.

     

    그러면 메서드 오버로딩이 필요한 이유는 무엇일까요?

    예를 들어 데이터 타입을 모르는 어떤 데이터의 출력 메서드를 정의하려고 합니다.

    자바의 경우는 데이터 타입이 존재하기 때문에 아래와 같이 데이터 타입별로 메서드가 필요합니다.

    public void printInt(int data){
    	//data 출력 로직
    }
    public void printDouble(double data){
    	//data 출력 로직
    }
    public void printChar(char data){
    	//data 출력 로직
    }
    public void printString(String data){
    	//data 출력 로직
    }

    만약 이처럼 데이터 타입별로 printXXX() 메서드를 각각 정의한다면 아래와 같은 문제점이 나타납니다.

    메서드의 이름을 절약할 수 없습니다.

    공통된 로직이지만 모두 개별적으로 작성하였기 때문에 코드의 재사용성이 어렵습니다.

    또한 메서드를 호출하는 과정에서 많은 수정이 필요합니다.

    예를 들어 data 45를 출력하기 위해서는 printInt(45)를 호출해야 하지만 data 45.23을 출력하기 위해서는 printDouble(45.23)으로 메서드를 전부 변경하여야 합니다.

    이것이 1~2개라면 관계없겠지만 100개의 printInt() 메소드의 이름을 일일히 printDouble로 수정하려면 매우 힘든 작업이 됩니다.

     

    위의 코드에 메서드 오버로딩 개념을 적용해보겠습니다.

    public void printData(int data){
    	//data 출력 로직
    }
    public void printData(double data){
    	//data 출력 로직
    }
    public void printData(char data){
    	//data 출력 로직
    }
    public void printData(String data){
    	//data 출력 로직
    }

    모든 메서드의 이름을 printData로 변경하였습니다.

    이를 통해 메서드의 이름을 절약할 수 있습니다.

    또한 데이터 타입이 바뀌더라도 메서드를 호출하는 코드를 수정할 필요가 없어졌습니다.

    저희가 많이 평소에 사용했던 System.out.println()메소드 또한 이미 이 개념을 적용해서 사용중이였습니다.

     

     

     

     

    객체 지향의 특징중 하나인 다형성이 오버로딩을 통해 가능해집니다.

    다형성이란 하나의 함수명이 상황에 따라 다른 의미로 해석 될 수 있음을 의미합니다.

    'Java' 카테고리의 다른 글

    [Java] 내부 클래스란?  (0) 2022.01.11
    [Java] 상속(Inheritance)이란?  (0) 2022.01.06
    [Java] 자바 Enum이란?  (0) 2022.01.01
    [Java] 제네릭/지네릭스(Generics)란?  (0) 2021.12.30
    [Java] 어노테이션(Annotation)  (0) 2021.12.20

    댓글

Designed by Tistory.