상세 컨텐츠

본문 제목

상속, 다형성

java

by nownow 2024. 3. 30. 04:31

본문

기존 클래스의 필드 ,메서드를 새 클래스에서 재사용 하게 하는 상속.

extends키워드로 부모(슈퍼) 클래스를 자식(서브)클래스로 확장한다.

자식 클래스를 만들면 부모 클래스도 메모리에 함께 생성된다.

자식 클래스에선 부모클래스에 접근할 수 있지만, 부모 클래스를 만든다고 상속 될 수 있는 클래스가 포함 되진 않으므로

부모클래스에서 자식 클래스의 정보가 없기에 접근은 불가하다.

 

public class Car{
	public void move(){
		sout("차를 이동");
	}
}
public class ElecCar extends Car{
	@Override
	public void move(){
		sout("전기차를 이동");
	}
}

부모의 메서드와 같은 이름으로 다른 기능을 사용하기 위해 오버라이딩.

실수 상황을 막고 인지하기 쉽게 하기 위해 애노테이션.

오버라이딩 시 접근제어자가 같거나 더 널널해질 수만 있음.

자식에서 호출할 때 자식을 먼저 보고 없을 때 부모를 참조하기에 오버라이딩이 가능.

 

그거 무시하고 부모 메서드를 사용하고 싶다면 자식메서드에서 super.메서드명() 사용

자식 클래스를 만들면 부모클래스의 생성자도 만들어줘야함(부모클래스 생성자가 기본 생성자가 아니라면)

super(매개변수) 로 해준다.

생성자는 최상위 부모 클래스부터 시작된다.

 

 

다형성

다형적참조

부모 변수는 자식 인스턴스를 참조할 수 있다. 메모리상엔 부모, 자식 모두 생성되고 부모 인스턴스를 가리키고있다.

메모리에 생성은 되지만 부모 인스턴스를 참조하고 있으므로 바로 자식 인스턴스의 메서드를 사용할 순 없음.

(해당 참조 인스턴스에 해당 메서드가 없으면 부모로 타고올라가는데 반대로 내려가보진 않기때문)

자식 인스턴스를 사용하려면 부모 변수에 자식 인스턴스를 넣고. 그것을 다운캐스팅하는 형식

Parent test = new Child();

Child testtwo = Child(test);

와 같은 형식으로 해줘야함. 이런 번거로운 과정을 거치지 않기 위하여

Child(test).childmethod();

와 같은 방식으로 일시적 다운캐스팅이 가능.

 

업캐스팅은 딱히 문제될 여지가 없기에 생략가능하다.

다운캐스팅은 다형적 참조를 통해 부모 변수에 자식 인스턴스를 넣었을 때 시행하는데

그냥 일반적인 부모 변수를 만들었다가 다운캐스팅을 하면, 메모리 상에 자식 인스턴스가 없는데

다운캐스팅하여 참조하라고 하는 상황에 에러가 발생한다. (ClassCastException)

 

instanceof

if (parent(매개변수) instance of Child)

와 같은 구문으로 참조 형식 변경이 가능한지 확인 후에 진행함으로 안정성을 높일 수 있다.

public class GasCar extends Car{
	@Override
	public void move(){
		sout("가솔린차를 이동");
	}
}

 

psvm main(){
	Car[] cars = {new GasCar(),newElecCar()};
    	for(Car car : cars){
    		car.move();
    	}
}

다형성을 활용해서 이런 작동이 가능.

부모 클래스를 직접 생성해서 사용할 일이 없다면 abstract class로 만든다. 그럼 new Parent() 불가.

메서드를 abstract로 만들면 내용이 없기에 자식에서 무조건 오버라이딩 해야한다.

 

순수 추상 클래스는 interface 키워드로서 더 편하게 사용 가능

인터페이스에서는 추상 메서드의 public abstract 부분을 생략가능하다.

인터페이스에서 멤버변수는 의미 없기에 상수라고 판단하여 public static final를 적지 않아도 자동적으로 붙는다.

 

클래스에서 상속시. 부모가 둘이라면 부모에게 같은 이름의 메서드가 있을 때, 자식은 어느 것을 택할지 모르므로

클래스에서 다중 상속은 불가능 하지만.

인터페이스에 있는 메서드는 기능이 존재하지 않기에 이 부분에서 상관이 없다. 인터페이스 다중상속은 가능.

인터페이스는 상속이 아닌 구현. implements 키워드.

 

OCP 원칙.

Open for extension 새로운 기능의 추가나 변경 사항이 생겼을 때에 기존 코드는 확장할 수 있어야 한다.

Closed for modification 기존의 코드는 수정되지 않아야 한다

'java' 카테고리의 다른 글

Object Class, 불변객체, String  (0) 2024.03.30
생성자, 접근제어자, static  (0) 2024.03.29

관련글 더보기