지난번에 "객체를 이제좀 알것같다.(클래스 편)"에서 클래스라는 넘을 한번 쯤 내가 이해하는 수준에서 뒤집어봤다.
뭐 나름대로 정리해본 결과 "객체란 속성과 기능을 정의한 정의서이다."라고 정의내려버렸다.
거기에 한걸음 더 나아가 클래스안에 있는 녀석들과 대화할 수 있는 인터페이스까지 소스상에서 만들어봤는데 "왜 그래야 하는가?"에 대한 물음에 대답하라면 "모든 클래스가 public으로 구현된다면 대규모 개발에서는 반드시 충돌이 일어날거다"라는 궁색한 변명밖에 할 수 없고 그것이 정답이라고 할 수도 없다.
객체지향 프로그래밍이란 하나의 표준이다. 따라서 생산성과 표준화란 미명하에 자유로운 프로그래밍 스타일을 해치는 말을 하고 싶지 않고 간단한 예로 PHP란 언어를 보면 객체지향이든 절차지향이든 원하는 스타일대로 프로그래밍하고픈 대로 하면 되는 언어는 이것이 정답이니까 이것으로 꼭 해야돼!라고 하는 것 자체가 언어의 특성을 죽이는 결과만 낳을 뿐이기에 더욱 더 그러하다.
오늘 하고 싶은 이야기는 객체의 인터페이스에서 더 나아가 객체 전체를 인터페이스 하는 방법인 상속에 대해 쓰려한다.
상속이라고 하니 굉장히 딱딱한 용어가 되어버리는데 이런 예를 들면 어떨까?
흔히 게시판이라고하는 사용자 저작 툴 다시말해 큰 의미의 객체에서 그 기능을 보면 쓰기, 읽기, 수정, 삭제, 그리고 리스팅 이렇게 5가지의 큰 기능이 있고 그중 하나인 쓰기만 하더라도 텍스트 입력, 이미지 링크걸기, 파일 업로드, DB저장 등의 기능이 세분화 되며 다시 텍스트 입력을 보더라도 HTML 코드 입력, 색깔지정, 크기 지정 등등의 세부 기능이 또 따로 존재한다.
여기에서 프로그래밍에서 변치않은 명제 "Division & Conquer"를 대입해보자.
쪼게고 쪼게서 쪼겔때가 없는 나머지 하나를 공략해 구현한다는 취지에서 보면 우리는 제일먼저 텍스트입력기능을 하는 클래스부터 개발해야 할 것이다. 그리고 HTML입력 클래스를 개발할 것이고 이미지 업로딩 기능을 하는 클래스를 개발하고 등등등 세부 클래스를 만들것이다.
그렇다면 이제 문제 이것을 어떻게 합칠 것인가라는 문제에 도달한다.
차에 비교한다면 타이어와 브레이크, 조향장치, 엑셀, 엔진등의 부품을 사다놓고 이를 조립하는 과정이랄까?
다시말해 "상속은 조립이다"
이를 코드로 예제로 들면 다음과 같다.
using System;class Test { public static void Main() { //b클래스를 초기화한다. b b = new b(); //b클래스에 없는 abc인터페이스를 설정한다. b.abc = "Hello"; //b클래스에 없는 "mthod_a"를 호출하자. Console.WriteLine (b.mthod_a()); } }
public class a{ private string aa = "1234"; public string abc{ get { return aa; } set { aa = value; } } public string mthod_a(){ return aa; } }
public class b:a{ public string bb = "bbbb"; public string mthod_b(){ return bb; } }
예제를 보면 "b"클래스는 "a"클래스를 상속받았다. 이를 통해 무엇을 할 수 있는가?
Main()을 보면 "b"클래스를 초기화하여 메모리로 올렸음에도 a에 있는 인터페이스와 메소드를 작동시킬수 있는 것이다.
이것만 이해한다면 객체지향프로그래밍의 중요한 특징 2가지를 모두 이해한것이다.
나머지는 언어의 특성이므로 다음부터는 C#을 기준으로 이야기해보자.





469486
143
234





