상속 (Inheritance)

기존 클래스로 새로운 클래스를 작성하는 (코드의 재사용)

상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 있다.

또한 코드를 공통적으로 관리할 있기 때문에 코드의 추가 변경이 용이하다

상속 특성상 상속하면 수록 기능이 많아진다.

 

extends 키워드로 상속한다

확장

생성자와 초기화 블록은 상속되지 않는다.

자바는 단일 상속 객체지향 언어이다.

 

접근제어자 private, default 멤버는 엄밀히 말하면 상속은 되지만, 서브 클래스에서 접근이 불가한 것

클래스의 관계 - 포함 관계(composite)

상속 이외에 클래스를 재사용하는 방법은 클래스의 멤버로 다른 클래스 타입 참조변수를 선언하는

단일 상속만 되는 자바에서 일반적으로 포함 관계가 훨씬 좋다고 여겨진다.

public class Ex1 {
	public static void main(String[] args) {
		//상위 클래스 타입으로 하위 클래스 타입을 다룰 수 있다. 다형성의 핵심
		SuperClass superClass = new SubClass();
		superClass.call();
	}
}
class  SuperClass{
	//일반적으로 멤버변수는 private이 옳다. 데이터 접근은 메서드로 하는 것이 일반적으로 옳다.
	private Composite composite;
	//슈퍼 클래스 생성자는 서브 객체 생성 시 자동으로 호출 된다. 즉, 
	//즉, 슈퍼클래스 객체와 서브 클래스를 묶어 하나 처럼 쓰는 것이다.
	public SuperClass() {
		composite = new Composite();
	}
	public void call() {
		composite.call();
	}
}

class SubClass extends SuperClass{
	//자동으로 컴파일러가 추가 1
//	public SubClass() {
	//자동으로 컴파일러가 추가 2
//		super();
//	}
}

class Composite{
	public void call() {
		System.out.println("구성과 위임");
	}
}

 

구성과 위임

클래스간의 관계 결정하기

클래스를 작성하는데 상속관계를 맺어 줄지, 포함관계를 맺어줄지

 

분류법

상속관계 , is-a 관계, ~는 ~이다, is-a-kind-of , ~는 ~의 분류이다. 이 표현이 더 정확하다는 책도 있다.

포함관계(구성관계) , has-a 관계, ~는 ~를 가지고 있다.

이 내용을 좀 더 이해하려면, 객체지향만을 주제로 한 책을 읽어봐야 한다.

 

앞자리에 하위클래스가 오고 뒤에 상위 클래스가 온다.

 

예시) 오리는 동물이다.  OK , 오리는 동물을 가지고 있다. Not OK

 

객체 지향의 상속이라는 특성을 올바르게 활용하면 리스코프 치환 원칙을 준수하게 된다.

 

단일 상속(single inheritance)

자바는 단일 상속만 허용한다.

다중 상속은 복합적인 기능을 가진 클래스를 쉽게 만들 있다는 장점이 있다

하지만 클래스 간의 관계가 매우 복잡해진다.

 

다중 상속이 된다면 문제점

조상 메소드 이름은 같지만 구현부가 다른 경우 어떤 것을 실행할 것인가? (충돌 문제)

 

자바는 인터페이스로 다중 상속과 유사한 효과를 낼 수 있다.

 

상속과 구성 관계를 확장한 다양한 디자인 패턴도 존재한다.

 

오버라이딩(overriding)

상속받은 조상의 메서드를 자신에 맞게 변경하는

메서드 시그니처는 완전히 동일해야 한다.(반환타입, 매개변수, 이름)

class A{
	A getInstance() {
		return this;
	}
}
class B extends A{
	//단, 자손 타입으로 반환하는 것은 예외적으로 허용된다.
	B getInstance() {
		return this;
	}
}

오버라이딩 조건

  • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다
  • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
    조상 클래스 메서드 예외보다 더 상위 예외를 선언할 수 없다는 뜻(예외도 계층이 존재한다)
  • 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.
class AA{
	void method() throws Exception{	}
	protected void method2(){	}
	static void method3() {}
}


class BB extends AA{
	@Override
	//조상보다 더 많은 예외 안됨
	void method() throws Throwable{
		// TODO Auto-generated method stub
		super.method();
	}
	@Override
	//접근제어자 더 좁게 불가.
	private void method2() {
		// TODO Auto-generated method stub
		super.method2();
	}
	/**
	 * static 멤버는 클래스에 속한 것이지, 인스턴스에 속한게 아니다.
	 * 	따라서 오버라이딩이란 개념이 없다. 야에 별개다. 
	 * AA.method3(), BB.method3() 앞에 변수가 아니라 클래스로 명확히 구분이 가능하다.
	 */
	static void method3() {}
}

 

 

 

 

 

'개발 > 자바(JAVA)' 카테고리의 다른 글

객체 지향 - 6  (0) 2023.02.03
객체 지향 - 5  (0) 2023.02.01
객체 지향 - 3  (0) 2023.01.29
객체 지향 - 2  (0) 2023.01.27
객체 지향 - 1  (0) 2023.01.25

+ Recent posts