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) ]을 선택한다.

 

 

프로젝트 오른쪽 클릭 - [ 추가(D) ] - [ 새 항목(W) ]

 

 

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

 

 

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에서 수신한 값 표시
        }
    }
}

 

이전과 동일하게 비밀번호를 'asdf1234!@#$'로 입력 후 로그인 버튼 클릭

 

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

 

 

자식 Form에서 입력한 값을 부모 Form에서 받아 User_Info 객체에 Set/Get 후 출력 

 

 

사용자 정보의 경우, 프로그램내에서 단 하나만(!) 존재하는 것이기에 위의 예제처럼 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에서 수신한 값 표시
        }
    }
}

 

Posted by [ 브랜든 ]
,