델리게이트(delegate) - 대리자
/// <summary>
/// 델리게이트(대리자) 선언
/// </summary>
delegate void Work();
delegate void Work11(int num);
static void Work_01()
{
Console.WriteLine("주문 받겠습니다.");
}
static void Work_02()
{
Console.WriteLine("계산 하겠습니다.");
}
static void Work_03()
{
Console.WriteLine("기다려주세요.");
}
static void Work_04()
{
Console.WriteLine("벨이 울림.");
}
static void Work_05(int i)
{
Console.WriteLine("테스트 용. {0}", i);
}
//메인 함수
static void Main(string[] args)
{
//델리게이트 사용
Work myWork = new Work(Work_01); //0
myWork += new Work(Work_02);//1
myWork += new Work(Work_03);//2
myWork += new Work(Work_04);//3
myWork += new Work(Work_02); //4
myWork();
myWork -= new Work(Work_02); //뒤에꺼부터 없어짐 - 4가 없어짐
myWork();
//myWork += new Work(Work_05); //인수가 달라서 안됨
//인자가 있는 델리게이트 사용. 델리게이트로 동일한 형태의 인자와 리턴이 있어야 함
Work11 myWork11 = new Work11(Work_05);
myWork11(222);
}
'공부 > C#' 카테고리의 다른 글
Console 커서 포지션(CursorPosition) (0) | 2016.05.08 |
---|---|
class - is , as (0) | 2016.05.08 |
함수 주석 /// (0) | 2016.05.08 |
상속 가상 함수 선언 (0) | 2016.05.08 |
상속 protected 접근 (0) | 2016.05.08 |
//함수 위에서 /를 3번 입력하면 아래와 같이 자동으로 주석 공간이 생성된다.
//받는 인자값이 있거나 return값이 있으면 각각 xml형태로 주석 공간이 생성된다.
/// <summary>
/// 테스트 1번
/// </summary>
static void Test1()
{
Console.WriteLine("Hello Function1");
}
/// <summary>
/// 함수 위에 /// (/ 세 번)해주면 인스턴스, 리턴에 따라 xml형식으로 주석 공간이 자동으로 생긴다.
/// </summary>
/// <param name="i">int값을 받아 사용</param>
/// <param name="f">float값을 받아 사용. 이유 쏼라쏼라~</param>
static void Test2(int i, float f)
{
Console.WriteLine("Test2 : {0} {1}", i, f);
}
/// <summary>
/// 숫자를 받아와 1증가 시키는 함수
/// </summary>
/// <param name="num">받아올 수</param>
/// <returns>1증가시키고 반환</returns>
static int Test3(int num)
{
return ++num;
}
'공부 > C#' 카테고리의 다른 글
class - is , as (0) | 2016.05.08 |
---|---|
델리게이트(delegate) - 대리자 (0) | 2016.05.08 |
상속 가상 함수 선언 (0) | 2016.05.08 |
상속 protected 접근 (0) | 2016.05.08 |
상속 정의 (0) | 2016.05.06 |
상속 가상 함수 선언
//상속 가상 함수 선언
class Unit
{
public virtual void Test() // virtual public void Test() 도 가능
{
Console.WriteLine("유닛이다.");
}
}
//virtual 선언시 주의 사항 :
//1. private로 만들 수 없다. 접근 자체가 불가하므로 컴파일이 안됨.
//2. static으로도 만들 수 없다. 객체의 상속 관계에서 적용되는 것인다. 메모리 계속 유지되어있는 static은 재정의 할 수 없다.
class Gunner: Unit
{
public override void Test() // override public void Test() 도 가능
{
Console.WriteLine("거너롤세.");
}
}
//또 이를 상속받은 클래스가 다시 재정의 할 수도 있다.
class Mechanic : Gunner
{
public override void Test() // override public void Test() 도 가능
{
Console.WriteLine("메카닉이야.");
}
}
/*
====================================
만약 재정의 하려는 의도가 아니라
새로운 함수를 추가한 것임을 알리기 위해서는
new를 명시적으로 적어주면 된다.
====================================class Mechanic : Gunner
{
new public void Test() // public new void Test() 도 가능
{
}
}
/*
====================================
*/
'공부 > C#' 카테고리의 다른 글
델리게이트(delegate) - 대리자 (0) | 2016.05.08 |
---|---|
함수 주석 /// (0) | 2016.05.08 |
상속 protected 접근 (0) | 2016.05.08 |
상속 정의 (0) | 2016.05.06 |
class 변수 선언 - get, set (0) | 2016.05.06 |
상속 protected 접근
//상속 protected 접근
class Base
{
public bool publicVar = true;
protected bool protectedVar = true;
public void PublicWrite()
{
Console.WriteLine("PublicWrite : {0}", publicVar);
}
protected void ProtectedWrite()
{
Console.WriteLine("ProtectedWrite : {0}", protectedVar);
}
}
class Derived : Base
{
public void PublicWrite2()
{
Console.WriteLine("PublicWrite : {0}", publicVar);
}
public void ProtectedWrite2()
{
ProtectedWrite(); //부모의 protected함수에 접근
Console.WriteLine("ProtectedWrite : {0}", protectedVar);
}
}
class Program
{
static void Main(string[] args)
{
Base baseObj = new Base();
Derived derived = new Derived();
Console.WriteLine("부모 public 접근 : {0}", baseObj.publicVar);
//Console.WriteLine("부모 protected 접근 : {0}", baseObj.protectedVar); // 에러
Console.WriteLine("자식 public 접근 : {0}", derived.publicVar);
//Console.WriteLine("자식 protected 접근 : {0}", derived.protectedVar); // 에러
baseObj.PublicWrite();
//baseObj.ProtectedWrite(); //에러
derived.PublicWrite(); //자식으로 선언한 변수로 부모 함수(public) 접근
//derived.ProtectedWrite(); //에러
derived.PublicWrite2();
derived.ProtectedWrite2();
}
}
//================================================================
//protected변수, 함수는 자식만 직접 접근이 가능함을 기억하자. (c/c++/java 공통적인 기본 사항이다.)
//다른 class에서 사용하고자 한다면 자식에 public으로 접근 가능하게 우회하여야 한다.
//================================================================
'공부 > C#' 카테고리의 다른 글
함수 주석 /// (0) | 2016.05.08 |
---|---|
상속 가상 함수 선언 (0) | 2016.05.08 |
상속 정의 (0) | 2016.05.06 |
class 변수 선언 - get, set (0) | 2016.05.06 |
Console Color (0) | 2016.05.04 |
//class MyClass2 : public MyClass1 //c++ 상속
class MyClass2 : MyClass1 //무조건 public 상속만 가능하며 하나만 가능하다.
{
}
//제가 하는 포스팅은 보통 c++과 c# 차이에 대한 것만 적지 개념을 따로 정리하지 않습니다.
'공부 > C#' 카테고리의 다른 글
상속 가상 함수 선언 (0) | 2016.05.08 |
---|---|
상속 protected 접근 (0) | 2016.05.08 |
class 변수 선언 - get, set (0) | 2016.05.06 |
Console Color (0) | 2016.05.04 |
시간 측정 Stopwatch (0) | 2016.05.04 |
class 변수 선언 - get, set
//아래는 c++의 사용 방법
// int x = 0; //안붙이면 private:
//public:
// int i = 1;
// int j = 2;
//C#에서는 각각 붙여줘야 함
public int i = 1;
protected int j = 2;
int k = 3; // 안붙이면 private
private int l = 4;
/*
//c++에서는 아래와 같이 별도로 Get함수와 Set함수를 만들었었다.
public int GetK()
{
return k;
}
public void SetK(int num)
{
k = num;
}
*/
public int L //변수가 소문자면 get/set을 위한 함수는 보통 같은 글자의 대문자로 사용한다.
{
//겟셋
get { return this.l; }
set //값을 넣을 때 별도의 처리가 가능하다
{
if(value < 0)
{
this.l = 0;
}
else if(value > 100)
{
this.l = 100;
}
else
{
this.l = value; //value는 별도로 지정하는 것이 아니라 값을 자동으로 받아온다.
}
}
/*
//set이 없으면 읽기 전용
get { return this.l; }
// set { this.l = value; }
*/
}
'공부 > C#' 카테고리의 다른 글
상속 protected 접근 (0) | 2016.05.08 |
---|---|
상속 정의 (0) | 2016.05.06 |
Console Color (0) | 2016.05.04 |
시간 측정 Stopwatch (0) | 2016.05.04 |
반복문 (0) | 2016.05.04 |
Console Color
//Console Color
//글자색 컨트롤
Console.ForegroundColor = ConsoleColor.Green;
//Console.ForegroundColor = (ConsoleColor)10
//글자 배경 컨트롤
Console.BackgroundColor = ConsoleColor.Red;
Console.WriteLine("선택하신 무기가 장착 되었습니다.");
Console.ResetColor(); //기본 색상으로 돌아감(글자색 , 배경색 포함)
/*
//c++ 에서는
//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
//위의 함수를 사용.
//color는 2바이트 숫자를 가져옴. (WORD = unsigned short)
//16진수로 0x00~0xFF까지. 앞수가 배경, 뒷수가 글자색
*/
'공부 > C#' 카테고리의 다른 글
상속 정의 (0) | 2016.05.06 |
---|---|
class 변수 선언 - get, set (0) | 2016.05.06 |
시간 측정 Stopwatch (0) | 2016.05.04 |
반복문 (0) | 2016.05.04 |
비트 연산 (0) | 2016.05.04 |
시간 측정 Stopwatch
//클래스 추가
using System.Diagnostics;
//아래는 코드 추가 부분
//시간 측정
Stopwatch sw = new Stopwatch(); //생성
sw.Start(); //시작
sw.Stop(); //중지
long time = sw.ElapsedMilliseconds; //밀리언초 반환
sw.Reset(); //시간리셋
sw.Restart(); //재시작
'공부 > C#' 카테고리의 다른 글
class 변수 선언 - get, set (0) | 2016.05.06 |
---|---|
Console Color (0) | 2016.05.04 |
반복문 (0) | 2016.05.04 |
비트 연산 (0) | 2016.05.04 |
switch (0) | 2016.05.04 |
//반복문
int i = 0;
while(i < 10)
{
++i;
Console.WriteLine("While : {0}", i);
}
i = 0;
do
{
++i;
Console.WriteLine("Do While : {0}", i);
} while (i < 10);
int[] test = new int [10];
for (int j = 0; j < test.Length; ++j)
{
test[j] = j;
Console.WriteLine("For : {0}", j);
}
//foreach(int nn in test) //test에 들어있는 것은 nn 변수로 받겠다
//{
// Console.WriteLine("Foreach : {0}", nn);
//}
foreach (var nn in test) //c++ 에서 auto 가 C# 에서 var로 되었다
{
Console.WriteLine("Foreach : {0}", nn);
}
'공부 > C#' 카테고리의 다른 글
Console Color (0) | 2016.05.04 |
---|---|
시간 측정 Stopwatch (0) | 2016.05.04 |
비트 연산 (0) | 2016.05.04 |
switch (0) | 2016.05.04 |
사칙연산 (0) | 2016.05.04 |
//비트 연산자 <<, >>, &, |
//2진법
//<<왼쪽 시프트 - 한번 시프트에 2배 증가. 오른쪽 새로 생기는 건 0으로 처리. 왼쪽에 사라는건 날라감
//>>오른쪽 시프트 - 한번 시프트에 절반 감소. 왼쪽에 새로 생기는건 0으로 처리. 오른쪽에 사라지는건 날라감
int bitA = 4; //100
int bitB = 2; // 10
Console.WriteLine("bitA : {0}, bit : {1}",
Convert.ToString(bitA, 2), //2진수로 컨버트
Convert.ToString(bitB, 2)); //2진수로 컨버트
Console.WriteLine("{0} & {1} = {2}",
Convert.ToString(bitA, 2),
Convert.ToString(bitB, 2),
Convert.ToString(bitA & bitB, 2)); // &연산
Console.WriteLine("{0} | {1} = {2}",
Convert.ToString(bitA, 2),
Convert.ToString(bitB, 2),
Convert.ToString(bitA | bitB, 2)); // | 연산
//비트 플래그 - 무기장착을 예로 들어 봄
int sword = 0x01; //16진수 => 2진수로 0000 0001 //앞에 더있는 0000 0000 0000 0000 0000 0000 은 생략
int staff = 0x02; //0000 0010
int axe = 0x04; //0000 0100
int spear = 0x08; //0000 1000
int bow = 0x10; //0001 0000
int weaponUsable = sword | axe | spear; //0000 1101
if((weaponUsable & spear) != 0)
{
//spear가 true가 됐다
Console.WriteLine("나는 창을 쓸 수 있다.");
}
else
{
//spear가 false가 됐다
Console.WriteLine("나는 창을 쓸 수 없다.");
}
//weaponUsable : 0000 1101
//spear를 뺴고자 한다.
//spear : 0000 1000
//~spear (보수) :1111 0111
//원하는 결과 : 0000 0101
//weaponUsable와 spear의 보수값을 & 하면 원하는 결과가 나온다.
weaponUsable = weaponUsable & (~spear);
if ((weaponUsable & spear) != 0)
{
//spear가 true가 됐다
Console.WriteLine("나는 창을 쓸 수 있다.");
}
else
{
//spear가 false가 됐다
Console.WriteLine("나는 창을 쓸 수 없다.");
}
//1byte는 8bit => 0000 0000
int value = 5; // 0000 0000 0000 0000 0000 0000 0000 0101
Console.WriteLine("{0} << 2 = {1}",
value, Convert.ToString(value << 2, 2)); // 0001 0100
Console.WriteLine("{0} >> 2 = {1}",
value, Convert.ToString(value >> 2, 2)); // 0000 0001