C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[12545] NULL vs. Empty List: 효율성의 논쟁
강신영.Divinespear [kang594] 3354 읽음    2006-12-21 02:06
저도 실명.ID 식으로 변경했습니다....흐흐흐흐
여자이름으로 보이십니까? 아쉽게도 저도 남자입니다 ㅡㅡ; (옆구리 시려워요~)
-------------------------------------------------------------------

우리는 보통 실행시키면 그 결과로 배열이나 리스트 오브젝트(이하 리스트)를 뱉어내도록 하는 함수를 자주 만듭니다.
하지만 여기서 사람들이 큰 두 그룹과 작은 하나의 그룹으로 나뉘어지는데...

먼저 작은 하나의 그룹은 (하지만 여기에 대부분의 델파이 개발자가 포함된다는거) 아예 배열이나 리스트가 반환되지 않도록 코딩합니다.
배열이나 리스트를 인자로 넘겨서 내부에서 지지고 볶고 한 다음에 반환을 '바로 그', 또는 '추가로 생성해서 인자로 넘긴' 배열이나 리스트에다가 하지요.
이래서 function을 procedure(void)로, 혹은 배열이나 리스트의 길이를 리턴하는 function으로 만듭니다.


하지만 요즘 유행하는 나머지 큰 두 그룹의 경우 이런 함수를 만드는데 주저함이 없습니다.
(참고: 이런 식으로 함수가 조건에 따라 어떤 오브젝트를 뱉어내는 경우를 패턴에서는 팩토리 함수라고 하죠.)
그럼 여기서 두 개의 커다란 그룹이 무엇이냐? 하는 답이 나와야 인지상정!
(이라고 말할거라고 예상한 사람? 없나요?)

첫번째 그룹은 반환될 배열이나 리스트 오브젝트가 비어있을 때 null을 반환합니다.
두번째 그룹은 말 그대로 빈 배열이나 빈 리스트 오브젝트를 반환합니다.


- 첫번째 그룹 (null 반환) -

이 그룹의 장점은 아무래도 메모리 할당/해제 속도에 대한 이득을 얻는다는거겠죠.

단점은? 없다고 생각하십니까? 진짜로?
단점은 바로 프로그래머가 null이 넘어오는지 일일히 체크해야 한다는 겁니다.
그러면 당근 코딩량이 늘어나죠. 혹시나 버그가 날까 노심초사 해야 할 수도 있습니다.
(젠장! 차라리 제일 위의 방식이 낫겠어!)


- 두번째 그룹 (빈 배열/리스트 반환) -

이 친구들의 경우에는 바로 결과 가지고 루프돌면 됩니다.
한가지 멋진 사실은, null을 처리하기 위한 추가 코딩도 필요가 없다는 겁니다. 에러도 없지요. 버그요? 물론 없습니다.

단점은 첫번째 그룹의 장점의 반대죠. 메모리 할당/해제에 대한 오버헤드가 있습니다. 특히 자주 할당/해제가 난다면 치명적일 수도 있겠네요.
그리고 메모리 해제를 함수를 호출한 쪽에서 해야 한다는것, 잊지 마시구요.

하지만 이 경우에는 장점이 단점을 상쇄하고도 남는다고 생각합니다.


이 글에는 결론을 못내겠군요.
이 자체만으로도 논쟁거리가 될 소지가 충분하기 때문에
제가 여기다가 결론을 내버리면 아주 난리가 나겠지요.... 헤헤

개인적으로는 두번째 그룹처럼 씁니다.
요즘은 Java가지고 많이 놀다보니 특히 두번째 방식이 아주 좆쿠나 라는걸 많이 느끼죠.
(아차! 결론을 내버렸다!!! orz)

반론은 언제든지 환영합니다. 하지만 너무 과격하게는 적지 마세요!
신동승,無敵 [moojuck]   2006-12-21 03:26 X
음.. 저는 작은 그룹과 두번째 그룹에 모두 속하는 군요. 때에 따라 두가지 방식을 혼용합니다. 근데 null 반환은 여기서 처음 보네요. ㅎㅎ
ayh [h1800]   2006-12-21 04:04 X
제 경우에도 작은 그룹이라고 얘기하신 외부에서 할당해서 인자로 넘기는 방식을 사용하거나 큰 그룹의 두번째 얘기하신 일단 할당된 객체를 반환하는 경우를 선호합니다.

이런 얘기는 사실 결론이 "필요에 따라서" 일게 분명합니다만, 제 개인적으로 메모리 할당/해제가 지나치게 빈번할 여지가 있는 개발은 없었기 때문에 되도록 항상 안전한 방향으로 진해하게 된 것 같습니다. 지난 번에 필요에 의해서 첫번째 방식이라고 할만한 방식으로 만들어 본적이 있는데, 익숙하지 않아서 인지는 모르지만 NULL 인지 확인하는 코드를 간간히 빼먹어서 문제가 생기는 경우가 심심찮게 발생하더군요. 꼭 필요하지 않다면 안전제일이 아닐까 생각됩니다.
강재호.만해 [greenuri]   2006-12-21 10:26 X
저 같은 경우에는 메모리 누수때문에 항상 NULL 체크 하는게 습관이 되어가서
그냥 1번 케이스 씁니다. ^^
아니면 리턴값은 bool값으로 하고, 배열이나 리스트를
Const * &로 전달해서 받고 하는식으로 해서 리턴값으로 배열 생성 유무를 확인 하는것도
좋지 않을까요?
김상구.패패루 [peperu]   2006-12-21 10:30 X
NULL을 반환하는 방식으로 만든다는 것은 리스트를 함수 내부에서 생성한다는 이야기인데 이 방식은 매우 위험하면서도(사용후 파괴를 안하면 그대로 메모리 릭이죠) 같은 함수를 다른 분야에 적용할 때에도 매우 경직되는 별로 권장할만한 방식이 아닙니다.

아주 대표적인 예가 비록 리스트 클래스는 아니지만 VCL의 TStream을 인자로 받는 각종 함수들이 되겠군요. TStream을 인자로 전달하는 함수들은 TMemoryStream이나 TFileStream등 다양한 Stream 클래스에 대해 같은 작업을 해 줄 수 있지만 함수 내에서 TMemoryStream을 생성해서 포인터를 반환한다고 해 보세요. TMemoryStream밖에 못 씁니다.

NULL을 반환하지 않고 Empty객체를 반환하는 경우도 이런 문제는 똑같이 존재합니다. 이 경우 역시도 언제나 유효한 포인터를 반환한다는 강점은 있지만 역시 함수 내부에서 컨테이너를 직접 할당한다는 점은 같습니다.

두 경우 모두 가비지 컬렉션이 자동으로 이루어지는 언어에선 사용의 편의성이라는 측면에서 사용될 수 있겠지만 그래도 유연함까지 커버해 줄 수는 없습니다.

그러나 이 글 조차도 무조건 리스트는 함수 인자로 전달하는게 좋다는 의미로 파악하진 마시길...
김상구.패패루 [peperu]   2006-12-21 10:33 X
추가로... 이런 논쟁?(이런게 논쟁 축에 끼는지 잘 모르겠음)에 시간을 투자할 가치가 있는지...
아제나 [azena]   2006-12-21 11:20 X
메모리 해제를 함수 호출쪽에서...(라니...)

함수 안에서 메모리 할당하는거 나빠요~ (전형적인 C프로그래머의 생각)
TohnoLyn [tohnokanna]   2006-12-22 02:33 X
전 습관상 그냥 Null을 반환하는..

+ -

관련 글 리스트
12545 NULL vs. Empty List: 효율성의 논쟁 강신영.Divinespear 3354 2006/12/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.