계륵

계륵(鷄肋) : 먹자니 먹을 것이 별로 없고 버리자니 아까운 닭갈비란 뜻

삼국 시대로 접어들기 1년 전(219)인 후한말의 일이다. 위왕 조조는 대군을 이끌고 한중으로 원정을 떠났다. 익주[사천성]을 차지하고 한중으로 진출하여 한중왕을 일컫는 유비를 치기 위해서였다. 유비의 군사는 제갈량의 계책에 따라 정면 대결을 피한 채 시종 보급로 차단에만 주력했다. 배가 고파 도망치는 군사가 속출하자 조조는 어느 날, 전군에 이런 명령을 내렸다.

“계륵(鷄肋)!”

‘계륵?’ 모두들 영문을 몰라 어리둥절하고 있는데 주부 벼슬에 있는 양수만은 서둘러짐을 꾸리기 시작했다. 한 장수가 그 이유를 묻자 양수는 이렇게 대답했다.

“닭갈비는 먹자니 먹을 게 별로 없고 버리자니 아까운 것이지요. 그런데, 지금 전하께서는 한중 역시 그런 닭갈비 같은 땅으로 생각하고 철군을 결심하신 것이라오.”

과연 조조는 며칠 후 한중으로부터 전군을 철수시키고 말았다.
(source from http://home.cein.or.kr)

C++로 코드를 작성해 본 사람들은 friend 키워드에 대해 들어 봤을 것이다. 물론 써 본 사람들도 있을 것이다. friend 키워드는 class A의 private, protected 멤버나 함수에 class B에서 접근해서 사용하고 싶을 때 쓴다. 즉, class A에서 friend B;라고 써주면 class B에서 class A의 protected 멤버나 함수에 접근할 수 있다.

그런데 곰곰히 생각해 보면 friend 키워드에서는 왠지 객체 지향적이지 않은 냄새가 난다. 객체지향은 상속으로 멤버와 함수를 받아서 사용한다. 그런데 상속을 통해서 멤버나 함수에 접근하다가 갑자기 필요에 의해 friend라는 키워드로 피를 섞지 않은 다른 클래스가 맘대로 접근하는 것이 기분이 썩 좋지 않다. 쓰면 편하긴 한데, 사용하면 설계가 제대로 안된거 같고, 이런 이유로 friend라는 키워드는 사용하기도 그렇고 안 써도 별 불편 없는 계륵과 같은 존재라 생각했다.

지금 PL을 맡고 있는 프로젝트에서는 VC++을 개발툴로써 사용하고 있다. 그리고 S/W 품질을 높이기 위해서 UnitTest도 도입했다. C++은 UnitTest를 하기 위해서는 Ruby, Python보다 상당히 불편하다. macro로 하나씩 하나씩 TestCase를 만들어 주어야 하기 때문이다. 그런데 friend 키워드의 진가(?)를 UnitTest를 하면서 발견할 수 있었다. class A의 UnitTest 클래스 class ATestCase를 만들었다고 하자. 그런데 class A의 protected, private 함수를 UnitTest를 하고 싶다면? 이 때는 할 수 없이 friend 키워드를 사용해야 한다.

Java, C# 등의 C++ 다음에 나온 oopl에서는 package와 namespace의 개념이 있기 때문에 같은 package와 namespace에서는 protected로 선언된 멤버 함수와 변수에 접근할 수 있다. 즉, 두 언어에서는 UnitTest 시 같은 package를 사용한다면 protected 멤버 함수를 테스트할 수 있다. 따라서 friend 키워드는 이런 이유로 Java, C#에서는 찾아볼 수 없다.

그렇다면 C++에 비해서 Java가 더 좋은 언어일까? 물론 지금 입장에서 보면 더 객체지향적인 언어라 할 수 있지만, C++이 Java보다 먼저 만들어진 언어라는 사실을 잊어서는 안된다. 따라서 C++의 문제점을 더 보완한 것이 다음 언어의 특징이 된다. 그렇기 때문에 단순히 어떤 언어가 다른 언어보다 우월하다는 이야기는 부질 없다.

어찌 되었건 friend 키워드야 미안하다. 넌 계륵이 아니었구나!!



About the Author

Hani

This is Hani! My job is consulting, system design and project management... Sometimes coding. I hope you have a great time on my blog.

Leave a Reply

가끔 스팸차단기에 의해 코멘트(트랙백)가 막히나, 하루에 한번씩 정상처리 해드립니다.