728x90
C# 기본 이해를 위해 기초를 파악하는 중이다. C# 문법지식은 필요한 것만 기록해두려고 한다.

문법지식은 개발 언어가 다르다고 해서 별반 차이가 없고, 약간씩 표현하는 형식만 조금 다를 뿐이다.


비주얼 스튜디오에서 새 프로젝트를 생성하면 IDE 에서는 아래 파일을 생성한다.

Form1.cs  : 폼의 행동을 정의해주는 C# 코드가 들어간다

Form1.Designer.cs : 폼과 그 객체를 정의하는 코드가 들어간다.

Program.cs : 프로그램을 시작하고 폼을 표시하는 코드가 들어간다.


솔루션 탐색기에서는 프로젝트에 있는 모든 것을 보여준다.

Form1.cs 위에서 마우스 우클릭하고 코드보기(F7)을 누르면 코드들이 보인다.

솔루션 탐색기에서 파일명을 수정할 수 있다. 속성창에 .(Name) 이라고 적힌 부분을 수정하면 폼 이름이 바뀐다. 속성창이 화면에 보이지 않으면 F4 단축키를 사용하면 된다.


Form1.cs [디자인] 화면에서 UI 구성을 하고 소스보기를 하려면 F7 키를 누르면 소스보기 상태로 변경된다.

namespace 에는 프로젝트명이 기록된다.


모양을 가진 클래스 파일(Form, 사용자정의컨트롤)은 *.cs와 *.designer.cs 로 구성된다
Form1.cs, Form1.Designer.cs 로 이루어 진다.
Form1.designer.cs는 Visual Studio가 자동으로 코드를 구성해준다.


Form 디자인에서 이벤트를 선택하여 더블클릭하면, Form1.cs 파일에
private void button1_Click(object sender, EventArgs e)
{
   코딩하는 영역
}
가 생성됨과 동시에
Form1.desinger.cs 파일에
 this.button1.Click += new System.EventHandler(this.button1_Click);
가 자동으로 추가된다.
만약 Form1.cs 파일에서 직접 코드만 추가하면 Form1.desinger.cs 파일에는 자동으로 이 코드가 추가되지 않아 이벤트가 동작하지 않는다. (이벤트 동작 관련 처리 방법 http://link2me.tistory.com/783 참조 -- 중요)



InitializeComponent 메서드는 Form1.designer.cs 에 정의되어 있으며, 우리가 디자인한 화면을 표시할 수 있도록 관련 코드를 Visual studio가 자동으로 작성한다.


클래스(class)

Form1도 클래스의 일종이다
클래스는 생성자, 필드, 속성(프로퍼티), 메서드, 이벤트, 소멸자로 구성된다
생성자란 클래스안에 구성된 메서드의 특수한 형태이다.
Form() 생성자는 메서드 형태를 띠고 있으면서 public 접근 권한을 가지며, 반환형 자체가 없다
처음 메모리에 만들어질 때 딱 한 번만 실행된다
Form_Load()는 폼이 가지고 있는 여러개의 이벤트 중에 Load시에 발생하는 이벤트다.


클래스(class)는 새로운 데이터 타입을 만드는 데이터 타입 생성기이다.

구조체는 값 타입이고 클래스는 참조(Reference) 타입이다.

구조체는 타입이 다른 변수들의 집합이다.

배열은 동일한 타입의 변수들을 하나의 이름으로 묶어놓은 것이다.

Struct 구조체이름 {

   멤버 이름

}


class Person {   // Person : 클래스로 만들어진 새로운 데이터 타입
    public int age;  // Person 클래스 내부의 멤버 필드
    public long height;
    public float weight;
} //class



참조(Reference) 타입으로 변수를 선언하면 참조변수에 해당하는 메모리만 생성된다.

Person sister;  // 참조 변수의 선언(참조변수에 해당하는 메모리만 생성)

실제 메모리는 new 연산자를 이용해서 생성해주어야 한다.

sister = new Person();  // 실제 메모리 생성


Person sister = new Person(); // 동시에 객체 변수선언 및 메모리 생성


private을 사용하는 이유 : 클래스 내부에서만 사용하기 위해서다.

즉, 멤버들에 대한 접근을 해당 클래스 내에서만 가능하도록 할 때 사용하는 접근자이다.

string name;  // 앞에 아무것도 붙이지 않는 것은 private 로 선언되었음을 의미


public 은 어느 클래스, 객체에서건 접근이 가능하도록 할 때 사용하는 접근 변경자이다.

protected 된 클래스 멤버는 정의된 클래스 내에서와 파생클래스 인스턴스에서 접근이 가능하다.

protected int age = 20;  // 파생 클래스에서 접근 가능한 멤버

  * 파생클래스 : 정의된 클래스로부터 상속받은 클래스

     상위 클래스를 기본 클래스(Base Class) 라고 하며,

     하위 클래스(Sub Class)를 파생 클래스(Derived Class)라고 한다.

     상속(Inheritance)를 하면 상위 클래스의 능력을 하위 클래스에서 모두 이용할 수 있다.

     class Person : Form  // Form 클래스로부터 상속( : ) 받았음을 의미


기본 클래스 멤버 숨기기

파생 클래스는 기본적으로 상속받은 멤버들을 삭제할 수 없다. 숨기기는 가능하다.

동일한 입력 파라미터를 가지고 앞에 new 키워드를 붙여주면 된다.

new public string name = "학생";


public sealed class Parent   // sealed 는 상속 금지 키워드

{

}


C# 에서는 new 를 사용해서 메모리를 생성했지만 별도로 메모리를 제거 하지 않아도 된다.

이유는 가비지 콜렉터(Garbage Collector)가 있어 알아서 메모리를 제거 해준다.

닷넷 라이브러리에 가비지 컬렉터(쓰레기 수집기)가 주기적으로 힙을 검사하여 더이상 참조되지 않는 메모리들을  자동으로 해제한다.

C++ 에서는 메모리를 생성했으면 반드시 사용자가 직접 delete를 사용해서 메모리를 제거해주어야 한다.


using System;

namespace Data {  // 특정 구간의 이름을 Data 로 하겠다
    public class HelloWorld

    {
        public static void Main()    // 실행 프로그램은 하나의 Main()을 포함해야 한다

        {

             Console.WriteLine("Hello World!");
        } // main
    } // class
}


어떤 class 가 public 으로 선언되어 있으면 그 프로그램에 있는 어떤 class 에서든 그 메소드에 접근할 수 있다.

Main은 객체가 생성되기 전에 호출되어야 하므로 반드시 static 이어야 하며 외부에서 호출되므로 public 액세스 지정을 가져야 한다.

C#에서는 Main 함수가 class에 소속되는 멤버이기 때문에 여러개의 class가 각각의 메인을 갖는 것은 가능하지만 2개 이상이면 진입점이 어디인지를 명시해줘야 한다. 진입점을 명시해주지 않으면 에러가 난다. 따라서 가급적이면 Main 은 하나만 사용하는 것이 좋다.


하나의 파일에 하나 또는 둘 이상의 클래스를 생성하는 것은 가능하지만,
반대로 하나의 클래스를 여러 개의 파일에 나누어 생성하는 것은 가능할까? 결론은 가능하다.

한 class 를 여러 파일에 나눠서 선언할 때는 반드시 partial 키워드를 사용해야 한다.
partial class란 동일한 클래스를 여러 파일에 분리하여 개발가능하도록 구현된 기술이다
partial class는 CLR 수준이 아닌 C# Compiler 수준에서 처리되므로 많은 partial class를 만들어도 실제 컴파일시에 하나의 클래스로 수집하여 인식하므로 단일 코드로 취합한다.


파일명은 _ABC.cs, _ABC.Movie.cs, _ABC.Image.cs, _ABC.Voice.cs 처럼 다르게 정하면 되지만

namespace, class명을 동일하게 맞춰줘야 하고 클래스 부분 앞에 partial 이라고 붙여줘야 한다


namespace Data
{
    public partial class _ABC
    {
        //내용
    }
}

// _ABC 클래스의 일부
public partial class _ABC : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.Button1.Click += delegate
        {
            Response.Write("Button1_Click1");
        };
    }
}

// _ABC 클래스의 일부
public partial class _ABC
{
    protected void Button2_Click(object sender, EventArgs e)
    {
        Response.Write("Button2_Click2");
    }
}


.NET Framework 은 무수하게 많은 클래스들을 가지고 있는데, 예를 들면 .NET 4.0은 약 11,000개의 클래스를 가지고 있다. 이렇게 많은 클래스들을 충돌없이 보다 편리하게 관리/사용하기 위해 .NET에서 네임스페이스를 사용한다.

.NET 라이브러리를 제대로 활용하기 위해서는 네임스페이스와  using 문에 대해 우선적으로 이해해야 한다.



C#에서도 이러한 개념을 적용하여Class 들이 Namespace 안에서 정의된다.

CLR 은 메모리, 자원관리, Thread 와 같은 핵심서비스들을 구현하려는 프로그램에 제공한다.

MS가 기본 제공하는 일종의 함수들을 불러서 편하게 사용하면 복잡한 부분에 대한 코드를 고민하면서 코딩을 안해도 되므로 구현하고자 하는 핵심사항만 구현하면 되므로 훨씬 빠르게 코딩이 가능하다.


보기 - 개체브라우저 선택하고 System.IO 네임스페이스에 정의되어 있는걸 확인할 수 있다.


//첫번째 방식 static void Main(string[] args) {     System.Console.WriteLine(); } //두번째 방식, using 선언문은 C#한테 어떤 닷넷 프레임워크를 사용할지 알려주는 역할을 한다. using System; //System 네임스페이스 지정 static void Main(string[] args) {     Console.WriteLine(); }


// using 다음에 참조할 네임스페이스명을 적으면 컴파일러가 using 선언된 네임스페이스를 항상 참조한다.

// using 은 대문자로 쓰면 안된다. using 선언문은 C#한테 어떤 프레임워크를 사용할지 알려주는 역할을 한다.

// using 선언은 꼭 필요한 것들만 선언하는 것이 좋다.

using System; // System 네임스페이스 안에 정의된 클래스들을 사용할 것이므로 준비하라는 지시사항

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windwos.Forms;


MessageBox 는 System.Windows.Forms 라는 이름공간(namespace)에 속한 클래스다.


Console.WriteLine("당신의 이름은 : {0}, 나이는 {1}  입니다", 홍길동, 30);

// {0} 은 치환 표시자 : 홍길동을 전달받아 문자열 출력시 출력

// {1} 은 30을 전달받아 문자열 출력시 출력

// 치환표시자는 0 부터 시작해서 1씩 증가



C#의 조건문/반복문(if, for, while)의 조건식은 반드시 논리형(bool)이어야 한다.

while 문은 조건식에 의해서만 반복 수행이 결정된다.

for 문은 초기화, 조건식, Step 3가지로 나뉘어진다.

- 정해진 횟수만큼 반복적으로 수행할 때 for문을 사용한다.

- 한계나 범위가 주어져 있을 때는 for문을 사용한다.

- 특정 조건에만 반복 수행할 때에는 while 문을 사용한다.



foreach 문

foreach 문은 배열(Array)이나 컬렉션(Collection) 내에 존재하는 각 요소들에 대해 접근할 수 있게 해주는 제어문으로 비주얼베이직에서 가져온 문법이다

foreach 문을 사용한 배열의 특징
- 메모리에 저장된 순서대로 요소 값을 읽어낸다.
- 반복변수는 오직 읽기전용으로 사용


논리연산자는 불필요한 조건을 점검하지 않는 Short Circuit 기능을 제공한다.

if (a && b) 조건문에서 a 가 거짓이면 b는 검사하지 않는다.

if ( a || b) 조건문에서 a 가 참이면 b는 검사하지 않는다.



배열

타입[] 변수명;  // 배열 요소를 저장하기 위한 메모리까지 할당하는 것은 아니다.

배열은 참조형(reference type) 이므로 변수 자체가 실제 데이터를 저장하지 않는다.

배열을 포함한 모든 참조형은 new 연산자로 실제 메모리를 할당 받아야 한다.

배열은 할당만 할 뿐 일부러 해제할 필요는 없다.


string[] strMemberArray = smember.split('/')

// 데이터타입[] 변수이름

foreach (string smember in strMemberArray)

{

}

// 엑셀 VBA 에서 Split 함수는 Split(C,"/") 이런식인데 C#에서는 C.split('/') 로 표현하는게 조금 다름

C#에서 기본적으로 제공하는 Split 함수는 문장을 구분자로 둘 수가 없다.

따라서 문장을 smember.Replace("aaa","/"); 와 같이 특정 문자열로 대체한 뒤에 split 함수를 사용하면 된다.


DataGridView 의 속성 정보는 https://msdn.microsoft.com/ko-kr/library/3dyct1w0.aspx 를 참조하면 된다.

DataGridView 컨트롤에서는 데이터를 표 형식으로 표시하고 편집할 수 있다.


코드창에서 알고 싶은 내용에 대해 F1키를 누르거나 MSDN을 별도로 띄워 목차, 색인 등을 활용하면 궁금한 내용뿐만 아니라 주변지식이나 참고사항, 예제까지도 볼 수 있다.


밖으로 데이터를 내보내기할 때에는 함수의 Return 을 통해서 외부로 값을 복사한다.


List 객체를 생성할 때는 반드시 유형(int, string, bool 등)을 지정해 줘야 한다.

List <T> name = new List <T>();


블로그 이미지

Link2Me

,