본문 바로가기
Java

[Java] 오버로딩 vs 오버라이딩

by 김yejin 2022. 8. 10.

오버로딩 vs 오버라이딩


전반적인 내용은 “자바의 정석”을 참고하여 작성하였습니다.

오버로딩 (overloading)

1. 오버로딩이란?

  • 메서드 오버로딩 (= 오버로딩) : 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것

2. 오버로딩의 조건

  • 메서드 이름 동일
  • 매개변수의 개수, 또는 타입 달라야 함 -> 반환 타입은 상관 x
  • // 같은 기능을 정의해야 한다?

3. 오버로딩의 예

// 다른 타입의 매개변수
int add(int x, int y)
int add(long x, long y)

// 매개변수의 개수 다름
void talk()
void talk(String what)

 

📌 주의

// 반환타입만(매서드 시그니처는 동일) 다를 경우, 오버로딩 X
int add(int x, int y)
long add(int x, int y) // 어떤 메서드를 호출했는지 알수 없음 -> 컴파일 에러

// 매개변수의 순서 다름, 오버로딩 o, 권장 X
int add(int x, long y)
int add(long x, int y)
// add(3,3)호출 시 둘 중 뭐 갈지 결정 불가 -> 컴파일 에러

 

4. 오버로딩의 장점

  • 같은 이름으로 여러 개의 메소드를 만듦 -> 기능 구분 -> 오류의 가능성을 낮춘다 -> 여러명이 작업 시
  • 메서드의 이름을 절약할 수 있다.

 

5. 가변인자(varargs)와 오버로딩

  • 가변인자와 오버로딩은 다르다
  • 가변인자 ( 매개변수의 개수를 동적으로 지정할 수 있는 변수)
  • 가변인자 장점
  • 가변인자 단점

 

 

오버라이딩 (overriding)

1. 오버라이딩이란?

  • 우세하다 : 자식클래스가 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
class Figure {
	Point x;
	String draw () { return x; }
}

class Circle extends Figure {
	Radius r;
	@Override
	String draw () { return x + r };
}

// 실제 java.lang 패키지
class Object {
	public String toString() { 
		return getClass().getName()+"@"+Integer.toHexString(hashCode()); }
		// hashcode 로 반환
}

class String extends String {
	@Override
	public String toString() { // 객체에 저장되어있는 값 반환}
}

❔ 상속 vs 포함

// 상속 
// 자손 은 조상 이다
class Circle extends Figure {}

// 포함
// 클래스 는 맴버변수(객체) 를 가지고 있다.
class Circle { Point p = new Point();}

2. 오버라이딩의 조건

1) 자손클래스 와 오버라이딩하는 메서드 의 조건

자손 클래스 메소드 의 선언부 = 조상 클래스 메서드 선언부

- 조상 클래스의 메서드와 이름, 매개변수, 반환타입이 같아야함.

  • 이름
  • 매개변수
  • 반환 타입 ( jdk 1.5 부터 변경 가능 : covariant return type)
📌

공변 반환 타입 (covariant return type) # covariant : 함께 변하는 - 오버라이딩 할 때 조상 메서드의 반환 타입을 자손 클래스의 타입으로 변경을 허용하는 것 - jdk 1.5 부터 가능 - ex) clone() 메서드

// clone() 메서드는 Object 클래스(모든 클래스의 조상클래스) 에 선언되어 있음

// Object 클래스의 clone()을 Point 클래스에 오버라이딩 하는 경우
class Point {
...
public Point clone() // 반환 타입을 object -> Point로 변경 : 공변 반환 타입
…
return (Point)obj; // Point 타입으로 형변환

... 
Point copy = original.clone(); // 복사할 때 형변환 안해도됨.
// Point copy = (Point)original.clone();


// 실제 array 에 구현되어있는 clone()
int[] arr = {1,2,3,4,5};
int [] arrClone = arr.clone(); // 공변 반환타입으로 형변환없이 가능

 

 

// ex) clone 예제
int[] arr = {1,2,3,4,5};
int [] arrClone = arr.clone();

// 배열은 일반적으로 같은 길이의 새로운 배열생성, System.arraycopy()  이용해 내용 복사 
int[] arr = {1,2,3,4,5};
int[] arrClone = new int[arr.length];
System.arraycopy(arr,0,arrClone,0,arr.lenght);

// tcp bytearray로 주고받는데, 
// 신분증 정보를 인증해주는 센터에 보낼때 주고받을 때, 
//bytearray로 올때, 0~10 이름 10~20 주민번호 이런식일때, 
byte[] nameArr = System.arraycopy(nameArr, ) 
// -> array의 이름부분만 넣어주려고 arraycopy  (일부분 넣어줄때)

java.util 패키지의 
Vector, ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap, Calendar, Date 
모두 복제 가능

// ArrayList 는 공변반환타입 안되어있나봐, 복사할때 형변환 해야하는지 보기 
ArrayList list2 = (ArrayList)list.clone(); // 리뷰

2) 접근제어자 조건

  • 조상 클래스의 메서드보다 좁은 범위 안됨
  • ex) 조상 이 default 면, 자손은 private 안됨 / 조상이 protected 면 자손은 default, private 안됨

3) 예외 조건

  • 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

4) 인스턴스 메서드 -> static 메서드 / static 메서드 -> 인스턴스 메서드 불가

(static -> static 은 오버라이딩이 아님)

 

 

⭐오버로딩 vs 오버라이딩

1) 오버로딩

 

2) 오버라이딩

  • 자식클래스가 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
  • 조건

3) 오버로딩 vs 오버라이딩

 

개념적

⭐ 오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것 (new) ⭐ 오버라이딩 : 상속받은 메서드의 내용을 변경하는 것 (change, modify)

 

예시)

class Parent { void parentMethod() {} }

class Child extends Parent {
	void parentMethod() {} // 오버라이딩
	void parentMethod(int i) {} // 오버로딩
	
	void childMethod() {}
	void childMethod(int i) {} // 오버로딩
}

 

바인딩

오버로딩 : 정적 바인딩, 호출될 메소드가 컴파일 시점에 결정된다. (컴파일 다형성)

오버라이딩 : 동적 바인딩, 호출될 메소드가 실행 시점에 결정된다. (런타임 다형성)

 

오버로딩 사용 시 주의점 by effective java

 

  • 매개변수에 대해 어떤 오버로딩 메소드가 호출되는지 분명하게

 

 

바인딩이란 프로그래밍에서 컴각종 값들이 확정되어 더이상 변경할 수 없는 구속(bind) 상태가 되는 것 정적 바인딩 (Static Binding) - 원시 프로그램의 컴파일링 또는 링크 시에 확정 되는 바인딩 동적 바인딩 (Dynamic Binding) - 프로그램의 실행되는 과정에서 바인딩 되는 것 ex)

int a = 1;
// 데이터 타입 int 로 바인딩 : 정적 바인딩
// 변수명 a 로 바인딩 : 정적 바인딩
// a에 1이라는 값이 바인딩 : 동적 바인딩 

 

📌

Annotation @Override 표시를 통해 컴파일 타임에 오버라이딩의 안정성을 부여하기

Override는 실행타임에 결정이 되기 때문에 컴파일 타임에 오버라이딩이 되었는지 확인할 수가 없음.

ex) 철자 오타시 확인가능

 

 

 

 

📌 참고

 

1. super

  • 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수
  • static에서는 사용 불가
  • 조상 클래스의 메서드를 자손 클래스에서 오버라이딩 한 경우에 super  사용함  
// 조상
void getLocation {
	return "x : " + x + " y: " + y;
}
... 
// 자손 
return super.getLocation() + "z : " + z;

 

2. super() - 조상 클래스의 생성자

  • 조상클래스의 생성자
  • 조상클래스의 생성자 호출할 때 사용됨
  • 모든 클래스의 생성자 첫 줄에 (object 제외) this(), super() 호출 해야함
  • 컴파일러가 자동으로 super() 넣을 때 에러 나는 경우

 

 

'Java' 카테고리의 다른 글

[Java][14-1] 람다식  (0) 2022.08.10