KH 12일차
오늘은 오버로딩, 오버라이딩, 상속에 대해서 학습했다.
(1) 오버로딩
: 여러 메소드가 같은 이름을 가지고 있지만, 인자의 수나 자료형이 다른 것을 말한다.
class Info2{
private String name;
private int age;
private char sex;
private String tel;
//생성자 Overloading
//두 메서드가 같은 이름을 가지고 있으나 인자의 수나 자료형이 다른 경우를 말한다.
public Info2(String n, int a, char s, String t) {
name = n;
age = a;
sex = s;
tel = t;
}
public Info2(String n, int a) { //생성자
name = n;
age = a;
sex = 'm';
tel = "010-1111-1111";
}
public Info2(String n, char s, String t) {//생성자
name = n;
age = 77;
sex = s;
tel = t;
}
public Info2(int a, char s) {
name = "장미";
age = a;
sex = s;
tel = "010-2222-4444";
}
public Info2(String n, String t) {
name = "장미";
age = 25;
sex = 'f';
tel = t;
}
public Info2() {
name = "해바라기";
age = 36;
sex = 'm';
tel = "010-0000-0000";
}
Info2()의 메소드가 같은 이름으로 여러개 선언되어 있지만, 매개변수로 받는 인자의 개수나, 자료형이 다르기 때문에 사용가능하다.
(2) 오버라이딩
: 부모 클래스의 메소드를 재정의 하는 것으로, 자식 클래스에서는 오버라이딩 하고자하는 메소드의 이름, 매개변수, 리턴값이 모두 같아야 한다.
class AA_3{
int a = 10;
int b = 20;
void display() {
System.out.println("AA_3 a = " + a + ", b = " + b);
}
}
class BB_3 extends AA_3{
int a = 333;
int b = 555;
void display() {
System.out.println("BB_3 display a =" + a + ", b = " + b);
}
클래스 AA_3(부모 클래스)에서 상속받은 BB_3(자식 클래스)는 display() 라는 같은 이름의 메소드를 사용하고 있다. 아무 매개변수를 사용하지 않고 사용하는 모습.
@ Override 사용하면서 지켜야 할 규칙.
1. 자식 클래스에서 오버라이딩하는 메소드의 접근 제어자는 부모 클래스보다 더 좁게 설정할 수 없다.
부모 클래스에서 default로 설정되어 있다면 자식 클래스는 그 보다 같거나 넓은 범위인 default,protect,public 3개의 접근 지정자가 사용이 가능하다.
2. 예외(Exception)는 부모 클래스의 메소드 보다 많이 선언할 수 없다.
부모 클래스에서 어떤 예외를 throws 한다고 하면, 자식 클래스에서는 그 예외보다 더 큰 범위의 예외를 throws할 수 없다는 것이다.
3. static메소드를 인스턴스의 메소드로 또는 그 반대로 바꿀 수 없다.
부모 클래스의 static메소드를 자식에서 같은 이름으로 정의할 수 있지만 이것은 다시 정의하는 것이 아니라 같은 이름의 static메소드를 새로 정의하는 것이다.
오버로딩 vs 오버라이딩
이 둘은 이름만 비슷하지 사실 명백히 다른 것이다.
오버로딩 - 기존에 없는 새로운 메소드를 추가하는 것
오버라이딩 - 상속받은 메소드를 재정의 하는 것
구분 | Overriding | Overloading |
접근 제어자 | 부모 클래스의 메소드의 접근 제어자보다 더 넓은 범위의 접근 제어자를 자식 클래스의 메소드에서 설정할 수 있다. | 모든 접근 제어자를 사용할 수 있다. |
리턴형 | 동일해야 한다. | 달라도 된다. |
메소드명 | 동일해야 한다. | 동일해야 한다. |
매개변수 | 동일해야 한다. | 달라야만 한다. |
적용 범위 | 상속관계에서 적용된다. | 같은 클래스 내에서 적용된다. |
참고 블로그 : https://hyoje420.tistory.com/14
(3) 상속
class AA_3{
int a = 10;
int b = 20;
void display() {
System.out.println("AA_3 a = " + a + ", b = " + b);
}
}
class BB_3 extends AA_3{
int a = 333;
int b = 555;
void display() {
System.out.println("BB_3 display a =" + a + ", b = " + b);
}
void show() {
super.display();
this.display();
int total = this.a + this.b + super.a + super.b;
System.out.println("total = " + total);
System.out.println("BB_3 show a = " + a + ", b " + b);
}
}
//상속 관계에 있는 객체가 형변환됐을 때, 멤버변수는 쉐어링되고 메소드는 오버라이딩 된다.
public class SuperTest_3 {
public static void main(String[] args) {
BB_3 obj_1 = new BB_3();
obj_1.display();
//"BB_3 display a =" + a + ", b = " + b
obj_1.show();
//
BB_3 obj_2 = null;
BB_3 obj_3 = new BB_3();
obj_3.display();
obj_2 = (BB_3)obj_3;
obj_2.display();
obj_2.show();
}
}
AA_3 클래스를 상속받은 BB_3 클래스는 show()라는 메소드에서 super키워드를 통해 상위 클래스에 존재하는 메소드인 display()를 호출하고 this키워드를 통해 현재 클래스인 BB_3에 존재하는 display 메소드를 호출하는 모습을 볼 수 있다.
this 키워드는
- 현재 클래스의 인스턴스를 의미합니다.
- 즉, 현재 클래스의 멤버변수를 지정할때 사용합니다.
super 키워드는
- 자식 클래스에서 상속받은 부모 클래스의 멤버변수를 참조할때 사용합니다.
라고 생각하면 될 듯 하다!