오버로딩(Overloading) & 오버라이딩(Overriding)

2023. 5. 8. 14:50· Java/객체 지향
목차
  1. 오버로딩
  2. 오버라이딩
  3. 오버로딩 vs 오버라이딩

오버로딩

하나의 클래스 안에 같은 이름의 메소드 여러개를 정의하는것

대표적인 오버로딩으로 println이 있다.

println ( ) 안에 있는 타입을 자동적으로 인식하고 그것을 판별하여 출력한다

 

오버로딩이 성립하기 위한 조건

  1. 메소드 이름이 같아야한다.
  2. 매개변수의 갯수 또는 타입이 달라야한다.
  3. 반환 타입은 영향이 없다.
int add(int a, int b) { return a+b; }
int add(int x, int y) { return x+y; }

메소드 이름이 같다. 매개변수의 갯수와 타입이 같다. 타입은 상관없다 == 오버로딩이 아니다

int add(int a, int b) { return a+b; }
long add(int a, int b) { return (long)(a+b); }

메소드 이름이 같다. 매개변수의 갯수와 타입이 같다. 타입은 상관없다 == 오버로딩이 아니다

long add(int a, long b) { return a+b; }
long add(long a, int b) { return a+b; }

메소드 이름이 같다. 매개변수의 갯수는 같지만 타입이 다르다. 타입은 상관없다 == 오버로딩이 맞다
하지만 여기선 타입이 중요하다. add(3,3)이라고 적는다면 둘중 어느 메소드를 부른지 모호해진다.
그것을 ambiguous라고 한다

 

오버로딩의 적절한 예

class MyMath3 {
    int add(int a, int b) {
        System.out.print("int add(int a, int b) - ");
        return a+b;
    }
    
    long add(long a, long b) {
        System.out.print("long add(long a, long b) - ");
        return a+b;
    }
    
    int add(int[] a) {
        System.out.print("int add(int[] a) - ");
        int result = 0;
        for(int i = 0; i < a.length; i++) {
            result += a[i];
        }
        return result;
    }
}

메소드 3개의 이름이 모두 같지만 매개변수가 모두 다르다.
그럼 메소드를 사용할때 매개변수 타입에 맞게 사용한다면 해당 메소드가 호출되며 사용된다.

오버라이딩

  • 상속받은 조상의 메소드를 자신에 맞게 변경하는것
class Point {
    int x;
    int y;
    
    String getLocation() {
        return "x :" + x + ", y :" + y;
    }
}

class Point3D extends Point {
    int z;
    
    String getLocation() {
        return "x :" + x + ", y:" + y + ", z :" + z;
    }
}
멤버가 z가 생기면서 Point의 getLocation은 Point3D와 맞지 않는 메소드가 되었기때문에 변경이 필요하다

선언부는 변경이 불가능하고 구현부에 적힌 내용만 변경이 가능하다

오버라이딩의 조건

  1. 선언부(반환타입, 메소드 이름, 매개변수 목록)가 조상 클래스의 메소드와 일치해야한다.
  2. 접근제어자를 조상 클래스의 메소드보다 좁은 범위로 변경 할 수 없다.
  3. 예외는 조상 클래스의 메소드보다 많이 선언할 수 없다.

오버로딩 vs 오버라이딩

  • 오버로딩 = 기존에 없는 새로운 메소드를 정의하는것(new)
  • 오버라이딩 = 상속받은 메소드의 내용을 변경하는것(change, modify)
class Parent {
    void parentMethod() {}
}

class Child extends Parent {
    void parentMethod() {}       // 오버라이딩
    void parentMethod(int i) {}  // 오버로딩
    
    void childMethood() {}       // 메소드 정의
    void childMethood(int i) {}  // 오버 로딩
    void childMethood() {}       // 중복 정의 , 에러
}

 

'Java > 객체 지향' 카테고리의 다른 글

제어자와 캡슐화  (0) 2023.05.09
생성자(ft. this, super)  (0) 2023.05.08
호출 스택(call stack)  (0) 2023.05.08
메소드(ft . return 문)  (0) 2023.05.08
변수의 종류  (0) 2023.05.08
  1. 오버로딩
  2. 오버라이딩
  3. 오버로딩 vs 오버라이딩
'Java/객체 지향' 카테고리의 다른 글
  • 제어자와 캡슐화
  • 생성자(ft. this, super)
  • 호출 스택(call stack)
  • 메소드(ft . return 문)
늦은산책
늦은산책
늦은산책
중얼중얼블로그
늦은산책
전체
오늘
어제
  • 분류 전체보기
    • 오류 모음집
    • CS
      • 💾 자료구조
      • 👫🏼 정렬
      • 🖥 네트워크
      • 💻 운영체제
      • 💾 DB
      • 🌌 알고리즘
      • 📝 언어
    • 테스트
    • Git 초보에게 필요한 Git bash사용법
    • 프로젝트
      • 팀 프로젝트
      • 개인 프로젝트
      • 항해99 개인 프로젝트
      • 스위프 프로젝트(Lit Map)
    • Java
      • 객체 지향
    • Spring
      • 🌲 Spring
      • 👨‍💻 SpringSecurity
      • 🌵 JPA
    • MSA
      • MSA 강좌 - 이도원 강사님
    • Docker(도커)
    • 코딩테스트
      • 🧮 프로그래머스
      • 🎲 백준
    • 항해99
      • 🕛 1주차
      • 🕐 2주차
      • 🕑 3주차
      • 🕒 4주차
    • AWS
    • CI와CD

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 취업리부트코스
  • 개발자취업
  • 개발자포토폴리오
  • 카우치코딩_포트폴리오_멘토링
  • 개발자포트폴리오
  • 항해99
  • 코딩테스트
  • 카우치코딩_팀프로젝트
  • 개발자취준
  • couchcoding
  • 취리코
  • 카우치코딩
  • 개발자이력서

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
늦은산책
오버로딩(Overloading) & 오버라이딩(Overriding)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.