[JAVA] 오버로딩(Overloading)과 오버라이딩(Overriding)

yurinnn·2023년 12월 8일
0

Java/Spring

목록 보기
6/13

🔵 오버로딩 - Overloading (과적)

메소드 이름을 동일하게 사용하여 동일한 기능을 다양한 방식으로 제공할 수 있다.
매개 변수의 개수나 타입(유형)이 달라야 한다.
(반환(return) 타입은 오버로딩 구현에 아무런 영향이 없다)

  • 원래 한 클래스 안에는 하나의 생성자만 있어야 하지만, 초기화 방법에 따라 여러 클래스를 만들어야하는 불편함이 생겨서 이를 가능하게 만들었다.
  • 오버로딩의 대표적인 메소드 : println()

📍 메소드 오버로딩 (method overloading) :

중복된 이름의 메소드를 사용할 수 있는 방식, 매개 변수의 개수나 타입(유형)이 달라야 한다.

  • new 를 쓰고 ctrl+space 하면 같은 string 이름으로 여러 형태가 나오는데 이걸 overload 오버로드 라고 한다.

예시 1)

Overloading 클래스
동일한 print 메소드 생성하기

class Overloading(){
	// 기준 메소드 
	void print(int a){
    	System.out.println(a);
    }
    
    // 메소드명 동일, 매개 변수 타입 다름
    void print(String s){
    	System.out.println(s);
    }
	
    // 메소드명 동일, 매개 변수 개수 다름
	void print(int a, int b){
    	System.out.println(a*b);
    }
	
    // 메소드명 동일, 매개 변수 타입,개수 다름
    void print(String s, int a){
    	System.out.println(s+a);
    }
}

예시 2) 메소드 오버로딩

Person 클래스
setInfo로 메소드명은 같으나 String name, int age, String name, int age로 매개변수가 각기 다르다.

class Person {
    String name;
    int age;

    void setInfo(String name) {
        this.name = name;
    }

    void setInfo(int age) {
        this.age = age;
    }

    void setInfo(String name, int age) {
        setInfo(name);
        setInfo(age);
    }
    
    // 인스턴스 메서드
    String getInfo() {
        return String.format("내 이름은 %s이고 나이는 %d이다.", name, age);
    }
}

Main 클래스

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setInfo("마리아", 16);

        System.out.println(person.getInfo());
    }
}
// 결과 : 내 이름은 마리아이고 나이는 16이다.

예시 3) 잘못된 메소드 오버로딩

Person 클래스

class Person {
    String name;
    String sex;

    void setInfo(String name) {
        System.out.println(name);
    }

    void setInfo(String sex) {
        System.out.println(sex);
    }
}

Main 클래스
person.setInfo("남성임")String nameString sex 중 어떤 메서드를 호출하려는지 알 수가 없다.

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setInfo("남성임"); 
    }
}

// 결과 : 오류 발생

📍 생성자 오버로딩 (constructor overloading) :

중복된 이름의 생성자를 사용할 수 있는 방식, 매개 변수의 개수나 타입(유형)이 달라야 한다.

예시 1) 생성자 오버로딩

Person 클래스
생성자 명은 Person 으로 동일하지만, 각각 String name, int age, String name, int age로 매개변수가 다르다.

class Person {
    String name;
    String sex;
    int age;
    
    Person(String name) { 
        this.name = name;
    }

    Person(int age) {
        this.age = age;
    }

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
Person person1 = new Person("Ruby");
Person person2 = new Person(27);
Person person3 = new Person("Alice, 22");

예시 2) 잘못된 생성자 오버로딩

Person 클래스

String A, int B 라는 동일한 자료형과 개수를 가진 매개변수가 선언되었다. new Person("여성임", 34)Person(String name, int age)를 호출한 것인지 Person(String sex, int age)를 호출할 것인지 알 수 없다.

class Person {
    String name;
    String sex;
    int age;
     
    Person(String name, int age) { 
        this.name = name;
        this.age = age; 
    }

    Person(String sex, int age) { 
        this.sex = sex;
        this.age = age;
    }
}
Person person = new Person("여성임", 34);

🔵 오버라이딩 - Overriding

상속받은 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 재정의하는 것 (private 제외)
메소드명, 매개 변수의 개수, 매개 변수 타입(유형)이 같아야한다.

  • @Override 라는 어노테이션을 사용한다.
  • 부모 메소드의 예외와 같거나 예외의 개수를 줄일 수 있다. 자식 클래스에서는 부모 클래스의 예외보다 더 큰 범위의 예외를 throw 할 수 없다.
  • 접근 제한자는 부모 클래스의 메소드와 같거나 더 큰 범위어야 한다.

예시 1)

Person 클래스

class Person{
	void practice(){
    	System.out.println("Person 클래스의 practice() 메소드");
    }
}

Student 클래스
Person 클래스를 상속받는다.

class Student extends Person(){
	@Override
    public void practice(){
    	System.out.println("Student 클래스의 practice() 메소드");
    }
}

Main 클래스
Person, Student 클래스를 객체화하여 메소드 호출하기

public class test{
	public static void main(String[] args){
    	Person p = new Person();
        Student st = new Student();
        
        p.practice();
        st.practice();
    }
}

🔵 오버로딩과 오버라이딩 구분하기!

profile
슬기로운 개발 생활

0개의 댓글