본문으로 바로가기

상속

category Java/java 2020. 8. 10. 16:46

has a : 특정 객체 내에서 다른 객체를 가지고 있는 것을 의미한다

is a : 특정 객체가 다른 객체에게 자신의 능력을 포함시켜주는 상속 관계를 의미한다.

       ( sub클래스는 super클래스의 기능을 가지고있다. )

 

클래스 상속 : 부모가 보유하고 있는  재산 중 일부를 자식이 물려받는 것을 의미한다.

                  자바에서는 이런 클래스들간의 다중 상속을 지원하지 않으므로 객체의 명확성을 높였다.

                  다중상속을 하면 값이 모호해질 수 있다. 그래서 객체끼리의 다중상속 불가 (interface로 다중상속은 가능)

                  (클래스 앞에 final 은 상속금지  ex, String클래스 : has a 방식으로만 사용 가능)

 

상속을 주기 위해 준비된 클래스 : Base Class, Super Class, Parent Class (자바에서는 Super Class)

상속을 받아 새롭게 정의되는 클래스 : Derivation Class, Sub Class, Child Class (자바에서는 Sub Class) 

 

상속의 정의법

class [sub클래스명] extends [super클래스명]{

 

클래스 상속의 중요성: 클래스 상속은 객체의 재사용이라는 장점뿐만 아니라 코드의 간결성을 제공해 주는

                             객체 지향적 언어의 장점과 중요한 특징이 된다.

                             그러므로 잘 정의된 super클래스가 있다면 sub클래스의 작성이 간편해지고

                             무엇보다 개발 시간이 단축된다는데 상속의 중요성과 정점을 들 수 있다.

 

상속을 사용하면 코드가 간결해진다 (부모의 객체를 가져다 쓰면 되기 때문에 )

상속 최상위 객체에는 모든 객체의 공통을 가지고 있다

 

 super() 수퍼 호출
 : 항상 sub class의 생성자함수의 첫 번째 라인에 항상 존재하고 있다.
 : 명시적으로 사용할 경우는 sub클래스에서 데이터를 전송하고 싶을 때 사용한다.
 : 상속관계일 때만 사용. 부모의 생성자가 먼저 호출됨

 Overriding
 : 부모의 멤버 중 자식이 다시 새롭게 재정의해서 사용하고 싶은것을 다시 만드는 것
 : 부모것을 사용하면서 새로운 내용을 확장하고 싶을 때
 : 접근 지정자는 바꿀 수 있다. 좁은곳 -> 넓은 곳 가능. 넓은 곳 -> 좁은 곳 불가능

( super.toString을 사용할 시 내가 상속하고 있는 클래스의 toString을 불러옴( 최상위까지 안감) )

정적바인딩, 동적바인딩을 가능하게 해주기 위해 사용한다.

public class A extends Object{	// extends Object는 생략가능
	public A() {
		super();	// 3. Object() 생성자 호출
		System.out.println("A()");	// 4. 출력
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////
public class B extends A{	// Object를 상속받은 A를 상속받음
	public B() {
		System.out.println("B()");
	}
	@Override
	public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode()) + "추가내용..";
    }
}
///////////////////////////////////////////////////////////////////////////////////////////////
public class C extends A{	// Object를 상속받은 A를 상속받음
	public C() {	
		super();	// 2. A() 생성자 호출. (상속받으면 생략되있을 뿐 항상 있음)

		System.out.println("C()");	// 5. 출력
	}
	
	@Override	// 안써도 문법상 오류가 없지만 시각적으로 표시
	public String toString() {
		return "상속 배우고 있어..";
    }
}
///////////////////////////////////////////////////////////////////////////////////////////////
public class D extends Object{
	
	public static void main(String[] args) {
		C cc = new C(); // 1. C클래스의 생성자를 간다.
		// 동작은 C, A 출력은 A, C
		System.out.println(cc.toString());

		B bb = new B();
		System.out.println(bb.toString());
	}
}
// 출력
/*
*A()
*C()
*상속 배우고 있어..
*A()
*B()
*exam_extend.B@73a28541추가내용..
*/

\

 

 

반응형

'Java > java' 카테고리의 다른 글

추상화  (0) 2020.08.11
final  (0) 2020.08.11
배열 (Array)  (0) 2020.08.06
this  (0) 2020.08.05
Class  (0) 2020.08.05