C언어만 사용하던 나는 솔직히 OOP 개념이 익숙하거나 크게 와 닿지 않는다.
중복된 기능의 함수나 DB Handler, Logger 등의 기능 단위를 구분할 수 있는 것들을 모듈화하여
Library 형태로 만들어 컴파일 할 때 추가하여 사용하곤 했다.
C#에서는 하나의 프로젝트 안에 여러 클래스를 생성하여 사용하는 것 같으니 방법을 정리해 보자.
delegate 테스트했던 프로젝트에 추가해서 진행하면 좋을것 같다.
2020/06/20 - [C#] - [C#] delegate, 폼 간의 DATA 공유
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 |