Main() 메소드 : 응용 프로그램의 진입점.
※ Main()진입점이 여러개면 /main 플래그를 사용하거나 속성->시작 개체를 설정해야 한다.
static : 클래스의 범위에 있으므로 바로 호출할 수 있는 메소드
Console.WriteLine() : 텍스트 문자열을 표준 콘솔에 찍는다.
Main()의 3가지 signature
public static void Main(string[] args);
public static void Main();
public static int Main(string[] args);
System.Array의 Length 속성을 이용하면 배열의 개수를 셀수 있다.
foreach(string s in args)
와 같은 for문도 사용할 수 있다.
※ C#은 garbage collection이 가능하기 때문에 delete 키워드를 지원하지 않는다.
클래스 멤버 변수에는 자동으로 기본 값이 할당된다.
지역 변수에는 '출력' 매개변수로 기능하는 지역변수를 제외하고 초기 값을 할당해야 한다.
Console.Write() : Carriage Return 없는 텍스트 문자열을 표준 콘솔에 출력
Console.ReadLine() : Carriage Return 전까지 쌓인 입력 스트림으로 부터 정보를 얻음.
Console.Read() : 하나의 문자를 읽어옴.
포멧 지정자(placeholder) : {0}, {1}, {2}
WriteLine()은 객체 배열을 포맷 지정자로 지정할 수 있도록 오버로드 되어 있어 개수 제한 없이 항목 추가가 된다.
문자열 포멧 지정 플래그
{0:C} 같은 형식으로 사용
C : 통화(Currency) 포멧. local culture 기호를 앞에 붙인다. (\같은)
D : 10진수(Decimal) 포멧
E : 지수(Exponent) 표현
F : 고정 소수점(Float) 포멧
G : 일반(General), 고정 소수점 혹은 지수 포멧에 사용한다.
N : 기본 숫자 포멧
X : 16진수 포멧 지정.
값 형식과 참조 형식
값 형식 : 간단한 데이터 형식, 구조체
참조 형식 : 클래스
참조 형식에 대해 깊은 복사를 하기 위해서는 IClonable 인터페이스 구현 필요.
질문 |
값 형식 |
참조 형식 |
할당되는 곳 |
스택 |
관리힙 |
변수는 어떻게 나타내는가 |
local 복사본 |
할당 인스턴스에 의해 점유된 메모리 |
기본 형식 |
System.Value에서 파생 |
sealed 형식이 아니면 모든 형식으로부터 파생 가능. |
다른 형식의 기본 형식이 될 수 있는가? |
없다. 값 형식은 항상 sealed되어 있어 확장 불가 |
sealed되지 않았으면 다른 형식의 기본형식 가능 |
매개변수 전달 방식? |
값으로 전달 |
참조로 전달 |
Object.Finalize()재정의 |
불가능 |
간접적으로 가능. |
생성자 정의 |
가능. 기본생성자는 예약됨. |
가능 |
소멸시기 |
scope를 벗어날 때 |
garbage collect될 때 |
System.Object
Equals() : 메모리 상에 동일한 항목을 가리키면 true.
(재정의)일반적으로 비교되는 객체들의 내부 상태 값이 동일한 경우 true를 리턴.
GetHashCode() : 특정 개체 인스턴스를 식별할 수 있는 정수 반환
GetType() : 현재 참조형식을 자세하게 설명하는 객체 바환
ToString() : "namespace.classname' 형태의 문자열 반환
Finalize() : 객체가 힙으로부터 제거될 때 런타임에 의해 호출되는 메소드
MemberwiseClone : 멤버대 멤버로 복사된 새로운 객체 반환(얕은 복사)
System.Object 정적 멤버
object.Equals(), object.ReferenceEquals()
모든 C# 데이터 형식은 System namespace에 정의되어 있다. (밑은 별칭)
sbyte, byte, short, ushort, int, uint, long(64bit), ulong, char, float, double, bool(true,false), decimal(10^0~10^28), string(유니코드 문자집합), object
※ StringBuilder : 자바의 StringBuffer와 비슷한듯.
boxing과 unboxing
boxing : 명시적으로 값 형식을 이에 상응하는 참조 형식으로 변환하는 과정 <=> unboxing
※ unboxing시 데이터 형식이 box된 형식과 일치하는 지 검사하고 일치하면 복사가 진행됨. (InvalidCastException 발생 가능)
※ C# 클래스는 필요할 때 boxing, unboxing을 수행한다.
const : 자바의 static final 과 비슷한 의미. 값이 컴파일 시간에 계산된다. 고정되고 변경할 수 없는 값.
foreach (변수타입 변수명 in 배열)
배열 반복 처리 뿐만 아니라 시스템 컬렉션이나 사용자 지정 컬렉션도 반복 처리 가능.
C# 흐름 제어 구조
자바처럼 Boolean 표현식에만 반응한다.
메소드 접근 한정자
public
private
protected
internal : 해당 어셈블리 내에 있는 모든 형식에서 접근 가능하게 정의
protected internal : 메소드 접근이 현제 어셈블리나 파생된 형식으로 제한한다.
메소드 매개변수 한정자
COM의 attribute와 비슷
(없음) : in attribute와 비슷
out : 출력 매개변수는 호출된 맴버에 의해 할당된다.
ref : [in,out] attribute와 유사. 값은 호출자에 의해 할당. 메소드는 호출 범위 안에서 재할당 가능.
params : 여러 개의 매개변수를 한 매개변수처럼 보낼 수 있다.
out 매개변수 예시
※ 초기화 될 필요가 없다.
public static void add(int x,int y, out in ans)
{
ans = x+y;
}
int ans;
Add(90,90, out ans);
Console.WriteLine("90 + 90 = {0}", ans);
ref 매개변수
※ 반드시 초기화 되어야 한다.
참조형식을 값, 참조 형식으로 전달하기
참조형식 -> 값으로 전달 : 객체 상태 데이터는 변경 가능. 다른 객체를 참조하도록 변경되지 않음.
참조형식 -> 참조로 전달 : 상태데이터, 다른 객체를 참조하도록 변경됨.
배열
크기가 고정된 배열을 생성할 때 new 필요.
배열에 데이터를 넣으려면 index연산자 이용. (bookOnPl[0] = "haha"; )
중괄호 사용 가능.
- int[] ages = {20,22,23,0}
- string firstnames = new string[5]{"Steve", "Gina", "Swallow",'Baldy","Gunner"};
System.Array 기본클래스
162P 참조
문자열 조작하기
164p참조
+ = Concat() 동일하다.
C#에서도 escape 문자 (\t, \\, \n, ...) 사용 가능.
@를 통해 적힌 문자열 그대로 출력 가능.
StringBuilder
MFC의 CString이나 COM의 CComBSTR과 유사.
Append메소드.
열거형
0부터 시작, 혹은 프로그래머 마음대로 다른 번호 부여 가능.
암시적으로 System.Enum에서 파생.
네임스페이스 별칭 사용하기
using The3DHexagon = My3DShapes.Hexagon;
using 별칭 = 원래네임스페이스.클래스;