최근에 객체지향프로그램인 JAVA의 초기 입문서인 Head First Java를 모두 읽었습니다. 그런데 읽으면서 아주 흥미로운 사실 하나를 읽게되었고 깨닫게 되었습니다. 바로 객체지향에 있어서 어떤 프로그램을 작성하는데 세포단위(즉 더 이상 쪼갤 수 없는 기능이 상실되지 안는 최소한의 단위)로 쪼개어 설계하고 기능을 만들어야 한다는 점 이었습니다.


물론 이런 식의 글은 누군가는 썼을 것입니다. 사실 고찰이라는 제목을 썼지만, 아주 개똥철학일 수 있습니다. 누군가에게 나의 대단함을 내보이려기 보다는 그냥 내 생각을 정리함으로 조금더 확실한 학습을 유도하려는 스스로에대한 글인 것입니다.


돌아 와서 세포단위로 쪼개어 설계하고 기능을 구현한다는 것은 다음을 예를 들어 설명하고 싶습니다.


세포단위 기능구현


예를들어 자바에서는 외부의 파일을 읽어 드리거나 외부 파일을 만들거나 파일에 내용을 기제할 때, InputStream 또는 OutputStream과 같은 객체를 다른 객체와 Chain하여 쓰고 있습니다. 왜 굳이 Stream과 특정 객체를 체인하여 사용할까요?? 그것은 Stream에서 하는일과 각 객체 File 또는 FileWriter에서 하는 일을 불리함으로서 File 또는 FileWriter가 아닌 다른 객체 또는 다른 일(예를 들어서 Stream형태로 외부의 컴퓨터와 통신을 하게 될 때)을 하게 될 때 쉽게 변경 또는 확장하는 것이 쉽기 때문입니다.


이와 같이 객체지향적으로 프로그램을 하려면 최소단위로 그 기능을 쪼개는 시도와 고민을 많이 해야 할듯 하다는 것이 결론입니다. 물론 이 과정에서 List와 ArrayList와 같은 관계가 생길 수도 있습니다. 즉, 인터페이스와 추상클래스와 같은 다형성의 활용이 필요하게 될 수도 있다는 것입니다. 그렇기 때문에 다형성(Polymorphism)을 알아야 하며, 중요하고 중점적으로 파고들어야 하는 핵심중의 핵심이라고 말하고 싶습니다(핵심이다보니 아주 어렵습니다. 하지만 꼭 잘이해를 해야만 하는 부분임은 확실합니다).


세포단위 기능구현에서 주의 할 점


프로그램을 작성하는데 있어서 세포단위로 생각한다는 것은 아주 중요하지만, 주의 할 점이 많다고 생각합니다.


1.세포로서의 생명력(?)이 있어야 합니다.

2.증식 또는 배양을 통하여 또 다른 종으로서 사용할 수 있게해야합니다.


위의 두 가지 규칙은 반드시 존재해야만 하는 기능이라고 필자 스스로는 생각합니다. 이유는 간단합니다. 하나하나 풀어보자면 필자가 "세포단위"라고 말할 때 "세포"라는 단어를 굳이 선택한 이유는 세포라는 것은 최소한이긴 하지만 생명력이 있다는 것을 말하고 싶어서 였습니다. 프로그램에서 생명력이란 하나의 움직임 즉 기능이라고 할 수 있습니다. 가장 기초가 되는 기능 그 것이 바로 "세포단위" 기능 구현인 것입니다.


예를들자면 자바에서 String은 하나의 클래스입니다. String클래스는 그 하위에 많은 메소드들을 가지고 있는데, 이 것이 String클래스를 정의하는 최소한의 기능들입니다. 이 기능들을 활용하거나 확장하여 다른 많은 작업들을 할 수 있습니다. 이 String 클래스에서 구현되어있는 최소한의 기능들은 분리되거나 한다면 그 생명력은 String클래스 하나만으로는 존재할 수 없는 즉 생명력이 없는(다른 클래스가 있어야 기능이 되거나 하는) 클래스가 될 것입니다. 물론 인터페이스나 추상클래스와 같은 것 들은 생명력이 없는 것 아니냐는 질문을 할 수 있지만 그러한 인터페이스나 추상클래스 조차도 어떤 객체에 사용되면 오버라이드가 되지 않는 한 확장 또는 구현(Implements)선언 만으로 구현 되는 기능들이 존재합니다. 차라리 생명력이 있는 하나의 클래스를 만들기 전에 인터페이스나 추상클래스같은 것들을 만들어서 파생적으로 세포로서 생명력이 있는 클래스를 만든다면 다형성의 좋은 예로서 활용될 것입니다.


마지막으로 "증식 또는 배양을 통하여 또 다른 종으로서 사용할 수 있게해야합니다."는 주의 사항은 내가 만든 클래스를 누군가 확장하거나 재사용이 가능 하도록 만들어야 한다는 것입니다. 바로 위에서 설명했듯이 인터페이스나 추상클래스와 같은 녀석들은 자체적으로 존재할 수 없습니다. Head First Java에서는 추상클래스를 다음과 같이 예를 들었습니다.


동물에는 개과 고양이과와 같은 식의 종의 분류들이 있습니다. 이 종의 분류는 실제하기는 하지만 종의 분류자체가 하나의 동물은 아닙니다. 이와 같이 추상 클래스는 다형성에서 상속과 관련하여 하나의 종의 분류와 같이 사용할 수는 있지만, 그것 자체로서는 하나의 객체가 될 수 없는 것이어야 한다고 말합니다.


인터페이스도 이와 비슷합니다. 다중상속을 허용하고 있지 않은 자바에서 다중상속과 비슷한 역활을 하는 것이 바로 이 인터페이스입니다. 인터페이스는 다음과같이 설명합니다. 상속관계와 무관하게 어떤 객체가 확장성을 위하여 가지고 있어야 하는 특성(또는 하는 일)이 필요할 때 인터페이스를 만들고 이를 구현합니다.


위에 밑줄 친 두 개의 예문은 좋은 예시가 되어 주리라 생각합니다. 어떤 객체를 만들기 앞서 그 객체들의 고통관심사나 공통분모를 찾아 내어서 하나의 추상클래스나 인터페이스화 하는 것 이것은 후에 내 클래스가 누군가에 의해서 확장되는 데에 많은 영향을 줄 것이라고 생각합니다.


마치며...


필자는 최근에 2개의 프로그램을 만들어 보았습니다. 하나는 TelegramSpliter(SVN 주소입니다. 받아서 확장하실 분은 메일 주시거나 댓글로 의사표현을 해주시면 함께 발전해 나갈 수 있었으면 하는 바램입니다)로 전문을 받아서 사용자가 입력해준 전문 길이로 전문을 나누고 사용자가 입력해준 클래스로 자동으로 Wrapping해주는 프로그램을 만들어 보았고, 또 하나는 전문을 가지고 오는 프로그램(각가지 방식-FTP, HTTP, SSH등-으로 통신하는)을 만들어 보았습니다. 이 때 Head First Java에서 배운 내용으 가지고 여러가지 활용을 해보면서 사용해 보았습니다. 앞으로 내공을 더 쌓아서 객체지향 프로그램에서 스프링이나 스트러츠를 만들었던 분들과 같이 되고 싶은 것이 내 바램입니다.

Posted by gofly

댓글을 달아 주세요