back/Java

KH 12일차

devel0per 2022. 7. 15. 14:42

오늘은 오버로딩, 오버라이딩, 상속에 대해서 학습했다.

 

 

(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 키워드는

  • 자식 클래스에서 상속받은 부모 클래스의 멤버변수를 참조할때 사용합니다.

라고 생각하면 될 듯 하다!