1. 오버라이딩
▷ super ← 부모 클래스
▷ super() : 부모 클래스의 생성자를 실행합니다.
▷ super(인자1, 인자2)
▷ super.메소드() : 부모 클래스의 메소드를 실행합니다.
◎ 부모 메소드 호출
▷ 자식 메소드 내에서 super 키워드와 도트(.) 연산자를 사용하면 숨겨진 부모 메소드를 호출합니다.
▷ 부모 메소드를 재사용함으로써 자식 메소드의 중복 작업 내용을 없애는 효과가 있습니다.
◎ Airplane 부모 클래스
public class Airplane { public void land() { System.out.println("착륙합니다."); } public void fly() { System.out.println("일반 비행합니다."); } public void takeOff() { System.out.println("이륙합니다."); } }
◎ SupersonicAirplane 자식 클래스public class SupersonicAirplane extends Airplane { public static final int NORMAL = 1; public static final int SUPERSONIC = 2; public int flyMode = NORMAL; @Override public void fly() { if(flyMode == SUPERSONIC) { System.out.println("초음속 비행합니다."); } else { super.fly(); } } }
◎ SupersonicAirplaneExample 클래스(메인)public class SupersonicAirplaneExample { public static void main(String[] args) { SupersonicAirplane sa = new SupersonicAirplane(); sa.takeOff(); sa.fly(); sa.flyMode = SupersonicAirplane.SUPERSONIC; sa.fly(); sa.flyMode = SupersonicAirplane.NORMAL; sa.fly(); sa.land(); } }
2. final 클래스와 메소드
◎ final 클래스
▷ final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없습니다.
◎ Member 부모 클래스
public final class Member { }
◎ VeryImportantPerson 자식 클래스
public class VeryImportantPerson extends Member { }
final이 붙으면 상속을 할 수 없습니다.
◎ final 메소드
▷ 메소드를 선언할 때 final 키워드를 붙이면 오버라이딩 할 수 없습니다.
▷ 부모 클래스를 상속해서 자식 클래스를 선언할 때, 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의 할 수 없습니다.
◎ Car 부모 클래스
public class Car { public int speed; public void speedUp() { speed += 1; } public final void stop() { System.out.println("차를 멈춤"); speed = 0; } }
◎ SportsCar 자식 클래스public class SportsCar extends Car { @Override public void speedUp() { speed += 10; } @Override public void stop() { System.out.println("스포츠카를 멈춤"); speed = 0; } }
3. protected 접근 제한자
▷ protected는 상속과 관련이 있고 public과 default 중간쯤에 해당하는 접근 제한
▷ protected는 같은 패키지에서는 default 처음 접근이 가능하나, 다른 패키지에서는 자식 클래스만 접근을 허용
NO | 접근 제한자 | 제한 대상 | 제한 범위 |
1 | protected | 필드, 생성자, 메소드 | 같은 패키지이거나, 자식 객체만 사용 가능 |
▷ 다른 패키지의 자식 클래스는 접근할 수 있습니다.
1. package1
(1) A 클래스
public class A { // 필드 생성 protected String field; // 생성자 선언 protected A() { } // 메소드 생성 protected void method() { } }
(2) B 클래스public class B { public void method() { A a = new A(); a.field = "value"; a.method(); } }
2. package2
(1) C 클래스import package1.A; public class C { public void method() { A a = new A(); // a에 protected : 다른 패키지라서 접근 불가능 a.field = "value"; a.method(); } }
(2) D 클래스
import package1.A; public class D extends A { public D() { super(); } // 상속을 통해서 사용 가능합니다. public void method1() { this.field = "value"; this.method(); } // 직접 객체를 생성해서 사용하는 것은 안됩니다. public void method2() { A a = new A(); a.field = "value"; a.method(); } }
class 사이의 상속에 대해서 배워보았습니다.
오버라이딩이나 final, protected 등은 class 사이의 연결을 제한하는 역할을 합니다.
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Java' 카테고리의 다른 글
[java] 추상 클래스 (0) | 2023.01.16 |
---|---|
[java] 이것이 자바다 ch07 상속3 (0) | 2023.01.13 |
[java] 이것이 자바다 ch07 상속 (2) | 2023.01.12 |
[java] class (1) | 2023.01.12 |
[java] 이것이 자바다 ch06 singleton(싱글톤) 패턴 (1) | 2023.01.12 |