C# 문법 한페이지 요약


C# 문법 한페이지 요약





 C# 에 대한 전체 문법 정리 글입니다. 
 
  출처 : 
https://hyunssssss.tistory.com/54?category=413282
 본 글은 위의 출처를 한페이지로 요약한 글입니다.
 

 몇가지 부족한 내용이나 추가될 부분은 추가적으로 수정할 예정입니다. 









●C#은 객체지향 언어이다.


● .NET Framework(닷넷 프레임워크)라는 실행환경과 조화되어 움직인다. .NET Framework가 준비되어 있으면 OS와 관계없이 동작시킬 수 있다. 자바가 JavaVM상에서 동작하는 것과 비슷한 원리이다.


●C#언어 이용
-콘솔 어플리케이션
-windows 어플리케이션
-웹어플리케이션 - C#을 웹에 이용한 것이 'asp.net'이다.


●확장자로 ' .cs ' 사용



●C# 기본구조
ex)
using System;
namespace abc{
    class Hello{
          public static void Main(){
                 Console.WriteLine("HelloWorld");
           }
    }
}



●문자열 표시-Console.Write(), Console.WriteLine() 사용
ex)
Console.Write("aaa");
Console.WriteLine("aaa");     //뒤에 Line은 줄바꿈을 나타냄, 자바에서 println에서 'ln'과 같음



●변수의 선언 - 다른 프로그래밍 언어랑 유사하다
ex)
int a;
float b;
double c;
int d, e;


●변수의 표시
ex)
Console.Write(a);


●문자 - 유니코드 1개, char(발음'차')형에 저장
ex)
char a='A';    //문자는 ''로 묶는다.
                  // ""는 문자열을 묵을때 사용한다. ""를 쓸경우 null문자가 자동으로 삽입되어 두글자가 된다.
                     그러면 컴파일 에러 발생


●문자의 표시
ex)
Console.Write('A');


●문자열 - string형에 저장
ex)
string a="abc";     //문자열은 ""로 묶는다


●문자열의 결합 - + 연산자를 사용하여 연결한다.
ex)
string a="abc";
int b=3;
string c=a+b+"abc";



●배열 선언 - new연산자 이용
ex)
int []a=new int[4];
int []a=new int[]{1, 2, 3, 4};   //선언과 동시에 초기화
int []a={1, 2, 3, 4};               //선언과 동시에 초기화



●다차원 배열
ex)
-1차원
int []a=new int[3];

-2차원
int [ , ]a=new[2,3];    //쉼표로 차원을 구분

-3차원
int [ , , ]a=new int[2, 3, 4];



●다차원 배열 초기화
ex)
int [ , ]a={
       {10, 20},
       {30, 40},
       {50, 60}
};



●재그 배열 - 2차원 이상의 배열에서 각 방향의 요소 수가 일정하지 않은 배열
ex)
int [][]a=new int[3][];
a[0]=new int[3]{1, 2, 3};
a[1]=new int[2]{4, 5};
a[2]=new int[1]{6};


int [][]a=new int[][]{
      new int[]{1, 2, 3}.
      new int[]{4, 5},
      new int[]{6}
};



●length - 배열의 요소 수 구하기
ex)
int []a=new int[4];
int b=a.length;      // ()안 붙여도 됨


●열거형 선언 - enum(발음 '이념') 사용
ex)
enum A{a, b, c, d, e};
Console.WriteLine(A.a);



●bool형 - true 또는 false 중 한개의 값을 가지는 변수의 형
ex)
bool a=(x>y);



●조건 연산자 - '조건식 ? a : b; ' 조건식이 참이면 a, 거짓이면 b
ex)
bool bo;
int a= bo ? 100 : 10;   //bo가 참이면 100을, 거짓이면 10을 a에 대입



●캐스트 연산자 - 형명을 (0로 묶은것. 값이나 변수 앞에 쓰면 지정한 형으로 변환할 수 있다.
ex)
int a = 3;
int b = 2;
int c = (int) 1/b ;

●if문
if (조건) {
   내용
}
else  if(조건){
   내용
}
else{
   내용
}



●for문
int i;
for(i=0; i<3; i++){
   처리
}



●foreach문 - 배열같은 여러 데이터 모음의 각 요소를 처음부터 끝가지 한번씩 호출하여 처리할 때 사용하면 편리
ex)
int []nums=new int[5];
foreach(int  a  in  nums)
    Console.WriteLine(a);




●while문
while(조건){
   처리
}



●for문이나 while문 등의 반복을 실행도중에 중단하려면 break문, continue문 사용. 다른 언어랑 비슷함



●switch문
switch(식){
   case 값1:
          처리
          break;
   case 값2:
          처리
          break;
   default:
         처리
         break;
}



●클래스, 객체(Object) - 개념은 c++, java의 클래스와 비슷하다



●객체(Object) - 클래스를 실체화 한것. 클래스를 실체화하는 동작을 '인스턴스화하다' 또는 '객체를 생성하다'라고
                       표현한다.


●클래스의 정의
ex)
class A{
      public int a;        //접근 제한자를 생략하면 private으로 설정됨
      public int b;

      public int add(){
             return a+b;
      }
}             //c++과 달리 뒤에 ';' 안 붙임

●객체 생성 - new연산자 이용
ex)
A  a;
a = new A();
A  a = new A();



●필드 - 클래스 안의 '변수'를 뜻한다.
  메소드 - 클래스 안의 '함수'를 뜻한다.




●같은 객체내의 필드나 메소드를 참조하려면 필드명, 메소드명을 그대로 써준다.
다른 객체내의 필드나 메소드를 참조하려면 '.(마침표)'를 사용하며 '객체명.필드명' 이런식으로 사용한다.




●오버로드(overload) - 한 클래스안에 이름이 같고 인수의 수나 형이 다른 메소드를 여러개 정의하는 것. 이름이 같고 반환값이 다른 메소드는 오류 뜬다.



●생성자 - 객체의 생성과 함게 자동으로 호출되는 것으로서 클래스와 같은 이름의 특수한 메소드이다. 필드의 초기화 등에 이용한다.
ex)
class A{
     public int a, b;
     public A(){          //생성자는 반환값이 없다.
         a=0;
         b=0;
     }
}



●생성자를 작성하지 않으면 인수 없는 생성자가 자동으로 준비된다. 이것을 '디폴트 생성자'라고 한다.



●복사 생성자 - 같은 클래스의 객체를 인수로 받아 대응하는 필드에 값을 대입하는 생성자를 복사생성자라고 한다.
ex)
using System;
class A{
     public string title;
     public string writer;
     public A(string t, string w){
             title=t;
            writer=w;
     }
     public A(A a){
         title = a.title;
        writer = a.writer;
     }
}
class M{
static void Main(){
      A a = new A("책", "작가");
      A b = new A(a);
     }
}

●속성 - 객체 안에 있는 필드의 값을 취득 또는 설정하는 메서드이다. 필드를 반환하는 get엑세서와 필드에 값을 대입하는 set엑세서로 구성된다. 자바에서 setter, getter랑 비슷한 개념이다
ex)
usting System;
class A{
    public int a;
    public int sok{
          get{
          return a;
          }
          set{
          a=value;
          }
      }
}

A a=new A();
a.sok = 3;              //따로 set, get을 표시하지 않고 그냥 입력 or 출력하면 된다.
Console.Write(a.sok);



●인덱서(indexer) - 객체를 배열처럼 취급하고자 할 때 사용한다. 속성과 같이 get, set으로 구성
ex)
using System;
class A{
    int []a = new int[4];
    public int this[int i]{
        get{
        return a[i];
       }
        set{
        a[i]=value;
       }
    }
}

A a = new A();
a[0]=1;
a[1]=2;
a[2]=3;
a[3]=4;
for(int i=0; i<=3; i++){
  Console.Write(a[i]);
}



●상속 - ' :부모클래스명'을 붙인다
ex)
class A{
   ~~
}
class B : A{
   ~~
}



●sealed - 상속되지 않도록 할 클래스는 sealed를 사용하여 봉인한다.
ex)
sealed class A{
   ~~
}



●클래스를 상속했을 때 부모클래스와 자식클래스 각각에 생성자가 있는 경우 부모클래스로부터 차레로 생성자가 작동한다.




●기본 클래스의 생성자를 호출
- 상속한 생성자에 인수가 있는 경우에는 다음과 같이 base를 이용하여 상속원본에 인수를 전달
ex)
using System;
class A{
   public int x;
   public A(int a, int b){
       x=a+b;
   }
]
class B : A{
   public B(int c, int d) : base(c, d){}
}



●이름 은폐
- 자식 클래스의 멤버에 부모클래스의 멤버와 같은 이름을 붙이고자 할 경우에는 멤버의 정의 앞에 'new'를 붙인다.
여기서 new는 객체생성시 사용하는 new랑 다르다. new가 붙은 멤버를 호출하면 자식클래스 쪽의 멤버가 호출된다.
ex)
class A{
   public int a=10;
}
class B : A{
   new public int a=30;
}



●base - 이름이 은폐된 부모클래스의 멤버를 자식클래스안에서 사용할 때 사용
ex)
using System;
class A{
   public int a=3;
}
class B : A{
   new public int a=100;
   public void print(){
      Console.WriteLine(base.a);
   }
}



●오버라이드
 -상속한 메서드와 같은 이름, 같은 인수, 같은 반환값을 가지는 메서드를 해서 덮어 쓰는것. 오버라이드 되는 메소드에는 'virtual' 키워드를 붙이고 오버라이드 한 메소드에는 'override' 키워드를 붙인다
ex)
class A{
   public virtual void bye(){
      ~~
}}
class B : A{
   public override void bye(){
      ~
}}

●추상클래스 - 추상메서드를 가진 클래스이다.
●추상메서드 - 처리를 명시하지 않고 호출한 쪽만 정의한 메서드
ex)
abstract class A{
   public abstract void Add();   // '{}'안쓰고 ';'으로 끝난다.
}



●추상클래스를 상속하여 객체를 생성하려면 다음과 같이 override붙인 멤버를 준비한다.
ex)
abstract class A{
   public abstract void add();
}
class B : A{
   public override void add(){
         ~~
   }
}




●인터페이스 - 추상메서드, 추상속성, 추상인덱서, 이벤트만 멤버로 가질 수 있다.
ex)
interface A{
   public abstract void a();
   public abstract int b{
      get;
      set;
  }
}
class B : A{
   public void a(){
       ~~
   }
   public int prop{
          get{
               return b;
         }
         set{
              b=value;
         }
    }
}



●인터페이스의 정의에서 모든 메서드는 public로 취급하므로 엑세스 수식자는 생략할 수 있다.
ex)
interface A{
    void a();
    int b{
      get;
      set;
   }
}



●인터페이스는 여러개 받을 수 있다.
ex)
class X : A, B, C{
    ~~
}


●인터페이스의 상속 - 인터페이스도 클래스처럼 상속하여 새 인터페이스를 만들 수 있다.
ex)
interface A{
    ~~
}
interface B : A{
    ~~
}



●터페이스는 여러개 상속가능하다.
ex)
interface X : A, B, C{
   ~~
}


●상속원본의 인터페이스와 상속대상의 인터페이스에 각각 같은 멤버가 있을 경우 상속대상의 추상멤버에 new를 붙인다. new 안 붙이면 경고 발생
ex)
interface A{
   void e();
   void f();
}
interface B : A{
   void a();
   new e();
}



●object클래스 - 모든 클래스의 기본이 되는 클래스이다. 모든 클래스는 object클래스를 상속하고 있다.



●박스화(boxing) - 값형의 데이터를 객체형 변수에 대입하는 것
ex)
int a = 10;
object obj;
obj = a;



●박스화 해제 - 객체형의 데이터를 값형에 대입하는 것, 형을 명확히 하기 위해 형변환 사용
ex)
object obj = 10;
int b = (int)obj;



●네임스페이스 - 같은 이름의 클래스 등이 경합을 일으키지 않도록 할 수 있게 한다.ex)
namespace A{
    class Abc{
          ~~
   }
}



●네임스페이스 안에 속해 있는 클래스를 참조하려면 '.' 사용
ex)
A.abc;



●네임스페이스 안에 네임스페이스를 만들 수 있다.
ex)
namespace A{
   namespace B{
        ~~
   }
}

namespace A{
       ~~
}
namespace A.B{
      ~~
}

●using 지시어 - 뒤에 지정한 네임스페이스를 이용한다는 것을 선언
ex)
using System;



●Console클래스는 System 네임스페이스에 속한다.




●스트림 - 파일의 읽기 및 쓰기에 대한 데이터의 흐름을 스트림이라 한다. C#에서는 스트림 전용 클래스에서 생성한 객체를 사용한다. 스트림 클래스를 이용하려면 'using System.IO;'를 선언해야 한다.




●예외처리
ex)
try{
    예외가 발생할지도 모르는 처리
} catch(예외클래스명  변수명){
    예외 발생시 실행하는 처리
} finally{
    뒷 마무리 작업
}



●문자 읽기
①파일 열기 - FileStream클래스를 사용하여 스트림을 만들고 StreamReader라는 읽기용 클래스에 전달
ex)
FileStream fs = newStream("A.txt", "FileMode.Open");       //A.txt는 파일이름이고 FileMode는 열기모드이다
StreamReader r = new StreamReader(fs);


-열기모드

 처리 의미
 FileMode.Open 기존파일을 연다
 FileMode.OpenOrCreate 파일이 없으면 만들어서 연다
 FileMode.Append 추가모드로 연다. 파일이 없으면 만든다.
 FileMode.Create 파일을 만든다. 같은 이름 파일이 있으면 이전 파일 지우고 만든다
 FileMode.CreateNew 파일들 만든다. 같은 이름 파일이 있으면 예외가 발생한다.



②데이터를 읽는다 - StreamReader클래스의 ReadLine()메서드를 사용한다.
ex)
string s = r.ReadLine();      //ReadLine는 한행의 문자열을 읽는다.


③파일을 닫는다 - StreamReader클래스의 close()메소드 사용
ex)
r.Close();



●문자 읽기 예
ex)
using System;
using System.IO;
class Read{
   static void Main(){
        FileStream fs;
        try{
            fs = new FileStream("A.txt", FileMode.Open);     //A.txt는 실행파일과 같은 위치에 준비한다.
        }
        catch(IOException){
           Console.WriteLine("파일을 열 수 없음");
           return;
        }
        StreamReader r = new StreamReader(fs);
        string s;
        while(( s = r.ReadLine() ) != null ){
            Console.WriteLine(s);
        }
        r.Close();
     }
}


●문자 쓰기
①파일 열기 - FileStream클래스를 사용하여 스트림을 만들고 StreamWriter라는 쓰기용 클래스에 전달
ex)
FileStream fs = new FileStream("A.txt", FileMode.Create);
StreamWriter w = new StreamWriter(fs);



②데이터를 쓴다 - StreamWrite클래스의 Write()메소드를 사용
ex)
w.Write("파일에 쓸 내용");


③파일 닫기 - StreamWriter클래스의 Close()메소드를 사용
ex)
w.Close();



●키보드 입력 - Console클래스의 ReadLine()메소드 사용
ex)
string s = Console.ReadLine();



●데이터 순서를 지정하여 출력
ex)
WriteLine("{0} {1} {2} {0}", "0번째", "1번째", "2번째");

출력 : 0번째1번째 2번째 0번째
ex)
WriteLine("{1}-{0}은 {2}이다." "3","2",3-2);



●문자열 조작 메서드
- Length - 문자열 길이  반환
ex)
string a = "abc";
string b = a.Length;

- IndexOf - 문자열의 인덱스번호를 검색
ex)
string a = "abcde";
int b = a.IndexOf('d');

- Substring - 문자열 일부를 가져옴
ex)
string a = "abcde";
atring b = a.Substring(1, 3);     //인덱스번호 1부터 문자열 3개 가져온다. (인덱스 번호는 0부터 시작)



●데이터형 변환 메소드
- 다른형에서 문자열로 변환할 때 ToString() 메소드 사용
ex)
int a = 1;
string b = a.ToString();

- 문자열에서 다른 형으로 변환할 땐 각 데이터형의 Parse() 메소드 사용
ex)
string a = "10";
int b = int.Parse(a);



●C#은 c, c++과 달리 자동으로 garbage collection을 한다.

댓글