오버로딩 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 |
---|