상속 개념
상속이란? 부모가 자식에게 물려주는 행위를 말한다.
객체 지향 프로그램에서는 부모 클래스의 필드 및 메소드를 자식 클래스에게 물려줄 수 있다.
public class A{
int field;
void method1(){...}
}
public class B extends A{
String field;
void method2(){...}
}
B b = new B();
b.field1=10;//상속받은 필드
b.field2=20;
b.method1();//상속받은 메소드
b.method2();
클래스 상속
자식은 물려받을 부모를 선택한다. 부모는 1개만 가능!
public class 자식클래스 extends 부모클래스{
}
부모 생성자 호출
자식 클래스 변수 = new 자식클래스();
//자식 생성자 선언
public 자식클래스(...){
super();
...
}
//자식 생성자 선언2
public 자식클래스(...){
super(매개값, ...);
}
메소드 재정의
메소드 오버라이딩? 부모 클래스의 모든 메소드가 자식 클래스에 맞게 설계된 것이 아니기 때문에 재정의해서 사용한다.
메소드 오버라이딩의 규칙
- 부모 메소드의 선언부(리터 타입, 메소드 이름, 매개변수)와 동일해야한다.
- 접근 제한을 더 강하게 오버라이딩할 수 없다.(public->private)으로 변경 불가
- 새로운 예외를 throws 할 수 없다.
class Parent{
void method1(){
System.out.println("Parent");
}
void method2(){
System.out.println("Parent");
}
}
class Child extends Parent{
void method2(){
System.out.prinln("Child");
}
}
class ChildExample{
public static void main(Strings[] args){
Child c = new Child();
c.method1();//Parent의 메소드1
c.method2();//Child의 메소드2
}
}
부모 메소드 호출
메소드 재정의 시 부모 메소드의 일부만 변경된다 하더라고 자식 메소드도 중복된 내용을 갖고 있어야 한다.
중복된 부분은 super()키워드와 도트(.)연산자를 이용한다.
class Parent{
public void method(){
...
}
}
class Child extends Parent{
@Override
public void method(){
super().method();
...
}
}
final 클래스와 final 메소드
final 클래스
클래스를 선언할 때 final 키워드를 class 앞에 붙이면 최종적인 클래스이므로 더이상 상속할 수 없다.
즉, final클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다.
public final class 클래스{...}
//대표적인 예
public final class String {...}
protected 접근 제한자
접근 제한자 | 제한 대상 | 제한 범위 |
protected | 필드, 생성자, 메소드 | 같은 패키지이거나, 자식 객체만 사용 가능 |
타입 변환
자동 타입 변환
부모타입 변수 = 자식타입객체;
Cat cat = new Cat();
Animal animal = cat;
강제 타입 변환
자식타입 변수 = (자식타입) 부모타입객체;
Parent parent = new Child();
Child child = (Childe)parent;
다형성
다형성이란? 사용방법은 동일하지만 실행 결과가 다양하게 나오는 성질을 말한다.
상속으로 인해 부모의 메소드를 오버라이딩을 하면서 다양하게 수정해서 사용할 수 있다.
필드 다형성
필드 타입은 동일하지만, 대입되는 객체가 달라져서 실행결과가 다양하게 나옴.
public class Car{
public Tire tire;
public void run(){
this.roll();
//tire필드에 대입된 객체의 roll()메소드를 실행.
//만약 Tire을 상속받은 hankook, kumho가 roll()메소드를 재정의하고 있다면, 그 roll()이 호출됨.
}
}
매개변수 다형성
메소드가 매개변수로 클래스 타입을 갖고 있을 때도 다형성이 발생한다.
public class Driver{
public void drive(Vehicle vehicle){
vehicle.run();
//매개값으로 받은 vehicle의 run()을 실행할텐데
//매개변수로 받은 객체가 Vehicle을 상속받아 run()을 재정의하고 있다면,
//그 run()을 실행한다.
}
}
객체 타입 확인
boolean result = 객체 instanceof 타입;
public void method(Parent parent){
if(parent instanceof Child){
Child child =(Child)parent;
}
}
추상 클래스
추상 클래스란?
객체를 생성할 수 있는 실체 클래스의 공통적인 필드나 메소드를 추출해서 선언한 클래스
Animal animal = new Animal(); //X
추상 클래스는 객체를 직접 생성할 수 없다.
추상 클래스 선언
pubic abstract class 클래스명{
//필드
//생성자
//메소드
}
추상 메소드와 재정의
abstract 리턴타입 메소드명(매개변수,...);
public abstract class Animal{
abstract void sound();
}
봉인된 클래스
JAVA15 부터 무분별한 자식 클래스 생성을 방지하기 위해 봉인된(sealed) 클래스가 도입되었다.
public sealed class Person permits Employee, Manager {...}
Person의 자식 클래스는 Employee와 Manager만 가능하다.
'IT > JAVA' 카테고리의 다른 글
[JAVA] #9 중첩 선언과 익명 객체 (0) | 2023.04.17 |
---|---|
[JAVA] #8 인터페이스 (0) | 2023.04.14 |
[JAVA] #6 클래스(Class)-2 (0) | 2023.04.10 |
[JAVA] #6 클래스(Class)-1 (0) | 2023.04.10 |
[JAVA] #2 변수와 타입 (0) | 2023.04.06 |