C언어만 사용하던 나는 솔직히 OOP 개념이 익숙하거나 크게 와 닿지 않는다.
중복된 기능의 함수나 DB Handler, Logger 등의 기능 단위를 구분할 수 있는 것들을 모듈화하여
Library 형태로 만들어 컴파일 할 때 추가하여 사용하곤 했다.
C#에서는 하나의 프로젝트 안에 여러 클래스를 생성하여 사용하는 것 같으니 방법을 정리해 보자.
delegate 테스트했던 프로젝트에 추가해서 진행하면 좋을것 같다.
2020/06/20 - [C#] - [C#] delegate, 폼 간의 DATA 공유
[C#] delegate, 폼 간의 DATA 공유
Trading 시스템을 내가 아닌 제 3자의 사용자적 입장에서 사용하도록 시뮬레이션 해 보았을 때 자식 Form을 새로 띄워서 값을 입력 받거나 확인할 수 있게 하는 작업이 많이 필요하단 것을 알게 되��
brandon-dev.tistory.com
Form2에서 입력했던 '아이디'와 '비밀번호'를 Form1에서 바로 출력하지 않고
새로운 클래스 파일(.cs)의 객체에 저장한 후에 그 값을 읽어와서 출력하는 방법으로 진행해 보자.
오른쪽 솔루션 탐색기에서 프로젝트 명의 오른쪽 클릭 후 [ 추가(D) ] - [ 새 항목(W) ]을 선택한다.

클래스를 선택 후에 입력할 사용자 정보를 관리할 'User_Info.cs' 파일을 추가한다.

User_Info Class는 ID와 Password, 두 개의 변수를 갖고, 각각의 값을 Set/Get하는 함수를 갖게 될 것이다.
ID와 비밀번호는 사용하는 Class에서 직접 접근할 수 없도록 'private' 접근 제한자를 사용하고, 각각의 값을 Handling 할 수 있는 'public' 함수를 만들어 사용할 수 있도록 한다. (이게 객체지향 방법이라는데...나는 익숙치 않아서....Anyway)
[ User_Info.cs ]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace delegate_test
{
class User_Info
{
private string Id; // 사용자 ID
private string Password; // 사용자 비밀번호
// 생성자
public User_Info()
{
Id = string.Empty;
Password = string.Empty;
}
public void SetId(string Id)
{
this.Id = Id;
}
public string GetId()
{
return this.Id;
}
public void SetPassword(string Password)
{
this.Password = Password;
}
public string GetPassword()
{
return this.Password;
}
}
}
참고로 나는 변수의 초기화를 굉~~장히 중요하게 생각하는 개발자다. (생성자에서 변수 초기화는 무조건 필수!!)
이제 User_Info Class를 어떻게 사용하는가...
두 가지의 방법이 있는데, 하나는 User_Info Class 내에 static 객체를 하나 생성해두고 다른 곳에서 호출해서 쓰는 방식이고 다른 하나는 User_Info Class를 사용할 곳에서 객체를 직접 생성해서 사용하는 방식이 있다.
< 방법 1> - Static 객체
[User_Info.cs]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace delegate_test
{
class User_Info
{
// static 객체
public static User_Info gUser_Info = new User_Info();
private string Id; // 사용자 ID
private string Password; // 사용자 비밀번호
// 생성자
public User_Info()
{
Id = string.Empty;
Password = string.Empty;
}
public void SetId(string Id)
{
this.Id = Id;
}
public string GetId()
{
return this.Id;
}
public void SetPassword(string Password)
{
this.Password = Password;
}
public string GetPassword()
{
return this.Password;
}
}
}
어디서든 접근 가능하도록 public으로 만든 static 객체를 만들어 둔다.
사용하는 방법은 간단하다.
User_Info 객체를 사용하고 싶은 곳에서 [클래스명].[객체명].[함수/변수]와 같은 형태로 사용하면 된다.
[Form1.cs]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace delegate_test
{
public delegate void LoginGetEventHandler(string id, string password); // 자식 Form EventHandler
public partial class Form1 : Form
{
static string static_id = "brandon";
Form2 Child = new Form2(static_id);
public Form1()
{
InitializeComponent();
Form2.LoginGetEvent += new LoginGetEventHandler(this.Login_Process); // EventHandler 등록
}
private void 로그인ToolStripMenuItem_Click(object sender, EventArgs e)
{
Child.Owner = this;
Child.ShowDialog();
}
private void Login_Process(string id, string password) // Event 발생 시, 처리할 함수 선언
{
// User_Info 객체에 입력 받은 정보 저장
User_Info.gUser_Info.SetId(id);
User_Info.gUser_Info.SetPassword(password);
// User_Info 객체에서 값 가져오기
string test_result = string.Empty;
//test_result = String.Format("ID : {0}, PW : {1}", id, password);
test_result = String.Format("ID : {0}, PW : {1}", User_Info.gUser_Info.GetId(), User_Info.gUser_Info.GetPassword())
textBox1.Text = test_result; // 자식 Form에서 수신한 값 표시
}
}
}

전과 동일하게 아이디랑 비밀번호가 출력되면 정상적으로 User_Info Class를 사용하는 셈.

사용자 정보의 경우, 프로그램내에서 단 하나만(!) 존재하는 것이기에 위의 예제처럼 static 객체로 선언해서 쓰는것이 좋을 것 같다. 상황에 따라 여러개의 객체가 필요한 경우는 아래처럼 사용하면 된다.
[Form1.cs]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace delegate_test
{
public delegate void LoginGetEventHandler(string id, string password); // 자식 Form EventHandler
public partial class Form1 : Form
{
// User_Info 객체 생성
User_Info gUser_Info = new User_Info();
static string static_id = "brandon";
Form2 Child = new Form2(static_id);
public Form1()
{
InitializeComponent();
Form2.LoginGetEvent += new LoginGetEventHandler(this.Login_Process); // EventHandler 등록
}
private void 로그인ToolStripMenuItem_Click(object sender, EventArgs e)
{
Child.Owner = this;
Child.ShowDialog();
}
private void Login_Process(string id, string password) // Event 발생 시, 처리할 함수 선언
{
// User_Info 객체에 입력 받은 정보 저장
gUser_Info.SetId(id);
gUser_Info.SetPassword(password);
// User_Info 객체에서 값 가져오기
string test_result = string.Empty;
//test_result = String.Format("ID : {0}, PW : {1}", id, password);
test_result = String.Format("ID : {0}, PW : {1}", gUser_Info.GetId(), gUser_Info.GetPassword());
textBox1.Text = test_result; // 자식 Form에서 수신한 값 표시
}
}
}
'C#' 카테고리의 다른 글
| [C#] Collection, Generic Collection, ArrayList (0) | 2020.08.17 |
|---|---|
| [C#] 클래스 배열, 객체 배열, Null Reference Exception (0) | 2020.08.13 |
| [C#] delegate, 폼 간의 DATA 공유 (2) | 2020.06.20 |
| [C#] MAC Address 가져오기 (0) | 2020.06.15 |
| [C#] Class, 클래스, 구조체 (0) | 2020.06.08 |

