= #!wiki
= \cat StudyMaterial
=
= 참여자: HuidaeCho
=
= =! C# 기본문법
=
= TOC
=
= = 메서드의 정의
=
= 메서드는 다음과 같은 형태로 정의한다. C#에서는 여러개의 명령을 하나로 묶을 때 {와 }를 사용하며 하나의 명령 뒤에는 반드시 ;을 붙여야 한다. } 뒤에는 ;를 붙이지 않는다.
= ---
= 메서드속성 리턴할자료형 메서드이름(매개변수리스트){
= 메서드가할일
=
= return 메서드의최종결과;
= }
= ---
= - 메서드속성: ""(((public|private)? (static)?))?""
= - 리턴할자료형: 메서드가 최종결과로 리턴하는 자료의 타입을 써준다.
= - 메서드이름: 메서드의 이름. 파스칼케이싱법을 따라 이름을 지어준다.
= - 매개변수리스트: ""(매개변수타입 매개변수명(, 매개변수타입 매개변수명)*)?""
= - 메서드가할일: ""(C# 명령;)*""
= - 메서드의최종결과: ""(|리턴할값)"" 리턴할자료형이 ""void""일 경우 아무것도 입력하지 않는다.
= -
=
= 다음은 a부터 b까지 더한 값을 돌려주는 메서드의 예이다.
= --bcode--
= int Sum(int a, int b){
= int sum = 0;
=
= for(int i = a; i <= b; i++)
= sum += i;
=
= return sum;
= }
= --ecode--
=
= 실제로 위의 코드를 실행해 보자. 다음의 소스를 입력해서 컴파일 후 실행하면 55가 출력된다.
= --bcode--
= using System;
=
= class TestSum{
= public static void Main(){
= Console.WriteLine(Sum(1, 10));
= }
=
= static int Sum(int a, int b){
= int sum = 0;
=
= for(int i = a; i <= b; i++)
= sum += i;
=
= return sum;
= }
= }
= --ecode--
=
= = 연산자
=
= - 2항 기본산술 연산자: ""+ - * /"". 예) ""a+b""
= - 2항 나머지 연산자: ""%"". 예) ""a%b"", a, b가 정수일 경우 ""a==a/b*b+a%b""
= - 1항 증감 연산자: ""++ --"". 연산자가 변수명 앞에 오면 변수의 값을 평가하기 전에 증감이 이루어지고 뒤에 오면 평가한 후에 증감이 이루어진다. 예) ""a=++b""는 ""a=b+1; b=b+1""과 ""a=b++""는 "a=b; b=b+1""과 같은 효과가 있다.
= - 2항 논리 연산자: ""&& ||"". 각각 Short-Circuit AND, OR라고도 불리며 식의 참, 거짓을 판단할 수 있는 시점까지만 왼쪽에서 오른쪽으로 각 항들을 평가한다. 예를 들어 a와 b가 모두 0인 상태에서 ""++a || ++b""는 ""++a""의 값이 1이 되어 ""++b""의 값과는 무관하게 참이 되므로 ""++b""는 실행되지 않는다. 그 결과 a는 1이 되지만 b는 0 그대로이다.
= - 1항 논리 연산자: ""!"". 논리의 값을 뒤집는다.
= - 2항 비트 연산자: ""& | ^"". 정수형 변수를 2진수로 취급하며 비트단위로 각각 AND, OR, XOR 연산을 행한다. 연산의 결과는 다음과 같이 정의되며 좌우항을 바꿔도 결과에는 영향이 없다. ""1&1==1, 1&0==0, 0&0==0, 1|1==1, 1|0==1, 0|0==0, 1^1==0, 1^0==1, 0^0==0"". 말로 표현해 보자면 ""&""는 모든 항이 1일 때만 1이 되고, ""|""는 두 항 중 하나만 1이 되면 1이 되고, ""^""는 두 항이 서로 다를 때만 1이 된다.
= - 1항 비트 연산자: ""~"" NOT이라고 하며 비트의 값을 반전시킨다. 즉, 0을 1로 1을 0으로 바꾼다.
= - 2항 비트 쉬프트 연산자: ""<< >>"". 왼쪽 항에 지정된 변수 내의 비트값을 오른쪽 항에 지정한 비트수만 큼 밀어낸다. 이 때 밀려 들어오는 경계값들은 0으로 채워진다.
= - 2항 비교 연산자: ""== != < > <= >=""
= - 2항 대입연산자: ""= += -= *= /= %= &= |= ^= <<= >>="". ""=""를 제외한 대입연산자는 대입연산자의 양쪽에 있는 변수를 = 왼쪽에 있는 연산자로 처리한 후 그 결과를 왼쪽 항 변수에 대입한다. 예를 들어 ""a/=b+c""는 ""a=a/(b+c)""와 동일하다.
= -
=
= = 조건문
=
= C#은 if(0)이나 if(1) 처럼 bool 형식이 아닌 값에 대한 참, 거짓을 판단하지 않으며 다음과 같은 형식을 취한다.
= ---
= if(조건식)
= 조건식이 참일 경우 실행할 구문 또는 {} 블럭
= ---
= 위에서 말하는 구문에는 else 명령도 포함하고 있다. 따라서 위의 형식을 확장해 보면 다음과 같은 형식들이 가능하다.
= ---
= if(조건식){
= 조건식이 참일 경우 실행할 구문들
= }
=
= if(조건식){
= 조건식이 참일 경우 실행할 구문들
= }else{
= 조건식이 거짓을 경우 실행할 구문들
= }
=
= if(조건식1){
= 조건식1이 참일 경우 실행할 구문들
= }else
= if(조건식2){
= 조건식2가 참을 경우 실행할 구문들
= }else{
= 조건식 1과 2 모두 거짓을 경우 실행할 구문들
= }
= ---
=
= C#에서의 switch문은 break의 생략을 허용하지 않으며 다음과 같은 형식을 취한다.
= ---
= switch(정수형상수){
= case 값1:
= 정수형상수가 값1을 경우 실행할 구문들
= break;
= case 값2:
= 정수형상수가 값2을 경우 실행할 구문들
= break;
= default:
= 정수형상수가 위의 case에서 지정한 값들과 일치하지 않을 경우 실행할 구문들
= break;
= }
= ---
= if와 switch는 비슷한 역할을 하지만 중요한 차이점은 switch문에서는 정수형상수의 평가를 한 번만 수행한다는 것이다. 다음의 예를 보자.
= --bcode--
= int a, b;
=
= a = b = 0;
= if(++a == 2)
= b = 1;
= else
= if(++a == 3)
= b = 2;
=
= a = b = 0;
= switch(++a){
= case 2:
= b = 1;
= break;
= case 3:
= b = 2;
= break;
= }
= --ecode--
= 첫번째 if문은 ""1==2""의 참거짓을 판단해서 거짓이 된다. 따라서 두번째 if문에서 ""2==3""을 판단하게 되는데 역시 거짓이다. 따라서 if문 이후의 a값은 2가 되고 b는 0이다. 반면, switch문에서는 ""++a""를 한 번만 평가하게 되므로 1과 2, 1과 3을 비교하게 된다. 따라서 switch문 이후의 a값은 1이 되고 b는 0이다.
=
= 비교대상의 값이 변하지 않을 경우에는 if문과 switch문 차이가 별로 없어 보이지만 비교대상의 평가에 많은 리소스가 필요한 경우 switch문을 사용하는 것이 속도상 빠르다. 다음을 보자.
= --bcode--
= using System;
= class SpeedTest{
= static void Main(){
= IfSum();
= SwitchSum();
= }
= static void IfSum(){
= if(Sum(1, 100) == 55)
= Console.WriteLine("FALSE");
= else
= if(Sum(1, 100) == 5050)
= Console.WriteLine("TRUE");
= }
= static void SwitchSum(){
= switch(Sum(1, 100)){
= case 55:
= Console.WriteLine("FALSE");
= break;
= case 5050:
= Console.WriteLine("TRUE");
= break;
= }
= }
= static int Sum(int from, int to){
= int ret = 0;
=
= for(int i = from; i <= to; ++i)
= ret += i;
=
= return ret;
= }
= }
= --ecode--
= IfSum()에서는 if문마다 Sum(1, 100)을 실행하지만 SwitchSum()에서는 한 번만 Sum(1, 100)을 실행한다. 물론 Sum(1, 100)의 값을 미리 변수에 저장한 후 if문에서 그 변수를 이용하면 되지만 이럴 경우에도 (적어도 C의 경우에는) switch가 적은 수의 기계어를 차지한다.
=
= if문에서 또 한 가지 주의해야 할 것은 실수형의 비교이다. 실수형은 비교대상이 되는 두 변수의 정밀도에 따라서 예상치 못한 결과가 나올 수 있으므로 같은 변수형으로 캐스팅을 하거나 적당한 오차범위 내에서 비교를 하는 것이 옳다.
=
= = 반복문
= foreach ImproveMe
=
= 반복문에는 다음과 같은 것들이 있다.
= ---
= for(초기화; 조건식; 스텝){
= 실행할 구문들
= }
=
= while(조건식){
= 실행할 구문들
= }
=
= do{
= 실행할 구문들
= }while(조건식);
= ---
= 속도면에서는 for가 제일 빠르다. for문의 처리순서는 ''초기화 -> 조건식 -> 실행할 구문들 -> 스텝 -> 조건식 -> 실행할 구문들 -> ...''순이다. 이 때 조건식을 만족하지 못하면 for문은 종료된다.
=
= while문과 do문의 차이점은 while문은 최초 while문을 만났을 때 조건식에 대한 평가가 이루어지는 반면 do문은 적어도 한 번은 실행할 구문들을 실행한 후 조건식에 대한 평가가 이루어진다.
=
= 반복문 내에서 continue를 만나면 그 이후의 구문들은 실행하지 않고 다음 단계의 반복으로 넘어간다. 예를 들어 for문 내에서 continue를 만나면 다음 ''스텝''으로 넘어간다. while과 do문 내에서 continue를 만나면 다음 ''조건식'' 평가로 넘어간다. 주의할 것은 do문에서 continue를 만나면 do의 위치로 올라가는 것이 아니라 while의 위치로 내려 온다는 것이다.
=
= 반복문 내에서 break를 만나면 반복문을 종료한다.
=
= = 주석
= /// ImproveMe
=
= 주석에는 세 가지 종료가 있다: 한 줄 주석, 여러 줄 주석, XML 형태의 주석. 한 줄 주석은 //로 시작해서 해당 줄까지 계속되며, 여러 줄 주석은 /*로 시작해서 */까지 계속된다. 단, 여러 줄 주석은 중복을 허용하지 않는다.
=
+
+ = 토론