VB class

VB 2018. 4. 16. 16:52

▨ 클래스 
저는 표준모듈과 클래스모듈과의 차이점은 알고 있지만 어느때 표준과 클래스모듈을 적절히 사용을 해야 하는지에 대해서는 잘 모르겠습니다. 
저는 사용자정의프로시져를 주로 이용을 하고 있거든요. (경력이 짧은 관계로..) 

▨ 클래스의 요소 
- 클래스에서는 외부에 공개를 할꺼냐 ..... Public 
   아니면 공개를 하지 않을꺼냐 ........... Private 
   라는 두가지로 선언을 할 수 있습니다. 

- Public로 선언 
  Public로 선인이 되었다면 외부로부터 변수를 마음껏 사용을 할 수 있습니다. 
  여기서 마음껏이라는 건 접근을 허용할 뿐 아니라 그 값을 변화 시킬 수 있다는 얘기입니다. 
  쉽게 파일의 쓰기와 읽기 권한을 준다고 보시면 됩니다. 

- Private로 선언 
 외부에서는 절대로 접근을 할 수 없으면 클래스(오브젝트)안에서만 사용을 할 수 있습니다. 

▨ 클래스의 Property(속성) 
속성 프로시져에는 Property Get와 Property Let라는 두개의 프로시져가 있습니다 
만약 모두 Public로 선언을 한다면 외부로부터 값을 전달 받고 또 줄 수 있다는 겁니다. 

 - Property Get 
   Property Get는 외부에 자료를 전달 해줄때 사용을 합니다. 
   다른 말로는 클래스에 선언된 변수를 외부에 전달해줍니다. 

   사용방법은 
   Public Property Get MyData() As Integer 

   End Sub 

 - Property Let 
   Property Let는 외부에 자료를 전달 받을 때 사용을 합니다. 

   사용방법은 
   Public Property Let MyData(Value As Integer) 

   End Sub 

만약에 표준모듈을 만들어서 사용 하실 수 있는 분이라면 위의 2개의 선언문에서 보는 봐와 같이 차이점을 알 수 있을 겁니다. 

Get는 외부로부터 값을 전달 해준는 것....Function과 비슷 
Let는 외부로부터 값을 전달 받는 것......Sub나 Function에 인수가 전달 받는 것 

표준모듈로 설명을 하자면 
Function MyData(Value1 as Integer, Value2 as Integer) as Integer 

End Function 

이건 외부에서 특정한 값(Value1, Value2)라는 값을 전달 받아서 특정한 일을 하고 그 결과 값을 Integer형으로 전달해주는 겁니다. 
이걸 클래스에서는 따로 구분을 짓는 거죠. 
전달 받는 것과 (Property Let) 전달 받은 걸 가지고 결과 값을 전달 해주는 것 (Property Get)으로 

※ 참고로 VB.Net에서는 하나의 함수 안에 두개의 속성이 존재합니다. 

▨ 예제 
다음은 간단하게 숫자를 클래스에 전달하고 클래스에서는 전달 받은 값에 100을 더해서 그 결과 값을 다시 돌려주는 예제 입니다. 
 - 먼저 표준EXE에서 폼(Form1)과 클래스모듈(Class1)을 추가를 합니다. 
 - 폼에 Command Button을 하나 추가를 하고 아래와 같이 코드창에 코딩을 하고 
    F8(한단계씩 코드 실행)를 눌러서 한줄씩 실행을 시켜보면 소스에 있는 번호순서대로 실행을

    합니다. 

*** Class1에 *** 
Private MyValue As Integer 
4) Public Property Let MyData(Value As Integer) 
5) MyValue = Value 
6) End Property 

8) Public Property Get MyData() As Integer 
9) MyData = MyValue + 100 
10) End Property 

*** Form1에 *** 
1) Private Sub Command1_Click() 
   Dim Result As Integer 
   Dim C1 As Class1 

2) Set C1 = New Class1 

3) C1.MyData = 100 
7) Result = C1.MyData 

11) MsgBoxt Result 
End Sub 

번호 3번에서 클래스의 Property Let의 프로시져(4번)로 이동을 하는 걸 알 수 있을 겁니다. 
위에서 설명을 했듯 Property Let는 외부로부터 값을 전달 받는 것을 알 수 있을 겁니다. 
반대로 7번에서 클래스의 값을 Result라는 변수에 저장을 할려고 할때는 
클래스의 Property Get(8번)의 프로시져를 실행하는 것을 볼 수 있을 겁니다.

 

*** Class1에 *** 

'클래스에 보면 MyValue라는 변수가 선언이 된 걸 볼 수 있을 겁니다. 
'이 변수는 오로직 클래스에서만 사용을 하며 외부에서는 절대로 사용할 수 없습니다. 
'이유는 저번에 설명을 했듯 변수가 선언이 될때 Private로 선언을 해서 입니다. 
Private MyValue As Integer 

'이 프로시져는 외부에서 값을 전달 받을 때 사용을 합니다. 
'Form1에서 'C1.MyData = 100'라고 100이라는 값을 클래스에 전달을 
'해주는 것입니다. 
Public Property Let MyData(Value As Integer) 

   '외부에서 전달 받은 값(100)을 클래스 안에서만 사용이 가능한 변수(MyValue)에 집어 넣습니다. 
   MyValue = Value 


End Property 

'외부로 값을 전달해주는 프로시져로써 
'클래스 안에서만 사용가능한 MyValue에 100을 더해서 외부로 전달을 해줍니다. 
Public Property Get MyData() As Integer 
   MyData = MyValue + 100 
End Property 

*** Form1에 *** 
Private Sub Command1_Click() 

   Dim Result As Integer 

   '참조변수를 선언을 합니다. 
   Dim C1 As Class1 

   '인스턴스를 생성(New)을 합니다. 
   Set C1 = New Class1 

   '숫자 100을 인스턴스로 생성된 C1의 MyData에 전달을 한다. 
   '이때 클래스의 Property Let MyData를 실행을 해서 
   '클래스에 선언된 MyValue라는 변수에 전달을 한다 
   C1.MyData = 100 

   '클래스의 MyData라는 프로시져를 실행 후 전달 받은 값을 
   'Result라는 변수에 전달을 한다. 
   Result = C1.MyData 

   MsgBoxt Result 

   'Nothing으로 New로 생성된 C1을 메모리에 소멸시킴 
   'Nothing을 하지않으면 메모리등의 자원을 그대로 잠식하기 때문에 
   'New가 있으면 Nothing이 꼭 있어 합니다. 
   Set C1 = Nothing 

End Sub

 

오늘은 클래스의 메서드에 대해서 진행을 하겠습니다. 
메서드는 일종의 프로시져(Sub, Function)이며 글래스 모듈에서 작성이되면 일반적으로 메tj드라고 부립니다. 
클래스에서의 메소드란 표준모듈의 사용자 정의 프로시져와 같습니다. 

메tj드도 Public과 Private로 선언을 해서 사용을 하며 어느것으로 선언을 했는지에 따라서 외부로부터 호출을 할 수 있는지 없는지 
결정을 할 수 있습니다. 

저번 강좌에서 했던 1부터 100까지 구하는 예제는 메소드를 이용하지 않고 사용을 했는데 좋은 방법은 아님니다. 
Property Get 프로시져는 오로직 외부로부터 값을 전달만 해주는 기능으로만 이용을 하는 것이 바람직합니다. 

다음 예제는 1부터 100까지 구하는 메소드입니다. 
Public Sub Compute() 
   Dim i% 
   Dim Tot% 
   Tot = 0 
   For i = 1 To MyValue 
       Tot = Tot + i 
   Next 
   MyValue = Tot 
End Sub 

기존에 표준모듈에서 사용을 하던 사용자 정의프로시져와 비슷하다는 걸 알 수 있을 겁니다. 
단지 틀린 점은 100까지 구한 결과를 MyValue라는 클래스에서 선언된 변수에 넣는다는 점입니다. 


▨ 클래스 메소드 예제 

이번 예제는 1부터 100까지 합을 구하는 방법을 클래스의 메서드와 표준모듈의 사용자정의프로시져를 이용해서 그 결과값을 구하는 예제 입니다. 

소스에 각 Command Button의 Click이벤트를 보면 클래스의 메소드보다 사용자정의 프로시져를 이용하는 것이 훨씬 소스의 간결함을 볼 수 있을 겁니다. 
하지만 표준모듈에서는 이벤트를 만들 수 없다는 단점이 있습니다. 
이 클래스이벤트는 나중에 설명을 하지요. 

폼에 Command Button을 2개 추가를 하고 표준모듈과 클래스모듈을 각각 하나씩 추가를 합니다. 

*** Form1 *** 
Private Sub Command1_Click() 

   Dim Result As Integer 
   Dim C1 As Class1 

   Set C1 = New Class1 

   C1.MyData = 100 
   C1.Compute '클래스의 메서드를 호출합니다. 

   Result = C1.MyData 

   MsgBox "클래스에서 구한 결과 값 " & Result 

   Set C1 = Nothing 

End Sub 

Private Sub Command2_Click() 

   Dim Result As Integer 

   Result = Compute(100) 

   MsgBox "사용자 정의 프로시져에서 구한 결과 값 " & Result 

End Sub 


*** Class1 *** 
Private MyValue As Integer 

Public Property Let MyData(Value As Integer) 
   MyValue = Value '외부에서 값을 전달 받는다 
End Property 

Public Property Get MyData() As Integer 
   MyData = MyValue '내부에서 사용한 변수의 값을 외부로 전달한다 
End Property 

Public Sub Compute() 
   Dim i As Integer 
   Dim Tot As Integer 
   Tot = 0 
   For i = 1 To MyValue 'Property Let로 전달 받은 값으로 반복문을 실행 
       Tot = Tot + i 
   Next 
   MyValue = Tot '반복된 결과값을 내부에서 사용하는 변수에 저장 
End Sub 


*** Module1 *** 
Public Function Compute(Value As Integer) As Integer 
   Dim i As Integer 
   Dim Tot  As Integer 
   Tot = 0 
   For i = 1 To Value 
       Tot = Tot + i 
   Next 
   Compute = Tot 
End Function 

항상 행복하십시오. 
그럼...꾸벅

 

원문 : 데브피아(http://www.devpia.com/devpia)


'VB' 카테고리의 다른 글

VB6 Unload / Hide / Show(modal / modeless) 폼 명령어  (0) 2018.04.30
파일처리 명령어!  (0) 2018.04.23
UBound / LBound  (0) 2018.04.20
Windows 10 (Win 8.1) 에서 Visual Basic 6(VB6) 설치 방법  (0) 2018.04.18
VB6 단축키 정리  (0) 2018.04.17
블로그 이미지

벵거빠돌이

,
public partial class BitTest : Form
{
        const char STX = (char)0x02;
        const char ETX = (char)0x03; //End Text [응답용Asc]
        const char EOT = (char)0x04; //End of Text[요구용 Asc]
        const char ENQ = (char)0x05; //Enquire[프레임시작코드]
        const char ACK = (char)0x06; //Acknowledge[응답 시작]
        const char NAK = (char)0x15; //Not Acknoledge[에러응답시작]
        private SerialPort m_serialPort;
    
        public BitTest()
        {
            InitializeComponent();
        }
 
        private void WordReadTest_Load(object sender, EventArgs e)
        {
            SerialPortOpen();
        }
 
        private void WordReadTest_FormClosing(object sender, FormClosingEventArgs e)
        {
            SerialPortClose();
        }
        private void btnOpen_Click(object sender, EventArgs e)
        {
            SerialPortOpen();
        }
 
        private void btnClose_Click(object sender, EventArgs e)
        {
            SerialPortClose();
        }
 
        /// 
        /// 포트오픈
        /// 
        private void SerialPortOpen()
        {
            m_serialPort = new SerialPort();
            m_serialPort.PortName = "Com7";
            m_serialPort.BaudRate = 19200;
            m_serialPort.Parity = Parity.None;
            m_serialPort.DataBits = 8;
            m_serialPort.StopBits = StopBits.One;
            m_serialPort.Handshake = Handshake.None;
            m_serialPort.ReadTimeout = 500;
            m_serialPort.WriteTimeout = 500;
            m_serialPort.Open();
 
            btnOpen.Enabled = false;
            btnClose.Enabled = true;
            btnExecute.Enabled = true;
        }
        /// 
        /// 포트 종료
        /// 
        private void SerialPortClose()
        {
            m_serialPort.Close();
            btnOpen.Enabled = true;
            btnClose.Enabled = false;
            btnExecute.Enabled = false;
        }
 
        //실행
        private void btnExecute_Click(object sender, EventArgs e)
        {
            DateTime t1 = DateTime.Now;
            string strOutputData = ENQ + "00RSS01" + "07%MX0000" + EOT;
            m_serialPort.Write(strOutputData);
            lblOutputData.Text = strOutputData;
            do
            {
                //데이타를 전부 PLC로 전송 하기 위함..
            } while (m_serialPort.WriteBufferSize == 0);
            string indata= DataRead();
            TimeSpan span = DateTime.Now.Subtract(t1);
            lblMillisecond.Text = span.Milliseconds.ToString();
        }
 
        /// 
        /// PLC로 부터 수신된 데이타를 가지고 온다
        /// 
        /// 
        private string DataRead()
        {
            bool m_Next = false;
            string strInData = string.Empty;
            string strRetValue= string.Empty;
        
            DateTime start = DateTime.Now;
            do
            {
                string msg = m_serialPort.ReadExisting();
                strInData += msg;
                //TODO : 데이타에 종료문자가 있으면...
                if (msg.IndexOf(ETX) > 0)
                {
                    //TODO 데이타 처음에 정상 응답이 있으면
                    if (strInData[0] == ACK)
                    {
                        //TODO 들어오는 데이타를 분석..[ETX(1)+국번(2)+비트읽기(3)+블륵수(2)]
                        lblInputData.Text = strInData;//Test용
                        strRetValue = strInData.Substring(8, strInData.Length - 9); //실제Data
                        m_Next = true;
                    }
                    //TODO: 데이타에 비정상 응답이 들어오면..
                    else if (strInData[0] == NAK)
                    {
                        lblInputData.Text = "NAK";
                        strRetValue = "-1";
                        m_Next = true;
                    }
                }
                //DOTO : 응답이 없으면 0.5초간은 로프를둘면서 기다란다.
                TimeSpan ts = DateTime.Now.Subtract(start);
                if (ts.Milliseconds > 500)
                {
                    lblInputData.Text = "TimeOut";
                    strRetValue = "-3";
                    m_Next = true;
                }
            } while (!m_Next);
            return strRetValue;
        }
    }
}

블로그 이미지

벵거빠돌이

,
첫번째 방법 1. 부모창에서 자식창을 선언.
private void button3_Click(object sender, EventArgs e)
{
     Form2 chfm = new Form2();
     chfm.ShowDialog(this);
}
2. 자식창에서 부모값으로 넘김
private void button1_Click(object sender, EventArgs e)
{
    ((Form1)(this.Owner)).temp = textBox1.Text;
}
두번째 방법. 1. 자식창에서 부모와 같은 클래스로 선언한다.
public Form2()
{
    InitializeComponent();
}
public Form1 fm;
2. 부모창에서 자식창을 선언할 때 자식클래스에 선언한 부모와 같은 클래스형에 참조시킨다.
private void button3_Click(object sender, EventArgs e)
{
    Form2 chfm = new Form2();
    chfm.fm = this;
    chfm.ShowDialog();
}
3. 자식창에서 다음과 같이 제어한다.
private void button1_Click(object sender, EventArgs e)
{
    fm.temp = textBox1.Text;
}

'C#' 카테고리의 다른 글

c#에서 비관리코드를 호출하는 방법  (0) 2018.10.24
[MFC] LPSTR,LPCSTR,LPCTSTR .. 과연 무엇인가?  (0) 2018.10.23
opos visual studio 적용....  (0) 2018.10.15
C#으로 LS PLC와 RS232C 통신하기  (0) 2018.04.05
DataGridView 셀접근  (0) 2018.03.27
블로그 이미지

벵거빠돌이

,