C# - C# 학습 정리 + Windows Form (1)

업데이트:

C# 프로그래밍

개요

객체지향 프로그래밍 언어로 자바를 주로 사용해왔기 때문에 C#만의 특징을 지니는 문법위주로 포스팅하겠습니다.

C#은 다양한 목적의 프로그램을 만들 수 있는 환경을 제공하는 형식 안정적인 객체 지향 언어입니다.
기존의 프로그래밍 언어의 생산성을 개선하여 성능이 굉장히 높습니다. 초기에는 윈도우에서만 동작했지만, 현재는 윈도우, 맥, 리눅스, 안드로이드, 아이폰 등의 다양한 운영체제나 플랫폼에서 동작하여 널리 활용되고 있습니다.


닷넷 프레임워크

닷넷 프레임워크는 닷넷 플랫폼과 여러가지 클래스 라이브러리를 제공합니다.
닷넷 플랫폼이라는 중간 블럭을 통해서 서로 다른 OS에서 동작하는 프로그램들도 닷넷 플랫폼 위에서 동작할 수 있도록 합니다.
또한 닷넷 플랫폼은 모노 플랫폼으로, 다양한 운영체제에서 동작합니다.

  • 응용 프로그램: 윈도 폼, WPF, 윈도10 유니버셜 응용 프로그램
  • 웹 응용 프로그램: 실버라이트
  • 웹 서버: ASP.NET, ASP.NET MVC
  • 웹 서비스: WCF
  • 게임: 유니티
  • 모바일: Xamarin


문법

using System;

namespace FirstProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World");
        }
    }
}
  • using: c#은 기존의 c/c++ 언어와 달리 컴포넌트 기반 언어라고 할 수 있습니다. 따라서 using 키워드를 사용하면 사용할 컴포넌트를 미리 찹조하여 사용할 수 있습니다.
  • namespace: 네임스페이스는 하나의 컴포넌트를 나타냅니다. 하나의 컴포넌트안에 여러개의 클래스가 존재하게됩니다.


입출력

  • Console.Write(“Hello World”);
  • Console.WriteLine(“Hello World”);
  • Console.Read();
  • Console.ReadLine();
  • Console.ReadKey();

여러 개의 데이터 한번에 출력하기

Int a = 3, b = 15;
String c = abc;

Console.WriteLine({0} {1} {2}, a, b, c); //출력 결과 : 3, 15, abc


정수를 특정 자릿수의 10진수로 출력하기

Int a = 3;
Console.WriteLine({0:D5}, a); //출력 결과 : 00003


정수를 특정 자릿수의 16진수로 출력하기

Int a = 255;
Console.WriteLine({0:X8}, a); //출력 결과 : 000000FF


반복문

for vs while

for문과 while문의 가장 큰 차이점은 외부 요인이 작용하느냐 하지않느냐 입니다.

예를들어서 for문에서는 for문 내에서 리스트의 크기가 감소해도 조건식의 횟수는 초기치만큼 동작하여 변하지 않습니다.
하지만 while문에서는 리스트의 크기가 감소하면 while문의 조건식도 변경되어 실제 동작 횟수가 변하게 됩니다.


foreach

foreach (자료형 변수 in 컬렉션) 
{

}
for (int i=0; i < 컬렉션.length; i++)
{
    자료형 변수 = 컬렉션[i];
}
foreach (var 변수 in 컬렉션) 
{

}


var 키워드

var으로 자료형을 선언하면 동적으로 자료형 선언 가능합니다.


코드 조각

Ctrl + Space를 입력하여 원하는 키워드를 찾아서 입력하고 tab을 두번 누르면 자동으로 샘플 코드 조각이 완성됩니다.


공백 제거, 자르기, 배열 to 문자열

  • Trim()
  • TrimStart()
  • TrimEnd()
  • Split()
  • string.Join()


접근 제한자

  • private
    • 접근 제한자를 입력하지않으면 자동으로 private 설정
    • 외부 클래스에서 접근 불가
    • 캡슐화를 위해 사용
  • public
    • 모든 곳에서 접근가능
  • protected
    • private와 같지만, 상속받은 클래스에서 접근 가능


인스턴스 생성과 동시에 초기화

C#에서는 인스턴스를 생성과 동시에 생성자를 거치지않고 초기화를 할 수 있습니다.

class Product
{
    public string name;
    public int pirce;
}

Product product = new Product()
{
    name = "감자",
    price = 2000
};


생성자

  • private 생성자를 사용하면 인스턴스를 생성할 수 없음. 정적 멤버만 있을경우, 팩토리 패턴을 사용하는 경우 사용
  • static 생성자: 해당 클래스와 관련된 요소가 처음 사용되는 시점에 자동 호출되어 실행


소멸자

~클래스이름()
{

}

주로 해당 객체가 소멸할 때 파일을 저장하고 닫거나 웹 통신을 종료시킬 때 소멸자를 사용합니다.


상수(const)와 readonly

const

값이 절대 변경되지 않음

public const double PI = 3.141592;


readonly

읽기 전용 변수로 생성자 메서드와 변수를 선언하는 시점에만 값을 변경할 수 있습니다.

public readonly int id;


겟터와 세터

겟터와 세터는 객체지향의 캡슐화를 위해 사용합니다. 외부에서 값이 변경되는 것을 막을 수 있습니다.

C#에서는 자바에서와 달리 겟터와 세터를 간편하게 사용할 수 있습니다.

private int width;
public int Width
{
    get { return width; }
    set { width = value}
}

더 간단하게

public int Width{ get; set; }


윈도우 폼

image

  • Program.cs: Main() 메서드가 있는 클래스파일로, Form1을 실행합니다.
  • Form1.cs: 윈도우 폼을 구성하며 사용자의 코드를 작성하는 클래스입니다.
  • Form1.Designer.cs: Form1.cs에서 작성한 코드가 자동으로 반영되어 동작하는 디자이너 클래스입니다


Partial 클래스

클래스의 구성요소를 분할할 수 있습니다.
실제로 Form1.cs에서 사용자가 입력한 코드가 Form1.Designer.cs에 반영되어 각각 Partial 클래스로 분할하여 담당합니다.


요소 추가

  • 보기 - 도구상자 끌어다 배치
  • Form1.cs에 코드 작성
    • 객체를 생성하고 Form을 상속받는 Controls를 통해 화면에 삽입

Controls.Add(객체);


이벤트 연결

정적 연결

이벤트를 등록할 객체를 누르고 원하는 이벤트를 더블클릭하면 해당 객체 이름으로 클릭 메서드가 생깁니다.


동적 연결

button1.Click +=

이 상태에서 tab 두번을 누르면 클릭 메서드를 자동으로 생성해줍니다.


매개변수

이벤트 메서드는 다음과 같이 구성됩니다.

private void button1_Click(object sender, EventArgs e)
{

}
  • sender: 이벤트를 발생시킨 자기자신 즉, 버튼을 의미합니다.
  • e: 이벤트 정보 객체로 이벤트와 관련관 추가 정보를 알려줍니다.


백그라운드 요소 이벤트

눈에 보이지않는 요소들도 이벤트로 연결할 수 있습니다.

도구 상자의 ‘구성 요소’에 있는 요소들은 드래그 해도 화면에 나오지 않습니다. 하지만 별도읙 공간에 들어가게 됩니다. 여기서도 각각의 동작에 따른 이벤트 메서드를 등록하여 사용할 수 있습니다.


  • 참고자료: C# 프로그래밍 - 한빛아카데미

댓글남기기