.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();
				}
			}

		}
	}
}