본 자료는
1. SmartForm을 이용한 MDI 구조
2. 데이터 참조 방법
2-1. 폼 계층 구조에서 각 폼에 접근하는 방법
[CASE-1] 부모 폼과 자식 폼 간 참조 방법
[CASE-2] 자식 폼과 자식 폼 간 참조 방법
2-2. 객체를 공유하는 방법
2-3. 객체 참조 수단
3. 예제 설명
순서로 진행합니다.
SmartForm으로 MDI를 구성하여 폼 간 객체를 참조하는 경우 아래 표와 같은 특징과 장단점이 있습니다.
SmartInnerForm | SmartForm | |
---|---|---|
메인 폼 | SmartForm | |
자식 폼 | SmartInnerForm | SmartForm |
데이터(객체) 참조 방식 |
직접 접근 (별다른 처리가 필요 없음) |
속성 또는 메서드 |
물리적인 폼 수 | 1개 | N개 |
장점 | 폼 간 객체 참조가 편리함 | 컨트롤의 수가 많은 경우에도 물리적인 폼이 분리되어 있어 제한이 없음 |
단점 | 하나의 물리적인 폼에 컨트롤이 생성되어 컨트롤 수에 제한이 있음 |
폼 간 객체 참조가 SmartInnerForm에 비해 불편함 |
따라서 폼 수가 적어 SmartInnerForm으로 구현이 된다면 객체 참조가 간편한 SmartInnerForm을 사용하시기 바라며, SmartForm만을 사용하여 MDI를 구현한 경우 각각의 폼이 물리적으로 분리되어 외부의 다른 폼에서 폼으로 바로 접근할 수 없습니다. 즉, 각 폼들은 서로 다른 Form Class로 구현되어 있어 폼들 간에 서로 객체 참조를 하기 위해서는 별도의 방법이 필요합니다.
2. 데이터 참조 방법 2-1. 폼 계층 구조에서 각 폼을 참조하는 방법
MDI 구조는 하나의 부모(메인) 폼과 N개의 자식(서브) 폼으로 이루어집니다. MDI 구조는 계층 구조로 부모 폼과 자식 폼은 서로 수직 관계이며, 자식 폼과 자식 폼은 서로 수평 관계로 이루어져 있습니다. 이와 같은 폼 계층 구조에서 각 CASE에 따른 참조 방법을 안내합니다.
[CASE-1] 부모 폼과 자식 폼 간 참조 방법 | [CASE-2] 자식 폼과 자식 폼 간 참조 방법 | |
---|---|---|
계층 구조 및 참조 방향 |
수직 구조 순방향 : 부모 폼 → 자식 폼 역방향 : 자식 폼 → 부모 폼 |
수평 구조 순방향/역방향 : 자식 폼 → 자식 폼 |
참조 전달 필요 여부 |
불필요 (역방향 참조 시 부분 필요) |
필요 |
순방향 참조 방법 |
자식 폼 인스턴스 이용 | ※ 순방향/역방향 참조 방법 동일 1. 부모 폼을 경유하여 다른 폼 참조 2. 부모 폼으로부터 전달받아 다른 폼 참조 |
역방향 참조 방법 |
1. Owner 속성 이용 2. 전달받은 부모 폼 참조 |
부모 폼과 자식 폼은 서로 수직 관계로 부모 폼은 자식 폼들의 인스턴스를 이용하여 자식 폼을 참조할 수 있으며(순방향 참조), 자식 폼은 Form 클래스의 Owner 속성을 이용하거나 부모 폼으로부터 전달받은 인스턴스를 이용하여 부모 폼을 참조할 수 있습니다.(역방향 참조)
-
부모 폼 → 자식 폼 (순방향 참조) -
자식 폼 → 부모 폼 (역방향 참조)
자식 폼들은 서로 수평 관계로 서로를 직접 참조할 수 없으며, 참조하기 위해서는 두 가지 방법이 있습니다.
1. 부모 폼을 경유하여 참조
2. 부모 폼으로부터 상대 자식 폼의 인스턴스를 전달받아 참조
-
자식 폼에서 부모 폼을 경유하여 참조하는 방법 -
자식 폼에서 자식 폼을 직접 참조하는 방법
객체를 공유하는 방법은 폼에서 특정 폼의 객체를 가져오는 Getter 방법과, 폼에서 특정 폼으로 데이터를 전달하는 Setter 방법이 있습니다. 그림처럼 데이터를 공유받을 폼(ChildForm)에 참조 코드가 있다면 Getter 방법이고, 공유할 데이터가 위치한 폼(MainForm)에 참조 코드가 있다면 Setter 방법입니다. 아래 정리된 표를 참고하여 용도에 맞게 적용하시기 바랍니다.
[표] 특정 폼(Form1)의 객체를 다른 폼(Form2)에 공유할 때 Getter 방법과 Setter 방법의 비교-
Getter 방법 설명
객체를 사용할 폼(Form2)에서 특정 폼(Form1)을 참조하여 객체를 가져옵니다.
※ 참조 방향 : Form2 → Form1
※ 객체 전달 방향 : Form1 → Form2
객체 사용 폼(Form2)에서 참조 발생 여부발생함
장점1. Form2가 객체를 사용할 시점에서 Form1의 객체를 가져오므로 항상 최신의 데이터를 사용할 수 있음
2. Form1의 모든 Public 객체에 접근 가능하여 접근성이 높음
단점1. Form2 에서 사용하지 않는 Form1의 Public 객체에도 접근할 수 있게 됨
사용 용도1. 데이터의 업데이트가 빈번한 경우
2. 여러 Public 객체를 공유해야 할 경우
구현 방법※ 객체 위치 : Form1
※ 참조 코드 위치 : Form2
-
Setter 방법 설명현재 실행되고 있는 폼(Form1)에서 다른 폼(Form2)을 참조하여 객체를 전달합니다.
※ 참조 방향 : Form1 → Form2
※ 객체 전달 방향 : Form1 → Form2
객체 사용 폼(Form2)에서 참조 발생 여부발생 안 함
장점1. 필요한 객체만 접근하므로 명시적임
단점1. Form1에서 Form2로 객체가 전달되는 시점에서 데이터가 갱신되므로 Form2에서 객체를 사용할 때는 최신의 데이터가 아닐 수 있음
2. 전달받을 객체가 늘어날수록 인터페이스도 늘어나게 되어 접근성이 낮음
사용 용도1. 데이터의 업데이트가 간헐적이거나 공유할 대상이 상위 클래스, 컴포넌트인 경우
2. Form2에서 사용할 객체의 수 또는 타입의 변동이 적은 경우
구현 방법※ 객체 위치 : Form1
※ 참조 코드 위치 : Form1
데이터 참조 수단으로는 속성(Property)를 이용하는 방법과 메서드(Method)를 이용하는 방법이 있습니다.
속성(Property) | 메서드(Method) | |
---|---|---|
특징 | 여러가지 데이터 형태를 정의하여 전달이 가능하며 코드 내에서 연산 작업이 가능 | |
차이점 | 메서드처럼 사용하지만 오직 하나의 객체만을 넘길 수 있음 | 선택적으로 여러 데이터를 전달 가능 |
기본 형태 | // 참조할 변수 private int m_piData1; // 변수 참조를 위한 속성 public int piData1 { get { return m_piData1; }
} set { m_piData1 = value; } |
// 참조할 변수 private int m_piData1; // 데이터 참조를 위한 메서드 public void GetDataMethod(int iData) { return m_piData1;
}public int SetDataMethod(int iData) { m_piData1 = iData;
} |
3. 예제 설명
예제는 Form 3개(부모 폼 1개, 자식 폼 2개)로 구성되어 있으며 라디오 버튼값을 서로 공유합니다. 자세한 코드는 아래 예제 코드와 첨부한 프로젝트를 확인해보시기 바랍니다.