시리즈:쉽게 배우는 프로그래밍 입문/C 샵

문서의 내용이 너무 쉬워서 오늘부터 프로그래밍 할 수 있을 것 같습니다.

이 문서에는 독자적으로 연구한 내용이 들어갑니다. 다른 사람의 의견을 존중하면서 무례하지 않도록 작성해 주시고, 의견 충돌 시 토론 문서에서 토론해 주세요.
리브레 프로그래밍 시리즈
초급
프로그래밍
중급
프로그래밍
고급
프로그래밍
Python
협업

마이크로소프트에서 JavaC++의 장점을 합쳐서 만든 언어. 퓨전 Java와 문법이 상당히 흡사하다. 단 Java에서 가능 한 것이 C#에선 컴파일 오류 내기도 하고 C#에선 되는 것이 Java에선 다르게 동작하기도 하는 경우도 있다. 그리고 Java와는 달리 포인터도 사용이 가능하다. 단 unsafe 로 선언한 부분에서만 사용이 가능하다.

준비[편집 | 원본 편집]

Visual Studio 커뮤니티

개인 사용자들에게는 무료로 공개되어 있는 버전이다. 참고로 이거 하나면 C# 뿐만이 아니라 C++, VB.NET 개발도 가능하다.

Hello, World![편집 | 원본 편집]

이거 안하면 저주받는다 카더라

콘솔 응용 프로그램 프로젝트를 생성하고 main 메소드 내에 다음 내용을 입력하고 실행해보자.

Console.Write("Hello, World!");

자료형[편집 | 원본 편집]

정수를 나타내고 저장하는 데는 byte(System.Byte), short(System.Int16), int(System.Int32), long(System.Int64)등을 쓴다.

그리고 소수를 나타내고 저장하는 데는 float(System.Single), Decimal(System.Decimal)을 쓴다.

당연한 애기지만 소수를 저장하는데 정수형 자료형을 쓰면 소수 아랫부분이 다 짤리니 주의해야 한다.

이외에 참과 거짓을 나타내는 데에는 bool(System.Boolean), 문자를 표현할 때에는 (System.Char)를, 문자열을 표현하는데는 string(System.String)를 쓴다.

C# 데이터 타입
자료형 클래스 크기(byte) 최소 값 최대 값 비고
bool System.Boolean 1 - - false 또는 true
byte System.Byte 1 0 255 정수
short System.Int16 2 -32768 32767 정수
int System.Int32 4 -2147483648 2147483647 정수
long System.Int64 8 -9223372036854775808 9223372036854775807 정수
ushort System.UInt16 2 0 65535 정수
uint System.UInt32 4 0 4294967295 정수
ulong System.UInt64 8 0 18446744073709551615 정수
float System.Single 4 -3.402823E+38 3.402823E+38 단정밀도 부동 소수점
double System.Double 8 -1.79769313486232E+308 1.79769313486232E+308 배정밀도 부동 소수점
decimal System.Decimal 16 -79228162514264337593543950335 79228162514264337593543950335 10진수
char System.Char 2 0 65535 문자(UTF-16)
string System.String - - - 문자열
object System.Object - - - 객체. 모든 클래스는 이 클래스를 상속받고 있다.

제어문[편집 | 원본 편집]

제어문은 코드 실행의 흐름을 제어함으로써, 프로그래밍에서 가장 중요하다고 할 수 있다.

조건문[편집 | 원본 편집]

조건문에는 크게 if문과 switch문이 있다.

if[편집 | 원본 편집]

if문은 특정 조건문이 만족되면 그 안의 코드를 실행한다.

// 64Bit라면 콘솔에 64Bit!를 출력한다.
if (Environment.Is64BitOperatingSystem)
{
    Console.WriteLine("64Bit!");
}

if ... else ... 문은 특정 조건문이 만족되면 if와 else 사이의 코드를 실행하고, 아니라면 else 밑의 코드를 실행한다.

if (Environment.Is64BitOperatingSystem)
{
    // 64Bit라면 콘솔에 64Bit!를 출력하고 아니라면 32Bit!를 출력한다.
    Console.WriteLine("64Bit!");
}
else
{
    Console.WriteLine("32Bit!");
}

if ... else if .... else와 같이 사용할 수도 있다. 이건 예제로 보자 (주석도)

string username = Environment.UserName; // Windows 사용자 이름을 가져온다.
if (username == "LibreWiki") // username이 LibreWiki라면
{ 
    Console.WriteLine("what we need is liberty."); // 이런 메세지를 출력
}
else if (username == "Wikipedia") // username이 Wikipedia라면
{
    Console.WriteLine("NPOV is important."); // 이런 메세지를 출력
}
else if (username == "Uncyclopedia") // username이 Uncyclopedia라면
{
    Console.WriteLine("ㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹ!"); // 이런 메세지를 출력
}
else if (username == "RigvedaWiki") // username이 RigvedaWiki라면
{
    Console.WriteLine("Bronze Age"); // 이런 메세지를 출력
}
else // 이도저도 아니라면
{
    Console.WriteLine("I don't know you."); // 이런 메세지를 출력
}

switch[편집 | 원본 편집]

switch 문은 변수의 값을 확인해서 그 값에 맞는 부분의 코드를 실행한다.

switch (foo)
{
    case 0:
        Console.WriteLine("변수 foo의 값은 0");
        break;
    case 1:
        Console.WriteLine("변수 foo의 값은 1");
        break;
    case 2:
        Console.WriteLine("변수 foo의 값은 2");
        break;
    default:
        Console.WriteLine("변수 foo의 값은 0, 1, 2가 아님");
        break;
}

위의 예제는 변수 foo의 값을 확인해서 값이 0일때와 1일때와 2일때 그리고 그 이외의 값일 때 각각 다르게 동작하도록 한 예제이다. 각 case문이 끝나는 부분은 반드시 break나 return[1]를 사용해주어야 한다. 비교할 변수는 int 같은 정수뿐만이 아니라 string이나 enum도 사용이 가능하다. default는 해당 변수의 값이 case 부분에서 해당되는 것이 없을 경우 동작하는 부분으로 생략이 가능하다.

switch (foo)
{
    case 0:
    case 1:
        Console.WriteLine("변수 foo의 값은 0 또는 1");
        break;
    case 2:
        Console.WriteLine("변수 foo의 값은 2");
        break;
    default:
        Console.WriteLine("변수 foo의 값은 0, 1, 2가 아님");
        break;
}

위의 문법은 Java에서는 사용이 가능하지만 C#에서는 컴파일 오류가 발생하게 된다.

switch (foo)
{
    case 0: case 1:
        Console.WriteLine("변수 foo의 값은 0 또는 1");
        break;
    case 2:
        Console.WriteLine("변수 foo의 값은 2");
        break;
    default:
        Console.WriteLine("변수 foo의 값은 0, 1, 2가 아님");
        break;
}

C#에서는 이런 식으로 case와 case를 같은 줄에 사용해주어야만 오류가 발생하지 않는다. 이 예제는 foo의 값이 0일 때와 1일 때 같은 동작을 하도록 한 예제이다.

반복문[편집 | 원본 편집]

반복문을 사용할 때 함께 쓰이는 한정자로 breakcontinue 그리고 return이 있다. 이 한정자들의 특징은 다음과 같다.

  • break: 현재 반복문을 끝내고 빠져나온다.
  • continue: 현재 반복문에서 이번 루프를 끝내고 다음 루프로 넘어간다.
  • return: 현재 메소드를 끝내버려서 반복문도 덤으로 같이 끝난다. 반환값이 있는 메소드 내라면 반환값도 같이 써야한다.

while[편집 | 원본 편집]

while (조건) { 실행내용 } 이와 같은 사용하는 반복문으로 조건을 확인해서 조건이 참이면 그 안의 내용을 실행하고 거짓이면 실행하지 않는다. 조건이 참이라서 그 안의 내용을 실행했을 경우 다 실행하거나 continue 한정자를 만나면 다시 조건을 확인해서 참이면 다시 처음부터 실행하고 거짓이면 실행하지 않는다. 이 과정이 조건이 거짓이 될 때까지 무한히 반복. 무한 루프 만들 때도 이것을 주로 이것을 사용한다. 이때는 while (true) 라고 적어주면 된다. 단 무한 루프용으로 사용시에는 반드시 break나 return을 이용해서 빠져나올 수 있는 구멍을 만들어두자. 아래 예제를 보자.

int foo = 1;

while (foo < 1000)
{
    foo = foo * 2;

    if (foo == 16)
    {
        continue;
    }

    if (foo == 128)
    {
        break;
    }

    Console.WriteLine("foo의 값은 " + foo);
}

위의 예제는 처음에 foo에 1을 넣고 foo의 값이 1000보다 작은 동안 계속 반복하면서 foo의 값을 2배로 늘리고 foo의 값을 출력하는 예제이다. 그래서 최초에는 2, 그 다음 루프에서는 4, 그 다음 루프에서는 8이 출력된다. 하지만 그 다음 루프에선 foo의 값이 16이므로 첫번째 if문에 의해 continue 한정자를 만나게 되고 그 루프는 종료된다. 그리고 foo의 값은 32가 되어 32가 출력된다. 그리고 그 다음 루프에서는 64가 출력된다. 하지만 그 다음 루프에선 foo의 값이 128이 되므로 두번째 if문에 의해 break 한정자를 만나게 되고 반복문 조건에 관계 없이 그 반복문은 종료된다. 즉 위의 예제는 2, 4, 8, 32, 64가 출력되고 종료되게 된다.

do while[편집 | 원본 편집]

do { 실행내용 } while (조건문); 조건문이 false가 될때까지 실행 내용을 반복하여 실행한다. 여기까지만 들으면 "어? while문과 똑같네?"라고 느끼겠지만, 한 가지 다른 점이 있는데 바로 while문은 조건문이 먼저 실행되지만, do while문은 실행 내용을 먼저 실행한다는 점이다.

말로만 들으면 이해가 어려울테니, 예시를 들어보자

코드 (while문 사용) 실행결과
private static int a;
private static bool condition(){
	Console.WriteLine("조건식 계산됨 ("+a+")");
	return a++<10;
}

public static void Main()
{
	a = 0;
	while(condition()){
		Console.WriteLine("실행 내용 실행됨 ("+a+++")");
	}
}
조건식 계산됨 (0)

실행 내용 실행됨 (1)
조건식 계산됨 (2)
실행 내용 실행됨 (3)
조건식 계산됨 (4)
실행 내용 실행됨 (5)
조건식 계산됨 (6)
실행 내용 실행됨 (7)
조건식 계산됨 (8)
실행 내용 실행됨 (9)
조건식 계산됨 (10)

코드 (do while문 사용) 실행결과
private static int a;
private static bool condition(){
	Console.WriteLine("조건식 계산됨 ("+a+")");
	return a++<10;
}

public static void Main()
{
	a = 0;
	do{
		Console.WriteLine("실행 내용 실행됨 ("+a+++")");
	} while(condition());
}
실행 내용 실행됨 (0)

조건식 계산됨 (1)
실행 내용 실행됨 (2)
조건식 계산됨 (3)
실행 내용 실행됨 (4)
조건식 계산됨 (5)
실행 내용 실행됨 (6)
조건식 계산됨 (7)
실행 내용 실행됨 (8)
조건식 계산됨 (9)
실행 내용 실행됨 (10)
조건식 계산됨 (11)

실행 결과를 보자, while문은 처음에 조건식이 먼저 확인되었으나,do while문은 처음에 조건식이 확인되지 않고 실행내용이 먼저 실행되었다. 이러한 점을 보아 do while문은 조건과는 상관없이 무조건 한번 이상 실행되야 하는 경우에 사용하면 유용하다.

for[편집 | 원본 편집]

for(초기식; 조건식; 증감식) { 실행 내용 } 우리가 흔히 C언어나 C++에서 본 그 for문 맞다. 다음과 같이 동작한다. For문 순서도.PNG

예시 코드[편집 | 원본 편집]
코드 실행결과
for(int i=0;i<5;i++){
	Console.WriteLine(i);
}
0
1
2
3
4

foreach[편집 | 원본 편집]

goto[편집 | 원본 편집]

    if (qux == "foo")
    {
        goto Foo;
    }
    else
    {
        goto Bar;
    }

Foo:
    Console.WriteLine("Foo");
    goto Baz;

Bar:
    Console.WriteLine("Bar");
    goto Baz;

Baz:
    Console.WriteLine("Baz");

위는 변수 qux의 값이 foo 이면 goto문으로 Foo로 이동하여 Foo를 출력하고 Baz로 이동하여 Baz를 출력하며 qux의 값이 foo가 아니면 Bar로 이동하여 Bar를 출력하고 Baz로 이동하여 Baz를 출력하는 예제다. 그냥 이런 것이 있다는 것만 알고 넘어가자. goto문은 사용이 권장되지 않는다. 하지만 Visual Studio 도전과제를 딸려면 goto문을 써야한다.

단, 사용해도 전혀 상관없다는 사람도 있다. 이 문법을 즐겨 쓰는 사람도 있다.

클래스[편집 | 원본 편집]

주석[편집 | 원본 편집]

/*
작성자: 지나가던 위키니트
작성일: 2015-05-13
*/

/// <summary>
/// 클래스 Foo
/// </summary>
public class Foo
{
    /// <summary>
    /// 프로퍼티 Bar
    /// </summary>
    public string Bar { get; set; }

    public Foo()
    {
        // 여기가 생성자
         this.Bar = string.Empty; // Bar에 빈 값을 넣는다.
    }
}

//는 //부터 그 뒤의 내용 한줄만 주석이 된다. /* */는 /*가 시작하는 부분부터 */가 나오는 곳까지 모두 주석이 된다. 클래스나 변수 위에 있는 /// 같은 곳에 입력한 주석은 비주얼 스튜디오 내에서 해당 변수에 마우스를 올리면 저 주석 내용이 표시되게 된다. 클래스나 메소드 같은 곳 위에 /// 를 입력하면 비주얼 스튜디오가 알아서 해당 주석 템플릿을 만들어주니 주석 내용만 입력만 해주면 된다.

예외처리[편집 | 원본 편집]

try
{
    // 실행될 내용
}
catch (Exception ex)
{
    // try 문에서 오류 발생 시 실행될 내용
}
finally
{
    // try 문이 끝나거나 catch 문이 끝나면 실행될 내용
}

위와 같이 예외처리할 부분은 try catch 문으로 묶어준다. finally는 생략 가능. catch 문에 있는 ex 파라메타는 오류 발생 시 그 오류 정보를 담고 있는 변수로 Message 프로퍼티에 오류 내용이 텍스트로 적혀 있다.

람다[편집 | 원본 편집]

var func=delegate(string x){Console.WriteLine(x);}
func("Hello, World!");

위과 같이 무명 메소드를 사용할 수 있다. 이 무명 메소드는 대리자가 필요하긴 한데 메소드 하나 더 만들기 아까울때 사용하면 좋다.

또한 위와 같이 말고 아래의 같이 람다 식을 사용할 수 있다. 람다식은 한줄짜리를 쓸때 유용하다.

var func=x => x*x;
Console.Write(func(5));

LINQ[편집 | 원본 편집]

각주

  1. 메소드 내에서 그 메소드를 끝낼 때 사용