Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

forDevLife

[자바의정석] Chap 7. 객체지향 프로그래밍2 본문

Java

[자바의정석] Chap 7. 객체지향 프로그래밍2

JH_Lucid 2020. 12. 10. 08:13

1) 다시 한번, 오버로딩

- 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩'이라 함.

- 조건 :

   -. 메서드 이름이 같아야 함.

   -. 매개변수 개수 또는 타입이 달라야 한다.

   -. 반환 타입은 오버로딩에 영향을 주지 않는다!

   -. 예시 : println

- 매개변수가 여러 개일 때, 자료형의 순서가 서로 다른 경우도 오버로딩으로 간주

   (long add(int a, long b) / long add(long a, int b)

 

2) 오버라이딩의 조건

- 조건 :

   -. 메서드 이름이 같아야 함.

   -. 매개변수가 같아야 한다.

   -. 반환타입이 같아야 한다.

   -. 요약하면, 선언부가 서로 일치해야 한다.

   -. 다만 접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다.

        1) 접근제어자 : 조상보다 좁은범위로 변경 불가 (public > protected > default > private)

            → 조상 클래스의 접근 제어자가 protected라면, 자손은 public 아니면 protected여야 한다.

 

 

       2) 예외 : 조상보다 많은 예외 선언 불가, 개수가 중요한게 아닌 해당 예외의 범위가 중요

            → 포괄하는 throws Exception는 자손에서 사용 불가하게 됨

 

       3) 인스턴스메서드를 static(클래스메서드) 또는 그 반대로 변경할 수 없다.

       4) 조상 클래스의 static을 자식 클래스의 static으로 정의 가능하다.

            → 이 경우, 각 클래스에 별개로 static을 정의한 것일 뿐 오버라이딩이 아니다.

            → static은 오버라이딩 불가, static 멤버는 자신들이 정의된 클래스에 묶여있는 것이기 때문.

            → 호출할 때는 '참조변수.메서드이름' (x) → '클래스이름.메서드이름' (o)

 

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

다시 정리하자면,

- 오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것(new)

- 오버라이딩 : 상속받는 메서드의 내용을 변경하는 것(change / modify)

 

4) Super

- 변수 / 메서드에 모두 사용 가능

- 자손에서 조상으로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수

- 조상의 멤버도 자손의 멤버이므로, this로도 가능하나 멤버가 중복 정의되어 있을 경우에는 super 사용

public class SuperTest {

	public static void main(String[] args) {
		Child c = new Child();
		c.method();

	}

}
class Parent {
	int x = 10;
}
class Child extends Parent {
	int x = 20;
	
	void method() {
		System.out.println("x =" + x);
		System.out.println("this.x =" + this.x);
		System.out.println("super.x =" + super.x);
	}
}

x가 중복 정의 되어 있음. 따라서 x, this는 동일 / super만 다름

 

super는 메서드로도 호출 가능하다.

아래는 Point의 getLocation을 오버라이딩하는 Point3D 클래스에 대한 설명이다.

x, y는 Point에도 있는 내용이므로, 이를 재 사용하기 위해 Point3D에서 super를 통해 호출 가능함을 확인할 수 있다.

후에 Point 메서드가 변경되더라도, 상속받는 자식에 이게 자동으로 반영되므로 좋다.

public class SuperTest {

	public static void main(String[] args) {
		Point3D p3 = new Point3D();
		System.out.println(p3.getLocation());
	}

}
class Point {
	int x;
	int y;
	
	String getLocation() {
		return "x: " +x + ", y: " + y;
	}
}
class Point3D extends Point {
	int z;
	
	String getLocation() {
		return super.getLocation() +", z: " +z;
	}
}

 

Comments