Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
Mission (2). 연습문제 풀이
#pragmatic
2년 전
1,098
1

연습문제 2. 모드리스 대화상자와 모달 대화상자 가운데 어떤 것이 더 직교성이 좋은 설계를 만들까?

풀이 과정>

현재 하고 있는 개발 언어 중 주 언어가 c# 이라 프로그래밍 할 때 특별한 생각없이 폼을 띄울 때 무작정 쓰고 했던 ShowDialog 와 Show 에 대해서 확실히 알게 되었다.

프로그래밍 시 단순 하게 새로운 폼을 띄울 때는(메인 폼과 다른 기능이 필요할 때) Show 사용해서 폼을 띄우고, 입력값이 필요 할때 던지 아님 메시지 출력을 보여주고 싶을 때는 ShowDialog 를 띄우고 했었는데, 또한 막연하게 Show는 호출하는 폼과 연관관계가 없는 것, ShowDialog는 호출하는 폼과 연관관계가 있어 제어가 필요할 때만 쓰는 것라고 알고 있었다.

이번에 해당 문제에 대한 검색을 통해서 아래와 같이 체계적으로 알게 되었다.

일단 용어 정리 부터 하자면,

- 모달(Modal): 모달은 대화상자(dialog)가 실행될 때 제어권을 독점하게 되어, 대화 상자가 종료되기 전까지는 기존 화면을 제어할 수 없는 방식을 뜻한다.(예를 들어 JavaScript의 confirm과 alert이 이에 해당)

- 모달리스(Modeless): 흔히 모달리스 혹은 모드리스라고 부르며, 모달과 반대되는 개념으로 생각하면 쉽다. 모달리스는 대화 상자(dialog)가 실행되더라도 기존 화면을 제어할 수 있는 방식을 뜻한다.(예를 들어 웹 사이트들의 알림 메시지 등으로 흔히 사용되는 토스트 메시지(Toast Message)를 생각하면 된다.)

프로그램 입장에서 정리 하자면,

- 한 개의 폼에서 다른 폼을 호출했을 때, 호출된 폼을 자식 폼(child form)이라 부르고, 호출한 폼을 부모 폼(parent form)이라 부른다.

- 모달 대화상자(modal dialog box)는 자식 폼을 닫기 전에는 부모 폼으로의 작업 전환이 되지 않는 대화상자를 말한다. 자식 폼을 닫아야만 부모 폼으로 작업 전환이 된다.

- 모달리스 대화상자(modeless dialog box)는 자식 폼을 닫지 않고도 부모와 자식 폼 사이에 자유롭게 전환하면서 응용프로그램을 실행할 수 있다. 자식 폼을 닫지 않아도 부모 폼으로의 작업 전환이 된다.

또한 다른 개념에서 쓰레드와 메시지 루프에 대한 정리하면,

- Modal 다이얼로그를 띄우면 무슨 일이 일어나는가? Form.ShowDialog()를 호출하면 해당 폼이 Close 되지 않는 한 그 프로그램 내의 다른 폼 들을 엑세스할 수 없다.

- 그러면 새로운 폼(Form2) 윈도우는 새로운 쓰레드에서 도는가? 혹은 새로운 메시지 루프를 갖는가? Modal 다이얼로그를 생성하는 ShowDialog() 메서드는 새로운 쓰레드를 생성하지 않는다. 하지만, 내부적으로 Application.RunDialog()를 호출하여 새로운 메시지 루프를 생성한다.

- 즉, Form1 을 실행하던 메인 UI 쓰레드가 Modal 다이얼로그를 띄우고 새로운 메시지 루프를 돌며 그 다이얼로그의 UI 메시지를 처리하게 된다.

- 그렇다면, Non-Modal 다이얼로그는 어떠한가? Form.Show() 메서드로 Non-Modal 다이얼로그를 띄우면, 해당 Form2 윈도우에 Owner 윈도우를 셋팅한 후 그 폼을 보여주게 된다. Owner 윈도우는 Form1 이 되는데, 만약 Form1을 Close하면 Form2는 자동으로 Close되는 효과를 갖는다.

- Non-Modal 다이얼로그는 새로운 쓰레드를 생성하지도 않고, 새로운 메시지 루프를 생성하지도 않는다. 즉, 메인 쓰레드가 메인 메시지 루프를 이용해 Non-Modal 다이얼로그 메시지를 처리하는 것이다.

다시 문제로 돌아가서, 확실히 부모 폼에 종속적인 모달 대화상자보다 종속적이지 않은 모달리스 대화상자가 결합도가 낮으며 직교성도 좋을 것이다.

하지만 내 생각에는 모달 대화상자든 모달리스 대화상자든 종속적이 필요할 때와 필요하지 않을 때에 쓰임에 따라 사용할 상황이 있다는 것이다. 그러므로 상황에 따라 적절하게 사용하는 게 맞지 않을 까 싶다.

참고링크>

https://string.tistory.com/47: [프로그래밍] 모달과 모달리스는 무엇이고 어떤 차이가 있을까?

https://m.blog.naver.com/jwcwjung/222261851657: (C#강의 014) 윈폼 (3): 모달 대화상자/모덜리스 대화상자

https://www.csharpstudy.com/DevNote/Article/21: 모달 vs 모달리스 다이얼로그 - 쓰레드와 메시지 루프

책에 있는 해답>

제대로만 한다면 아마 모드리스일 것이다. 모드리스 대화상자를 사용하는 시스템은 어떤 특정한 시점에 어떤 일이 일어나고 있는지 신경을 덜쓰게 된다.

이런 시스템은 시스템의 상태에 대해 기본적인 가정을 가지고 있는 모달 시스템보다 더 발달된 모듈간 의사소통의 인프라를 가질 가능성이 높다.

모달 시스템이 가진 가정은 결합도를 높이고 직교성을 떨어뜨리게 된다.

1 comment