.NET Framework4.7.2
c# 기본사용법 정리
무한경쟁시대
2022. 3. 31. 22:45
using System;
using System.IO;
namespace Csharp_book
{
/*
* is와 as는 참조형을 대상으로 한 연산자이다.
* is는 지정한 데이터형과 식의 형이 일치하는 경우에는 true를 반환하고 서로 다르면 false 반환.
* as는 식을 지정한 데이터형으로 변환. 형변환은 변환 할 수 없을 때 오류(예외)처리 되지만, as는 null을 반환한다.
* as는 reference Type간의 캐스팅에만 가능.. value Type 불가능!
* as 연산자를 사용하여 캐스팅하면 프로그램 실행을 거치지 않고도 캐스팅이 성공유무를 확인 할 수 있다.
*/
public class Class1
{
private int a = 36;
private string b = "자전거";
//C# 프로퍼티!! private int a는 다른 클래스에서 접근이 안되지만 get set으로 접근 가능!
public int A { get { return a; } set { a = value; } }
public Class1()
{
Console.WriteLine(a);
Console.WriteLine(b);
}
public Class1(int a, string b)
{
this.a = a;
this.b = b;
Console.WriteLine(a is double);
Console.WriteLine(b is string);
}
}
public class Class2
{
public Class2() { }
}
public class Class3 : Class2
{
public void Method()
{
Console.WriteLine("캐스팅 성공!");
}
}
/*
* 생성자와 상속 Class4 ~ Class5
*/
public class Class4
{
public int x;
public Class4(int a, int b)
{
x = a + b;
}
}
/* 상속한 생성자에 인수가 있는 경우에는 다음과 같이 base를 이용하여 상속 원본에 인수를 전달.
* 만약 base가 없으면 상속 원본의 인수가 없는 생성자를 호출하도록 합니다.
*/
public class Class5 : Class4
{
public Class5(int c, int d) : base(c, d)
{
}
}
/*
* Class6는 예외처리
* try catch finally throw
*/
public class Class6
{
public Class6() { }
const string fn = "times.txt";
public static bool appendTime(bool goWork)
{
DateTime dt = DateTime.Now;
string mode = goWork ? "출근" : "퇴근";
string s = mode + " " + dt.Year + "/" + dt.Month + "/" + dt.Day + " " + dt.Hour + ":" + dt.Minute;
try
{
FileStream fs = new FileStream(fn, FileMode.Append);
StreamWriter w = new StreamWriter(fs);
w.WriteLine(s);
w.Close();
}catch(IOException)
{
Console.WriteLine("쓰기에 실패했습니다.");
return false;
}
Console.WriteLine(s);
return true;
}
//일람을 작성하여 표시하기 위한 메서드
public static void listTime()
{
string s;
try
{
FileStream fs = new FileStream(fn, FileMode.Open);
StreamReader r = new StreamReader(fs);
s = r.ReadLine(); // 시각 데이터를 기록한 파일을 읽음
while(s != null)
{
Console.WriteLine(s);
s = r.ReadLine();
}
r.Close();
}catch (IOException)
{
Console.WriteLine("읽을 수 없었습니다.");
return;
}
}
public static void usage()
{
Console.WriteLine("명령을 입력해 주십시오.");
Console.WriteLine("i:출근 o:퇴근 l:일람 q:종료");
}
}
internal class Program
{
static void Main(string[] args)
{
/*
* Class1 ~ Class3는 is, as연산자
*/
Class1 c1_test1 = new Class1();
Console.WriteLine();
Class1 c1_test2 = new Class1(10, "ㅊㅊ");
Console.WriteLine();
Class2 parent = new Class2();
Class2 parent2 = new Class3();
Console.WriteLine();
Class3 children = new Class3();
children = parent as Class3;
if(children != null)
{
Console.WriteLine("parent 인스턴스");
children.Method();
Console.WriteLine();
}
children = parent2 as Class3;
if( children != null)
{
Console.WriteLine("parent2 인스턴스");
children.Method();
Console.WriteLine();
}
/*
* Class4 ~ Class 5는 생성자와 상속(base)관련
*/
Class5 class5 = new Class5(1, 2);
Console.WriteLine(class5.x);
/*
* ref 와 out: 메소드의 인수를 통해 값을 전달하는 방법에는 값 전달과 참조 전달이 있다. 기본적으로 값 전달
* 클래스는 참조형이므로 ref를 지정하지 않아도 참조형이 된다. 참조형에서는 값 자체를 전달하지 않으므로
* 대량의 메모리를 소비하는 구조체에서도 처리 속도나 메모리 소비에 대한 영향이 적다는 특징이 있다.
*/
static void A(int b)
{
b = 50;
}
static void Z(ref int y)
{
y = 50;
}
int a = 10;
A(a);
Console.WriteLine(a);// 10이 출력
int x = 10;
Z(ref x);
Console.WriteLine(x);// 50이 출력
/*
* try, catch, fianlly 와 throw
*/
Class6.usage();
while (true)
{
Console.Write(">");
string cmd = Console.ReadLine();
if(cmd == "i")
{
Class6.appendTime(true);
}
else if (cmd =="o")
{
Class6.appendTime(false);
}
else if (cmd == "l")
{
Class6.listTime();
}
else if (cmd == "q")
{
break;
}
else
{
Class6.usage();
}
}
}
}
}