본문 바로가기

IT/개발

상속(inheritance)과 확장(extend)

상속은 기존에 존재하는 클래스를 재사용하기 위한 매커니즘입니다.

 

예를 들면 기존에 면요리레시피라는 클래스가 존재한다면 면요리레시피라는 클래스를 상속받아서 라면레시피라는 클래스로 확장 할 수 가 있습니다.

 

상속하는 클래스를 슈퍼클래스(super class)라고 하고 상속받는 클래스를 서브클래스(sub class)라고 합니다.

 

자바에서 상속은 하나의 클래스만 상속을 받을 수가 있으며 서브클래스는 슈퍼클래스의 필드와 메소드를 재사용 할 수 있습니다.

 

객체지향 개념에서는 Is-A relationship라고 합니다. "서브클래스는 슈퍼클래스이다", "서브클래스는 슈퍼클래스의 한 종류이다"라고 부릅니다. 앞에서 예로 사용한 라면에 비유하면 "라면은 면요리이다", 라면은 면요리의 한 종류이다"라고 할 수가 있습니다.

 

자바에서 상속은 기본적으로 다형성을 구현하기 위한 목적으로 사용하라고 권고하고 있습니다.

자바프로그램은 하나의 클래스로는 객체를 표현 할 수 없다고 생각 했기 때문입니다. 실제로 이 세상에 존재하는 모든 것들은 그 하나 자체로 존재하는 것은 없다고 생각합니다. 무언가 그것들을 이루는 것들이 존재하고 표현하는 방법도 다 다릅니다. 객체지향에서는 그러한 것까지 현실세계를 따라와서 최대한 어떠한 문제에 대하여 클래스를 만들 때 그 표현하는 것들과 방법을 자세히 만들어야 합니다. 그렇게 표현 해야 클래스는 재사용이 잘 될 수 있고 다형성이 잘 구현될 것입니다.

 

자바는 재사용성과 확장이 용이하다. 그렇기 때문에 기존에 존재하는 클래스들 중 재사용 할 수 있는 요소가 많습니다. 그러한 클래스들을 재사용 할 때 상속을 통해 재사용을 하게 됩니다. 프로그래머는 그러한 기존의 클래스를 재사용하여 클래스 확장을 할 수 있게 됩니다. 이렇게 재사용을 통해 시간과 수고스러움을 절약 할 수 있게 됩니다.

 

상속은 extends클래스를 통해 상속을 받으며 상속을 받으면 super 클래스의 모든 멤버변수와 멤버메소드를 가져옵니다. 하지만 sub클래스에서 super클래스의 멤버변수의 접근은 접근범위에 따라 방법이 다릅니다. 기본적으로 멤버변수는 private으로 쓰이기 때문에 private일 경우는 setter, getter메소드를 통해 해당 멤버변수에 접근해야 합니다.  sub클래스에서 생성자를 초기화 할 때 super클래스의 멤버변수에 접근이 안됩니다. 그렇기 때문에 sub클래스의 생성자에서는 super라는 키워드를 통해 super의 생성자를 초기화 할 수 있습니다. 호출하는 방법은 super()를 통해 호출 할 수 있으며, 첫 번째 생성자의 첫 번째라인에서 사용해야 합니다. 그리고 super생성자를 호출하지 않을 경우 super클래스의 디폴드생성자가 호출이 됩니다. 그렇기 때문에 super클래스에서는 꼭 생성자오버로딩을 할 때 디폴드생성자를 정의해 주어야 합니다.

상속은 추상클래스를 구체클래스에서 상속받는 경우와 구체클래스를 구체클래스에서 상속받는 경우가 있으며 자바에서는 다중상속을 지원하지 않기 때문에 하나의 클래스만을 상속받을 수 있습니다. 구체클래스의 경우는 상속받아서 위의 설명대로 사용하면 됩니다. 하지만 추상클래스에는 추상메소드라는 것이 존재 할 수 있기 때문에 꼭 추상메소드를 정의해줘야 합니다.

'IT > 개발' 카테고리의 다른 글

추상클래스(abstract class)  (0) 2013.08.16
다형성(polymorphism)  (0) 2013.08.15
레퍼런스(reference) 타입  (0) 2013.08.14
객체(object)  (0) 2013.08.13
클래스(class)  (0) 2013.08.13