C# 프로젝트에서 종속성을 해결하는 인터페이스 활용법: MainForm과 SubForm 간의 상호작용 문제 해결해 보도록 합시다. 😊 물론 Action과 같은 델리게이트를 활용할 수도 있는데요, 이번 예제에서는 인터페이스로 해결하는 방법에 대해 안내해드릴게요.
프로젝트 종속성 인터페이스로 해결하기
C# 윈도우 폼 애플리케이션 개발 시, MainForm과 SubForm 간의 상호작용이 필요할 때 종종 종속성 문제에 직면합니다.
특히 MainForm이 SubForm을 열거나, SubForm에서 MainForm의 메서드를 호출하고 싶을 때 이러한 문제가 발생합니다. MainForm이 SubForm에 종속된 상황에서는 SubForm이 직접 MainForm을 참조할 수 없기 때문에, SubForm에서 MainForm에 접근할 수 있는 방법을 찾아보겠습니다~
C# 프로젝트에서 인터페이스를 사용하여 이러한 종속성 문제를 해결하고, CoreProject를 활용해 MainForm과 SubForm 간의 상호작용을 효과적으로 처리하는 방법을 확인해 봅시다.
종속성 문제
프로젝트에서 MainForm이 SubForm을 여는 경우가 자주 있습니다. 예를 들어, MainForm에서 버튼을 클릭하여 SubForm을 열고, SubForm에서 다시 MainForm의 데이터를 참조하거나 메서드를 호출하는 시나리오가 있을 수 있습니다.
하지만, MainForm이 SubForm에 종속되어 있는 경우 SubForm에서 MainForm을 직접 참조하거나 사용하는 것이 불가능합니다. (CS0246 형식 또는 네임스페이스 이름을 찾을 수 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요) 이를 해결하려면 프로젝트 간의 결합도를 낮추는 방법이 필요합니다.
인터페이스를 사용하여 결합도 낮추기
종속성 문제를 해결하는 가장 좋은 방법 중 하나는 인터페이스를 사용하는 것입니다. 인터페이스는 클래스 간의 결합도를 줄여주고, 상호작용할 수 있는 공통된 계약을 제공합니다.
이를 통해 SubForm에서 MainForm을 직접 참조하지 않고도 MainForm의 메서드에 접근할 수 있답니다.
CoreProject로 상호작용 해결
프로젝트 구조 설정
- MainProject: 애플리케이션의 메인 폼을 포함하며,
MainFormBs가 존재합니다. - SubProject: 서브 폼을 포함하고,
SubFormBs가 존재합니다. - CoreProject:
IMainBs인터페이스를 포함하며, MainProject와 SubProject 모두가 이를 참조합니다.
CoreProject 인터페이스 정의
CoreProject에 인터페이스를 정의하여 MainForm과 SubForm 간의 상호작용을 가능하게 합니다. IMainBs 인터페이스는 MainForm에서 제공할 메서드를 정의합니다.
namespace CoreProject
{
// MainForm에서 제공할 메서드를 정의하는 인터페이스
public interface IMainBs
{
void ShowMessage(string message); // 메시지를 보여줄 메서드 정의
}
}
MainFormBs에서 인터페이스 구현
MainFormBs는 IMainBs 인터페이스를 구현합니다. 이때, MainFormBs는 SubFormBs를 MDI 자식 폼으로 열고, IMainBs 인터페이스를 전달하여 SubFormBs에서 MainFormBs의 메서드를 호출할 수 있도록 합니다.
using CoreProject;
using SubProject;
using System;
using System.Windows.Forms;
namespace MainProject
{
public partial class MainFormBs : Form, IMainBs
{
public MainFormBs()
{
InitializeComponent();
IsMdiContainer = true; // MainForm을 MDI 컨테이너로 설정
}
// IMainFormBs 인터페이스 구현
public void ShowMessage(string message)
{
MessageBox.Show($"MainForm에서 받은 메시지: {message}");
}
// SubFormBs를 열기 위한 버튼 클릭 이벤트
private void btnOpenSubFormBs_Click(object sender, EventArgs e)
{
// SubFormBs를 MDI 자식으로 열기
SubFormBs subFormBs = new SubFormBs(this); // 인터페이스(this)를 전달
subFormBs.MdiParent = this; // MDI 자식 폼으로 설정
subFormBs.Show();
}
}
}
SubFormBs에서 MainFormBs 접근
SubFormBs는 IMainBs 인터페이스를 통해 MainFormBs의 메서드를 호출합니다. 이를 통해 SubFormBs는 MainFormBs에 대한 직접적인 종속성을 없애고, 인터페이스를 통해 간접적으로 접근할 수 있습니다.
using CoreProject;
using System;
using System.Windows.Forms;
namespace SubProject
{
public partial class SubFormBs : Form
{
private IMainBs m_iMainCoreBs;
// 생성자를 통해 MainForm의 인터페이스를 전달받음
public SubFormBs(IMainBs iMainCoreBs)
{
InitializeComponent();
m_iMainCoreBs = iMainCoreBs;
}
// SubForm에서 버튼 클릭 시 MainForm의 메서드를 인터페이스를 통해 호출
private void btnSendMessageToMain_Click(object sender, EventArgs e)
{
m_iMainCoreBs.ShowMessage("SubForm에서 메시지를 보냅니다!"); // 인터페이스로 MainForm의 메서드 호출
}
}
}
프로젝트 간 상호작용의 장점
1) 결합도 감소
인터페이스를 사용하면 MainForm과 SubForm 간의 결합도를 크게 줄일 수 있습니다. SubForm은 더 이상 MainForm에 직접적으로 의존하지 않고, CoreProject에서 정의된 IMainBs 인터페이스를 통해 MainForm의 기능을 호출합니다.
2) 유지보수성 향상
프로젝트 간의 종속성을 줄이면, 코드 수정이나 확장 시 훨씬 유연해집니다. MainForm이나 SubForm의 구현이 바뀌더라도 인터페이스만 유지되면 서로의 구현 세부 사항에 영향을 받지 않습니다.
3) 확장성 증가
추가 폼이나 기능을 도입할 때도 인터페이스 구조를 활용하면 새로운 폼이 MainForm과 상호작용할 수 있는 구조를 쉽게 확장할 수 있습니다. 이로 인해 프로젝트 구조가 유연해지고 확장성이 커집니다~
