-
[Java 자바] 7. 상속 ① 클래스 상속, super, 메소드 오버라이딩Programming/Java 2022. 8. 7. 17:31반응형
7-1. 상속이란?
기존 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것
- 기존에 정의되어 있던 클래스: 부모 클래스(parent class) == 상위 클래스(super class) == 기초 클래스(base class)
- 상속을 통해 새롭게 정의된 클래스: 자식클래스(child class) == 하위 클래스(sub class) == 파생 클래스(derived class)
- 상속은 코드의 중복을 줄여주고 개발시간 단축을 통해 효율성을 높일 수 있음
- 접근제한자에 따라 상속을 받아 접근할 수 있는 필드와 메소드는 달라질 수 있음 (부모클래스의 private 필드, 메소드는 접근 불가)7-2. 클래스 상속
extends 를 통해 부모클래스 상속 가능
- 다중 상속은 불가//Parents.java public class Parent { String name; int age; public void eat() { System.out.println("음식을 먹는다."); } } //Child.java public class Child extends Parent{ public static void main(String[] args) { Child c = new Child(); // 부모의 필드, 메소드 모두 사용 가능. c.name = "Erin"; c.age = 20; c.eat(); } }
7-3. super, super()
7-3-1. super 참조 변수
- 부모 클래스로부터 상속 받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수
- 부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같을 경우 super 키워드를 사용하여 구별 가능
- 인스턴스 변수 이름과 지역 변수 이름이 같을 경우에도, this 키워드를 사용하여 구별 가능// Parent.java public class Parent { int a = 10; } // Child.java public class Child extends Parent{ int a = 20; void display(int a) { System.out.println(a); System.out.println(this.a); System.out.println(super.a); } } // Test.java public class Test { public static void main(String[] args) { Child c = new Child(); c.display(30); } } // 30 20 10 순으로 출력
7-3-2. super() 부모 생성자 호출
- 자식 객체를 생성하면 부모 객체가 먼저 생성되고 자식 객체가 그 후에 생성됨
- 부모 기본생성자는 자식 생성자의 맨 첫 줄에서 super() 형태로 자동 호출
- 부모에 매개변수가 있는 생성자만 있다면 자식 생성자에서 반드시 부모 생성자 호출을 위한 super(매개값)을 작성해야 함//Parent.java public class Parent { Parent(int i) { System.out.println("부모 객채: " + i); } String name; int age; public void eat() { System.out.println("음식을 먹습니다."); } } //Child.java public class Child extends Parent{ Child(int j) { super(1); System.out.println("자식 객체: " + j); } public static void main(String[] args) { Child c = new Child(2); } }
7-4. 메소드 재정의
부모클래스의 메소드를 자식클래스에서 재정의하여 사용할 수 있다
7-4-1. 메소드 재정의(@Override)
: 자식 클래스에서 동일한 메소드를 재정의, 재정의 후엔 자식객체에서 메소드 호출시 오버라이딩된 자식 메소드가 호출됨
❗️ 메소드 오버라이딩 시 주의할 규칙
1. 부모의 메소드와 동일한 시그너처(리턴 타입, 메소드 이름, 매개 변수 리스트)를 가져야 함
2. 접근 제한을 더 강하게 오버라이딩할 수 없음
3. 세로운 예외(Exception)을 throws할 수 없다.- @Override 어노테이션을 붙여주면 컴파일러가 메소드 오버라이딩이 잘 되었는지 체크해주기 때문에 오류 발생 가능성 감소
7-4-2. 부모 메소드 호출(super)
- 자식 클래스에서 메소드 오버라이딩을 할 경우, 부모 클래스 메소드는 숨겨지고 오버라이딩된 자식 메소드만 호출됨
- 자식클래스 내부에서 오버라이딩된 부모 메소드를 호출해야 하면 명시적으로 super키워드를 사용하여 호출 가능 (super.method())7-5. final 클래스와 final 메소드
7-5-1. 상속할 수 없는 final 클래스
- 클래스 선언시 final 키워드가 붙으면, 이 클래스는 최종적 클래스로 상속할 수 없는 클래스가 됨
- 대표적인 예는 자바에서 제공하는 String 클래스7-5-2. 오버라이딩할 수 없는 final 메소드
- 메소드 선언시 final 키워드가 붙으면, 이 메소드는 최종적 메소드로 오버라이딩 할 수 없는 메소드가 됨
7-6. protected 접근자
- protected 접근자는 다른 패키지에서는 자식 클래스만 접근을 허용
package test; public class Parent { public Parent() {} protected int i = 1; protected void method01() { System.out.println("부모 객체에서 옴"); } } package test2; import test.Parent; public class Child extends Parent{ public static void main(String[] args) { Parent p = new Parent(); p.method01(); // 오류 발생, 자식 객체에서만 접근 가능하기 때문 Child c = new Child(); c.method01(); } }
반응형'Programming > Java' 카테고리의 다른 글
[Java 자바] 7. 상속 ③ 추상클래스 (Abstract Class) (0) 2022.08.08 [Java 자바] 7. 상속 ② 타입 변환과 다형성, instanceof (0) 2022.08.07 [Java 자바] 6. 클래스 ⑥ 접근 제한자 (public, protected, default, private), Getter/Setter, 어노테이션 (0) 2022.07.31 [Java 자바] 6. 클래스 ⑤ 패키지 (0) 2022.07.31 [Java 자바] 6. 클래스 ④ this, static, final, static final (0) 2022.07.31