Microsoft MVP성태의 닷넷 이야기
Winform UserControl 상속 vs 감싸기? [링크 복사], [링크+제목 복사],
조회: 6302
글쓴 사람
김성민 (mad7322 at gmail.com)
홈페이지
첨부 파일
 

안녕하세요.
여기저기 찾아 봤지만 마땅한 자료를 찾을 수 없어서,..
혼자서만 개발을 해오다 보니 물어볼곳이 없어서 찾아오게 되었습니다.

Syncfusion이나 Devexpress 같은 외부 UI 컨트롤을 사용하여
자체 컴포넌트를 개발을 하려고 합니다.

이때 종속성을 최대한 없애려고 하는데 아래 2가지 방법중 어느것이 더 나은 방법인지에 대해
질문 드리고자 합니다.


1. 상속
public partial class MyTextBox : Syncfusion.Windows.Forms.Tools.TextBoxExt
{
}

2. 감싸기??
public partial class MyTextBox : Control (또는 UserControl)
{
  private Syncfusion.Windows.Forms.Tools.TextBoxExt _base = new Syncfusion.Windows.Forms.Tools.TextBoxExt();

  public MyTextBox()
  {
    _base.Parent = this;
  }
}


원래는 2번의 방법으로 하려고 했습니다. 제가 원하는 기능만 public으로 제공할 수 있고 나중에 교체를 해도 전체 프로그램에 영향이 가지 않아서요.
그런데 저렇게 할 경우에는 문제가 Form에서 MyTextBox을 생성하면 Control 내부에 Control이 생기면서 실질적인 TextBox(_base)가 내부 Control에 위치 하면서 2중 구조가 된다는 겁니다.

  // text.Controls[0]가 존재하게 됨
  MyTextBox text = new MyTextBox();

개인적으로 이렇게 되면 MyTextBox를 생성할때마다 실제로는 2배의 Control이 생기게 되고, 프로그램의 부피가 커지면 성능에 영향을 끼치지 않을까 생각합니다.
뭔가 Form 내부에 Control이 필요없이 생긴다는 찜찜함도 있고요.

그렇다고 1번의 방법으로 가기도 좀 그런 것이...
1번의 방법은 상속을 받기 때문에 Public으로 된 모든 메소드와 속성이 외부에 노출이 되고
이는 곳 종속성이 생길수 밖에 없는 구조기 때문입니다.

뭐가 더 좋은 방법인지, 아니면 다른 좋은 방법이 있는지 질문 드립니다.








[최초 등록일: ]
[최종 수정일: 1/13/2021]


비밀번호

댓글 작성자
 



2021-01-13 07시00분
당연히 그런 경우에는 1번 방식으로 하는 것이 좋습니다. public으로 인한 종속성 걱정은, 별도 인터페이스를 만들어 사용 측에서 가능한 인터페이스를 통해 접근하도록 신경쓰는 수고가 필요합니다. 아니면 2번의 방법에서 자식 컨트롤로 제공하지 않고 그것 스스로 Control의 기능을 구현하며 내부적인 동작을 Syncfusion 또는 Devexpress의 컨트롤로 이양을 시켜야 하는데 그 작업은 오히려 말도 안 되는 코딩양이 될 것입니다.

감싸기의 경우는, 복합 컨트롤을 자식으로 두고 사용할 때 유용합니다. 물론 컨트롤이 많지 않다면 이런 경우에도 방법일 수 있는데, 당연히 많아지면 성능이 떨어질 수 밖에 없습니다.

사실, 벤더가 바뀌는 차원의 종속성을 제거하는 것은 어떤 식으로 해도 힘듭니다. 예를 들어, DB의 경우에는 마이크로소프트 측에서 System.Data에 정의한 인터페이스로 모든 db provider들이 구현하고 있기 때문에 그나마 쉽게 가능한 것입니다. 하지만 그런 DB 조차도 SQL 서버에서 오라클로 바뀌면 벤더 의존적인 쿼리들은 모두 변경해야 하는 수고가 따르기 때문에 엄밀히는 포팅이 쉽다 뿐이지 100% 종속성이 제거된 것은 아닙니다.
정성태
2021-01-13 10시50분
[김성민] 답변 감사합니다. 아직 어떤식으로 작업을 할지에 대해서 결정을 하지는 못했지만 답변 주신내용이 좋은 참고가 될 것 같습니다. 종속성을 100% 버릴 수 없다면 최선이 될 수 있도록 방법을 강구해 봐야 겠네요.
[guest]

... 31  32  33  34  35  36  37  38  [39]  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
4884user8/31/20179539    답변글 [답변]: UI 변경 작업 여러개를 동시에 사용하려면 어떻게 해야되나요 ??파일 다운로드1
4881kmi8/30/20179696진행속도가 중간에 더뎌지는 문제가 있는데 해결할 수 있는 방법이 있나 궁금합니다. [3]
4880김호종8/29/201710109HTTP JSON POST 관련 질문 드립니다. [1]
4879aos8/27/201710287DateTime 표시할 때 포맷 설정시 밀리초까지 포함하는 법이 궁금합니다 [1]
4878heyh...8/25/201710377프로세스의 프로세스 찾기(?) [2]
4877강준8/24/20179586SQLite journal_mode=wal 관련하여 질문드립니다. [1]
4876heyh...8/23/20179815프로세스 초기화하기 [1]
4874ho8/22/20179910파일 확장자명을 이용해 파일의 실행 프로그램의 전체 경로를 얻어 올 수 있을까요? [1]
4875ho8/23/201710830    답변글 [답변]: 파일 확장자명을 이용해 파일의 실행 프로그램의 전체 경로를 얻어 올 수 있을까요? [1]
4873kmi8/21/201711735전역 변수를 쓰지 않고 여러 군데에서 같은 변수를 공용하는 방법이 궁금합니다. [4]
4872abcd8/18/201710458프로세스를 초기화 하는 명령어도 있나요? [1]
4871kmi8/17/201711796메모리 부족으로 종료되는 현상의 여러가지 이유가 무엇인지 궁금합니다. [2]
4870heyh...8/14/201710586프로그램 실행시 중복일 때 버튼 색깔 원래대로 돌리기 [1]
4868kmi8/4/20179886string[] 에 Reverse 적용방법 질문해봅니다 [3]
4867heyh...8/4/20179397EventHandler에 관한 [1]
486610년차8/3/20179825dsoframer axframer open시 기존 오픈되어있는 엑셀을 먹어버리는 현상 [1]
4865heyh...7/31/201711313클릭원스로 배포 한 프로젝트가 끝났는지 알 수 있는 방법 [8]
4864초보자7/28/201710306DllIImport질문 드립니다. [1]
4863다연아빠7/23/201710550전역 예외처리에 대해 질문있습니다. [3]
4861라르크7/17/201715815window form 예제 따라하는 중인데 12.3 서비스 응용 프로그램에서 진행이 안됩니다. [3]파일 다운로드1
4859heyh...7/10/201710421다른 환경에서 실행하기 [1]
4858heyh...7/10/201710266Clickonce update에 관한질문입니다. [1]
4857heyh...7/7/201710862제가 여태까지 작성한 보고서입니다. [2]파일 다운로드1
4856heyh...7/6/20179535성태님 다른질문입니다. [4]
4855JP7/6/201710236Dispose 패턴 구현시 Finalize 재정의에 대한 질문드립니다. [2]
4854heyh...7/6/20179687
... 31  32  33  34  35  36  37  38  [39]  40  41  42  43  44  45  ...