의견.png

"상속 (프로그래밍)"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
잔글
2번째 줄: 2번째 줄:
  
 
== 개요 ==
 
== 개요 ==
[[객체 지향 프로그래밍]](OOP)에서 자손 클래스가 조상 클래스의 기능을 그대로 이어받아서 재사용하는 것을 상속이라 말한다. 클래스로 객체가 정의되는 고전 상속에서, 클래스는 기반 클래스, 수퍼클래스, 또는 부모 클래스 등의 기존의 클래스로부터 속성과 동작을 상속받을 수 있다. 그 결과로 생기는 클래스를 파생 클래스, 서브클래스, 또는 자식 클래스라고 한다. 상속을 통한 클래스들의 관계는 계층을 형성한다. 프로토타입 기반 프로그래밍에서는, 객체가 클래스를 따로 정의할 필요 없이 다른 객체로부터 직접 정의될 수 있다. 이러한 특징을 차등 상속이라고 부른다.<ref name="위키백과">위키백과, 〈[https://ko.wikipedia.org/wiki/%EC%83%81%EC%86%8D_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D)#cite_note-1 상속(객체 지향 프로그래밍)]〉, 《위키피디아》, 2014-07-03</ref>
+
[[객체 지향 프로그래밍]](OOP)에서 자손 클래스가 조상 클래스의 기능을 그대로 이어받아서 재사용하는 것을 상속이라 말한다. 클래스로 객체가 정의되는 고전 상속에서, 클래스는 기반 클래스, 수퍼클래스, 또는 부모 클래스 등의 기존의 클래스로부터 속성과 동작을 상속받을 수 있다. 그 결과로 생기는 클래스를 파생 클래스, 서브클래스, 또는 자식 클래스라고 한다. 상속을 통한 클래스들의 관계는 계층을 형성한다.
 +
:{|class=wikitable width=700 style="background-color:#ffffee"
 +
|+ 상속 명칭 구분
 +
!align=center style="background-color:#ffeecc"|조상 클래스
 +
!align=center style="background-color:#ffeecc"|자손 클래스
 +
|-
 +
|align=center|부모 클래스
 +
|align=center|자식 클래스
 +
|-
 +
|align=center|상위 클래스
 +
|align=center|하위 클래스
 +
|-
 +
|align=center|기반 클래스
 +
|align=center|파생(derived)된 또는 확장(extended)된 클래스
 +
|}
  
 +
프로토타입 기반 프로그래밍에서는, 객체가 클래스를 따로 정의할 필요 없이 다른 객체로부터 직접 정의될 수 있다. 이러한 특징을 차등 상속이라고 부른다.<ref name="위키백과">위키백과, 〈[https://ko.wikipedia.org/wiki/%EC%83%81%EC%86%8D_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D)#cite_note-1 상속(객체 지향 프로그래밍)]〉, 《위키피디아》, 2014-07-03</ref>
  
 
==특징==
 
==특징==
13번째 줄: 28번째 줄:
  
 
=== 다중 상속 ===
 
=== 다중 상속 ===
다중상속(Multiple inheritance)이란 객체 지향 프로그래밍의 특징 중 하나이며, 어떤 클래스가 하나 이상의 상위 클래스로부터 여러 가지 행동이나 특징을 상속받을 수 있는 것을 말한다.  
+
다중상속(Multiple inheritance)이란 [[객체 지향 프로그래밍]]의 특징 중 하나이며, 어떤 [[클래스]]가 하나 이상의 상위 클래스로부터 여러 가지 행동이나 특징을 상속받을 수 있는 것을 말한다.  
이런 다중 상속은 한 객체에서 여러 부모의 메소드를 사용하기 위해서 사용하는데 한 객체가 여러 부모 클래스를 가지게 되는 것은 문제가 생긴다. 그 문제를 다이아몬드 문제라고 한다.
+
이런 다중 상속은 한 객체에서 여러 부모의 [[메소드]]를 사용하기 위해서 사용하는데 한 객체가 여러 부모 클래스를 가지게 되는 것은 문제가 생긴다. 그 문제를 다이아몬드 문제라고 한다.
 
[[파일:The Deadly Diamond of Death.jpg|썸네일|죽음의다이아몬드(The Deadly Diamond of Death)]]
 
[[파일:The Deadly Diamond of Death.jpg|썸네일|죽음의다이아몬드(The Deadly Diamond of Death)]]
이 죽음의 다이아몬드는 ComboDrive라는 자식 클래스에서 Burn()이라는 메소드를 사용했다면 CDBurner, DvDBurner, DigitalRecoder 중 어느 객체에 접근해 함수를 사용할 것인지 애매한 상황이 생겨
+
이 죽음의 다이아몬드는 ComboDrive라는 자식 클래스에서 Burn()이라는 메소드를 사용했다면 CDBurner, DvDBurner, DigitalRecoder 중 어느 객체에 접근해 함수를 사용할 것인지 애매한 상황이 생긴다. 그로인해 자바의 경우 단일 상속만을 사용한다.
 +
 
 +
 
 +
=== 단일 상속 ===
 +
[[C++]]에서는 여러 [[클래스]]로부터 상속받는 다중상속(Multiple Inheritance)을 허용하지만, 자바에서는 단일 상속만을 허용하기 때문에 하나 이상의 클래스로부터 상속을 받을 수 없다. 다중상속을 허용하면 여러 클래스로부터 상속받을 수 있기 때문에 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있다는 장점이 있지만, 클래스간의 관계가 매우 복잡해진다는 것과 서로 다른 클래스로부터 상속받은 멤버들간의 이름이 같은 경우 구별할 수 있는 방법이 없다는 단점을 가지고 있다.
 +
자바에서는 다중상속의 이러한 문제점을 해결하기 위해 다중상속의 장점을 포기하고 단일상속만을 허용한다. 대신 앞으로 배우게 될 [[인터페이스]](interface)를 이용해서 보완된 형태의 다중상속을 구현할 수 있도록 하고 있다.
 +
단일 상속이 하나의 조상클래스만을 가질 수 있기 때문에 다중상속에 비해 불편한 점도 있겠지만, 클래스간의 관계가 보다 명확해지고 코드를 더욱 신뢰성있게 만들어 준다는 점에서는 다중상속보다 유리하다.<ref name="명우니닷컴">명우니닷컴, 〈[https://myeonguni.tistory.com/51 제7장 객체지향개념 2-1. 상속(Inheritance)]〉, 《개인블로그》</ref>
 +
 
  
  
  
 
===장점===
 
===장점===
객체 지향의 특징중 첫번째 상속은 객체를 만들어 놓고 언제든지 다시 쓸 수 있다는 장점을 가지고 있습니다. 이 상속의 특징때문에 이미 만들어 놓은 상위 객체를 재사용해서 하위 객체를 쉽고 빠르게 만들수 있습니다. 그러므로 잘 만들어 놓은 객체만 있다면 고생할 필요가 없고 수정을 할때도 상위객체를 수정해주면 상속받은 모든 하위 객체가 수정이 되므로 유지보수가 쉽습니다. <ref name="Ara Blog">Ara Blog, 〈[https://hunit.tistory.com/152 자바(JAVA) 객체지향 특징 상속/캡슐화/다형성]〉, 《개인블로그》, 2015-10-29</ref>
+
객체 지향의 특징중 첫번째 상속은 객체를 만들어 놓고 언제든지 다시 쓸 수 있다는 장점을 가지고 있다. 이 상속의 특징때문에 이미 만들어 놓은 상위 객체를 재사용해서 하위 객체를 쉽고 빠르게 만들수 있다. 그러므로 잘 만들어 놓은 객체만 있다면 고생할 필요가 없고 수정을 할때도 상위객체를 수정해주면 상속받은 모든 하위 객체가 수정이 되므로 유지보수가 쉽다. <ref name="Ara Blog">Ara Blog, 〈[https://hunit.tistory.com/152 자바(JAVA) 객체지향 특징 상속/캡슐화/다형성]〉, 《개인블로그》, 2015-10-29</ref>
 +
 
 +
===효과===
 +
이런 상속의 효과로는 부모 클래스를 재사용해서 자식 클래스를 빨리 개발 할 수 있다. 부모 클래스를 생성해두고 자식 클래스에서 부모 클래스를 상속받게 되면 한번 사용한 메소드를 다시 정의할 필요가 없기 때문에 재사용이 쉽고 그만큼 프로그램 개발에 용이하다. 또한 반복된 코드의 중복을 줄여준다. 이전에 사용했던 메소드가 있다면 상속을 받아 오버라이딩만 하면 되기 때문에 코드의 중복성을 줄여준다. 그리고 부모 클래스를 한 번만 수정함으로써 자식클래스를 수정할 필요가 없게되어 유지 보수에 있어 편리함을 제공해준다.
  
 
== 활용 ==
 
== 활용 ==
28번째 줄: 53번째 줄:
  
 
{{각주}}
 
{{각주}}
 +
 +
==참고 자료==
 +
* 위키백과, 〈[https://ko.wikipedia.org/wiki/%EC%83%81%EC%86%8D_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D)#cite_note-1 상속(객체 지향 프로그래밍)]〉, 《위키피디아》
 +
* 재희 jaiyah, 〈[https://webclub.tistory.com/169 객체 지향 프로그래밍의 상속과 다형성]〉, 《Web Club》
 +
* Ara Blog, 〈[https://hunit.tistory.com/152 자바(JAVA) 객체지향 특징 상속/캡슐화/다형성]〉, 《개인블로그》, 2015-10-29
 +
* 명우니닷컴, 〈[https://myeonguni.tistory.com/51 제7장 객체지향개념 2-1. 상속(Inheritance)]〉, 《개인블로그》
 +
  
 
== 같이 보기 ==
 
== 같이 보기 ==

2020년 8월 10일 (월) 11:18 판

상속(相續, inheritance)은 객체 지향 프로그래밍에서 크게 3요소로 꼽는 캡슐화, 상속, 다형성 세 가지 중 상속을 일컫는다. 자바에서는 계승, 확장이라는 단어로 사용된다.

개요

객체 지향 프로그래밍(OOP)에서 자손 클래스가 조상 클래스의 기능을 그대로 이어받아서 재사용하는 것을 상속이라 말한다. 클래스로 객체가 정의되는 고전 상속에서, 클래스는 기반 클래스, 수퍼클래스, 또는 부모 클래스 등의 기존의 클래스로부터 속성과 동작을 상속받을 수 있다. 그 결과로 생기는 클래스를 파생 클래스, 서브클래스, 또는 자식 클래스라고 한다. 상속을 통한 클래스들의 관계는 계층을 형성한다.

상속 명칭 구분
조상 클래스 자손 클래스
부모 클래스 자식 클래스
상위 클래스 하위 클래스
기반 클래스 파생(derived)된 또는 확장(extended)된 클래스

프로토타입 기반 프로그래밍에서는, 객체가 클래스를 따로 정의할 필요 없이 다른 객체로부터 직접 정의될 수 있다. 이러한 특징을 차등 상속이라고 부른다.[1]

특징

상속을 통해서 클래스를 작성하면, 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다. 이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다. 그리고 객체의 다형성4을 구현 할 수 있다는 효과를 가지고 있다. 즉, 하위 객체에서 상위객체의 필드와 메소드를 따로 또 만들어서 사용할 필요가 없으며 상위 객체의 메소드에 문제가 있을 경우 상위 객체에서의 수정으로 인해 하위객체에서 문제가 있었던 메소드를 따로 수정할 필요없이 메소드를 사용할 수 있다.[2]

상속은 부모클래스로부터 멤버변수, 메서드르 상속 받는 것은 가능하지만 생성자는 상속이 불가능하다. 또한 접근권한자가 private로 선언된 멤버변수와 메서드는 상속이 불가능하다.


다중 상속

다중상속(Multiple inheritance)이란 객체 지향 프로그래밍의 특징 중 하나이며, 어떤 클래스가 하나 이상의 상위 클래스로부터 여러 가지 행동이나 특징을 상속받을 수 있는 것을 말한다. 이런 다중 상속은 한 객체에서 여러 부모의 메소드를 사용하기 위해서 사용하는데 한 객체가 여러 부모 클래스를 가지게 되는 것은 문제가 생긴다. 그 문제를 다이아몬드 문제라고 한다.

죽음의다이아몬드(The Deadly Diamond of Death)

이 죽음의 다이아몬드는 ComboDrive라는 자식 클래스에서 Burn()이라는 메소드를 사용했다면 CDBurner, DvDBurner, DigitalRecoder 중 어느 객체에 접근해 함수를 사용할 것인지 애매한 상황이 생긴다. 그로인해 자바의 경우 단일 상속만을 사용한다.


단일 상속

C++에서는 여러 클래스로부터 상속받는 다중상속(Multiple Inheritance)을 허용하지만, 자바에서는 단일 상속만을 허용하기 때문에 하나 이상의 클래스로부터 상속을 받을 수 없다. 다중상속을 허용하면 여러 클래스로부터 상속받을 수 있기 때문에 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있다는 장점이 있지만, 클래스간의 관계가 매우 복잡해진다는 것과 서로 다른 클래스로부터 상속받은 멤버들간의 이름이 같은 경우 구별할 수 있는 방법이 없다는 단점을 가지고 있다. 자바에서는 다중상속의 이러한 문제점을 해결하기 위해 다중상속의 장점을 포기하고 단일상속만을 허용한다. 대신 앞으로 배우게 될 인터페이스(interface)를 이용해서 보완된 형태의 다중상속을 구현할 수 있도록 하고 있다. 단일 상속이 하나의 조상클래스만을 가질 수 있기 때문에 다중상속에 비해 불편한 점도 있겠지만, 클래스간의 관계가 보다 명확해지고 코드를 더욱 신뢰성있게 만들어 준다는 점에서는 다중상속보다 유리하다.[3]



장점

객체 지향의 특징중 첫번째 상속은 객체를 만들어 놓고 언제든지 다시 쓸 수 있다는 장점을 가지고 있다. 이 상속의 특징때문에 이미 만들어 놓은 상위 객체를 재사용해서 하위 객체를 쉽고 빠르게 만들수 있다. 그러므로 잘 만들어 놓은 객체만 있다면 고생할 필요가 없고 수정을 할때도 상위객체를 수정해주면 상속받은 모든 하위 객체가 수정이 되므로 유지보수가 쉽다. [4]

효과

이런 상속의 효과로는 부모 클래스를 재사용해서 자식 클래스를 빨리 개발 할 수 있다. 부모 클래스를 생성해두고 자식 클래스에서 부모 클래스를 상속받게 되면 한번 사용한 메소드를 다시 정의할 필요가 없기 때문에 재사용이 쉽고 그만큼 프로그램 개발에 용이하다. 또한 반복된 코드의 중복을 줄여준다. 이전에 사용했던 메소드가 있다면 상속을 받아 오버라이딩만 하면 되기 때문에 코드의 중복성을 줄여준다. 그리고 부모 클래스를 한 번만 수정함으로써 자식클래스를 수정할 필요가 없게되어 유지 보수에 있어 편리함을 제공해준다.

활용

자바에서 상속을 구현하는 방법은 아주 간단하다. 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends'와 함께 써 주기만 하면 된다.[3]


각주

  1. 위키백과, 〈상속(객체 지향 프로그래밍)〉, 《위키피디아》, 2014-07-03
  2. 재희 jaiyah, 〈객체 지향 프로그래밍의 상속과 다형성〉, 《Web Club》
  3. 3.0 3.1 명우니닷컴, 〈제7장 객체지향개념 2-1. 상속(Inheritance)〉, 《개인블로그》
  4. Ara Blog, 〈자바(JAVA) 객체지향 특징 상속/캡슐화/다형성〉, 《개인블로그》, 2015-10-29

참고 자료


같이 보기


  의견.png 이 상속 (프로그래밍) 문서는 프로그래밍에 관한 토막글입니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 이 문서의 내용을 채워주세요.