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을 한다.
댓글
댓글 쓰기