set, get

 - set, get접근자는 각각 속성을 읽거나, 새 값을 할당할 때 사용됩니다. 정보은닉(information hiding)을 위해 클래스 내부에서만 사용할 수 있도록 private로 접근을 제한해 버립니다.


정보은닉이란

 - 간단히 설명하자면 클래스 내부의 필드나 메소드와 같이 객체가 가지고 있는 것들을 외부에서 접근하지 못하도록 숨기는 것을 말합니다. 우리가 클래스 설계를 할때 private나 public 등과 같은 접근 제한자를 통하여 특정 멤버를 공개할 것인지 공개하지 않을 것인지 지정해 줄 수 있습니다. 

왜 이런 작업을 하는 것일까요?

우리가 클래스 설계를 할때 수십에서 수백개에 달하는 필드(field) 프로퍼티(property)가 존재할 수 있습니다.

그러나 이러한 정보들을 외부로 모두 노출시켜버리면 우리가 설계한 클래스를 사용하는 사람의 입장에서는 상당히 곤록스러울 것입니다. 이럴때는 필요한 정보만을 외부로 노출시킬 필요가 있습니다. 또 다른 이유로는 안정성을 위해서 입니다. 객체 내부에서만 사용되는 필드나 메소드는 외부로 공개하면, 외부에서 이를 수정할 수 있기 때문에 안정성이 깨질 우려가 있기 때문입니다. 


public class Person

{

public String name;

public int age;

 

public Person() 

{

          // ...

      }

    // ...

}


위와 같이 Person이란 클래스가 있다면, 외부에서 name과 age를 수정할 수 있습니다. 

접근 제한자가 public으로 지정되어 있기 때문입니다. 그럼 우리는 name이나 age의 값을 신뢰할 수 있을까요? 

그렇기 때문에 name과 age필드의 접근 범위를 private로 제한해줍니다. 그럼 외부에서 이 속성을 변경할 수 없겠죠? 

그런데 프로그램을 만들다 보면, 내부에 있는 변수를 수정해야 할 상황이 벌어질 수도 있습니다. 

그럴때 쓰이는 것이 set, get 접근자입니다. get접근자만 존재한다면 읽을 수만 있으며, set접근자만 존재하면 쓸 수만 있으며, 

두 접근자가 모두 존재하면 읽을 수도 있고 쓸 수도있게됩니다.


using System;

 

namespace ConsoleApplication14

{

    public class MyClass

    {

        private string name = "John";

 

        public string Name

        {

            get

            {

                return name;

            }

            set

            {

                name = value;

            }

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            MyClass mc = new MyClass();

 

            Console.WriteLine("mc.Name : {0}", mc.Name);

 

            mc.Name = "Bree";

 

            Console.WriteLine("mc.Name : {0}", mc.Name);

        }

    }

}


mc.Name : John

mc.Name : Bree


Name이란 이름으로 get/set 접근자를 통해 name에 접근할 수 있으며, get 영역 내에서는 name의 값을 반환하고, set 영역 내에서는 name 속성에 value값으로 초기화 시킵니다. 여기서 value은 Name으로 넘어온 값이라고 생각하시면 됩니다. mc.Name이 아직까지는 John이었다가, 이름이 Bree로 바뀌고, 바뀐 이름을 출력하게 됩니다.


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

아이디 등록시 특수문자 체크  (0) 2018.09.18
[DevExpress] WinForm WaitIndicator  (0) 2018.09.05
할당문과 변수초기화  (0) 2018.06.29
상수(Constant)  (0) 2018.06.28
개념정리(namespace,class,main,object)  (0) 2018.06.28

할당문보다 변수초기화를 사용하는 편이 더 좋다 라고들 합니다.

그 이유에 대해서 생각해 보겠습니다.


[1번]

int a = 3;


[2번]

int b;

b=3;


1번식은 선언식 변수 초기화이고 2번식은 그냥 선언 후 변수할당문입니다.

여기서 말하는 할당문보다 변수 초기화를 사용하는 편이 더 좋다 라는 말은 2번식보다 1번식이 더 좋다는 뜻입니다.

그렇다고 언제나 1번식이 좋은건 아니므로 좋은 경우와 좋지않은 경우를 살펴보겠습니다. 


좋은경우

 - 클래스의 여러 생성자에서 멤버 변수를 항상 동일하게 초기화 할 경우


// -- case 1 : 여러 생성자에서 동일한 초기화를 하고자 할 경우

// -- 어떤 생성자라 할지라도 _list 는 처음부터 List<int>()를 할당하고 시작합니다.

    

private List<int> _list = new List<int>();

 

    public MyClass1(int a)

    {

        _list.Add(a);

    }

 

    public MyClass1(int a, int b)

    {

        _list.Add(a);

        _list.Add(b);

    }


 - 생성자에 상관없이 멤버변수를 초기화 하고자 할 경우


// -- case 2 : 생성자 유무에 관계 없이 초기화 하고자 할 경우

// -- 생성자가 없다 하더라도, 기본적으로 _list 는 할당 됩니다.


class MyClass2

{           

    private List<int> _list = new List<int>();



선언식 변수 초기화가 안좋은 경우는 언제일까요?

좋지않은 경우

- 멤버 변수가 생성자에 따라 다르게 설정해야 할 경우


// -- Bad Case 1 : 생성자에 따라, 멤버 변수를 다르게 설정해야 될 경우

// -- 예제에서 볼 수 있듯이 재할당 하므로 비효율 적입니다.

class BadCase1

{

    List<int> _list = new List<int>();

 

    BadCase1(int list_size)

    {

        // 재할당 ...

        _list = new List<int>(list_size);

    }

}


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

[DevExpress] WinForm WaitIndicator  (0) 2018.09.05
set, get 접근자  (0) 2018.06.29
상수(Constant)  (0) 2018.06.28
개념정리(namespace,class,main,object)  (0) 2018.06.28
[초보자용]버튼 클릭시 TextEdit, TextBox 내용 지우기  (0) 2018.06.15

상수(Constant)

 - 수천에서 수만줄이 넘어가는 프로그램을 만들게 될 때, 수많은 변수를 선언하여 코드를 작성하게 됩니다.

그러나 이 수많은 변수중 도중에 값이 변경되어도 프로그램엔 영샹을 미치지 않는 것과 도중에 변경되면 심각한 오류를 일으킬 수 있는 것들이 있습니다.

만약 코드를 작성하다가 나도 모르게 값을 변경하지 말아야할 변수를 건드리면 버그가 발생할 수 있습니다. 이때 이 문제를 해결해주는 const라는 키워드를 사용하면 됩니다. const를 사용하게 되면 한번 초기화된 값은 절대 변하지 않습니다. 상수를 정의하는 방법은 변수의 선언방법과 유사합니다.


using System;


namespace ConsoleApplication1

{

class Test

{

static void Main(string[] args)

{

const int a = 50;

a = 60; //오류

Console.WriteLine(a);

}

}

}

상수의 값은 변경이 불가능한 것을 확인할 수 있습니다. 그렇다면 아래와 같이 상수의 선언과 초기화를 분리하면 어떻게 될까요?

const int a;

a = 60; //오류

const의 특징을 정리해보면 선언과 동시에 초기화해야하며 초기화가 된 후에는 값의 변경이 불가능한 것을 알 수 있습니다.







namespace

 - 네임스페이스는 관련된 구조체, 클래스, 델리게이트, 인터페이스 등을 그룹화 한것을 말합니다.


class

 - 클래스는 크게 두가지로 나뉩니다. 필드(field)와 메소드(method)로 나뉘게 되는데 필드는 정적인 상태를, 메소드는 동적인 기능을 표현합니다.

독립적으로 존재할 수 있는 최소 단위, C#프로그램을 구성하는 기본단위이며, 이 하나의 클래스를 가지고도 여러개의 객체(object)를 만들어낼수있습니다.


main

 - static void main는 메소드(method)이며, 메인(main)메소드는 그중에서 가장 중요한 메소드입니다.

프로그램의 최초의 진입점(Entry Point)을 나타냅니다. 모든 프로그램에서 메인메소드는 반드시 존재해야하며, 메인 메소드가 시작되면 프로그램 시작되고

종료되면 프로그램도 같이 종료됩니다. 

static는 한정자로 정적인 메소드를 의미하며, void는 반환 형식으로 반환값이 없음을 의미합니다. 


object

 - 객체자료형(object)은 정수, 실수, 논리, 문자열등 모든 데이터를 담고 처리할 수 있습니다. 처리할 수 있는 이유는 상속관계 때문입니다.

부모에게 유산(데이터, 메소드)을 물려받은 자식은 부모가 가지고 있던 기능을 똑같이 수행할 수 있습니다.

object는 모든 자료형의 최상위 부모클래스, 즉 C#에서 모든 객체들은 object클래스로부터 상속을 받습니다.

한마디로 말하면 모든 자료형의 부모는 object다 라고 말할 수 있습니다.

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

할당문과 변수초기화  (0) 2018.06.29
상수(Constant)  (0) 2018.06.28
[초보자용]버튼 클릭시 TextEdit, TextBox 내용 지우기  (0) 2018.06.15
TextBox Enter Event 다음으로 이동  (0) 2018.06.15
C#이란  (0) 2018.05.28

버튼 클릭시 TextBox나 TextEdit에 있는 내용을 지워보겠습니다



private void simpleButton4_Click(object sender, EventArgs e)
{
        Name.Text = string.Empty;
}

 

(TextBox, TextEdit 이름).Text = string.Empty;





< 결과 >

클리어 버튼 클릭시 (이름)칸 TextEdit이 지워진 것을 볼 수 있습니다.

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

할당문과 변수초기화  (0) 2018.06.29
상수(Constant)  (0) 2018.06.28
개념정리(namespace,class,main,object)  (0) 2018.06.28
TextBox Enter Event 다음으로 이동  (0) 2018.06.15
C#이란  (0) 2018.05.28

텍스트박스에서 엔터키 입력시 다음으로 넘어가는 이벤트입니다.


private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
       //엔터키를 눌렀을 때 다음 텍스트박스로 이동
       if (e.KeyChar == (char)Keys.Enter)
       {
             textBox2.Focus();
       }
 }

         private void textBox2_KeyDown(object sender, KeyEventArgs e)
         {
                 //엔터키를 눌렀을 때  확인버튼으로 이동
                 if (e.KeyCode == Keys.Enter)
                 {
                        button1.Focus();
                 }
          }

Textbox의 이벤트중에 KeyPress나 KeyDown을 사용해서 적용시킵니다.

 

.Focus() 메서드는 지정한 그 객체로 포커스를 이동시켜주는 명령입니다.

 

KeyPress와 KeyDown사용시 이벤트 핸들러 형식이 조금 다르기 때문에

 

if문에서 확인할 때 주의해야합니다 

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

할당문과 변수초기화  (0) 2018.06.29
상수(Constant)  (0) 2018.06.28
개념정리(namespace,class,main,object)  (0) 2018.06.28
[초보자용]버튼 클릭시 TextEdit, TextBox 내용 지우기  (0) 2018.06.15
C#이란  (0) 2018.05.28

C#이란

- 마이크로소프트에서 개발된 객체 지향 프로그래밍 언어로써 Java나 C++와 비슷한 면들을 많이 가지고 있습니다.

C#을 이야기하자면 .NET프레임워크를 함께 이야기해야 할 정도로 C#은 .NET프레임워크를 이용하여 프로그래밍하는 대표적인 

언어입니다. C#은 윈도우 프로그래밍, 웹프로그래밍, 게임, 모바일 프로그래밍등 모든 영역에서 사용되는 범용 프로그래밍 언어입니다.


.NET Framework (닷넷 프레임워크)

마이크로소프트에서 개발한 윈도우 프로그램 개발 및 실행환경입니다. 네트워크작업, 인터페이스등의 많은 작업을 캡슐화하였고, 

공통언어 런타임 CLR(Common Language Runtime)이라는 이름의 가상머신위에서 작동합니다. 

자바의 JVM(Java Virtual Machine)이라고 생각하면 쉽습니다.  

CLRJVM의 차이에 대해 간단히 설명하자면 JVM은 자바만을 지원하는데 비해,

CLR은 공통 언어 중개 CIL(Common Intermediate Language)로 표현될 수 있는 모든 언어를 지원한다는 차이가 있습니다.  

CLRJVM 또 다른 개념적 차이는 자바코드는 JVM이 설치된 여러 플랫폼에서 동작하지만, 

닷넷코드는 CLR이 설치된 윈도우 플랫폼에서만 동작한다는 점입니다.

C#이나 VB컴파일러등이 만들어 낸 실행 파일은 운영체제가 이해할 수 없는 코드로 되어 있기 때문에 바로 실행할 수 없습니다. 

이런 .NET이 제공하는 언어들이 컴파일되면 IL(Intermediate Language)라는 중간 언어로 작성된 파일을 만들어 냅니다. 

그리고 이 어플리케이션이 실행 될 때 CLR이 중간 언어를 읽어들여 JIT(Just In Time) 컴파일하여 네이티브 코드로 만들어 실행합니다. 

왜 처음부터 바로 Native코드를 만들지 않고 CLR을 거쳐 2번의 컴파일을 하는것일까? 

.NET이 여러가지 언어를 지원하는데, 이 언어들이 모두 플랫폼에 최적화된 코드가 되게 하기 위함입니다.

컴파일 비용이 좀 부담스럽긴 하지만, Target 기계에 최적화되어 최고의 성능을 낼 수 있습니다.

(무조건 Native로 변형하면, 컴파일의 부담은 적지만, 모든 기계에서 최적화된 성능을 내지는 못한다.)

CLR은 JVM과 같이 예외처리를 도와주고, 언어간의 상속을 지원하며, COM과의 상호운영성을 지원하고, 가비지컬렉션도 지원합니다. 


+ Recent posts