-
C# GitHub, 제네릭, 애트리뷰트, 예외, 스레드 (2020.06.15)C# 2020. 6. 15. 10:50
https://backlog.com/git-tutorial/kr/
GitHub 입문
누구나 쉽게 이해할 수 있는 Git 입문~버전 관리를 완벽하게 이용해보자~ | Backlog
누구나 쉽게 알 수 있는 Git에 입문하신 것을 환영합니다. Git을 사용해 버전 관리를 할 수 있도록 함께 공부해봅시다!
backlog.com
Commit, Push, Pull 하는 게 가장 중요하다. Git은 원격저장소랑 로컬저장소 두 개가 있다.
Git Server = Remote Repository = 원격 저장소
내 저장소 = Local Repository
내 저장소에 원격 저장소에서 들고온 것을 수정한 것을 확정하는 것을 Commit 이라고 한다.
-> 아직 내 저장소에만 저장되어 있는 자료를 Server 에 올리는 것을 Push
-> 원격과 로컬 간의 동기화를 할 때 쓰는 것을 Pull
<설치>
Git-2.27.0-64-bit.exe
TortoiseGit-2.10.0.2-64bit.msi
TortoiseGit-LanguagePack-2.10.0.0-64bit-ko.msi
만든 새 레포지토리에 넣기
gitignore0.01MBgitattributes0.00MB들어가면 충돌이 일어나는 확장자에 대한 방지 기능
복제하면 GitHub 서버에서 만든 레포지토리 가져오기 (push)
수정한 문서에 확정짓기 Commit -> 확정지은 문서 GitHub에 올리기 Pull
GiuHub 가입은 알아서
https://docs.microsoft.com/ko-kr/
기술 문서, API 및 코드 예제
최종 사용자, 개발자 및 IT 전문가를 위한 최신 Microsoft 문서 받기: API 참조, 코드 예제, 기술 문서 등
docs.microsoft.com
필요한 자료 찾아서 다운받기.
이제 소스코드 전부 GitHub로 넣고 뺀다.
커밋 & 푸시 자물쇠가 잠겨 있다. 제네릭
재네릭 = 일반화
제네릭이란?
변수의 형을 매개변수로 하여 클래스나 메소드의 알고리즘을 자료형과 무관하게 기술하는 기법
형 매개변수(type parameter)
클래스 내의 필드나 메소드 선언시 자료형으로 사용 '<'과 '>' 사이에 형 매개변수의 이름을 기술 : <T1, T2, T3, ... Tn>
제네릭의 장점
알고리즘의 재사용성을 높임
자료형에 따른 프로그램의 중복을 줄임
프로그램의 구조를 단순하게 만듦
단점
소스를 이해 못하면 겁나 복잡해진다.
제네릭 클래스 : 형 매개변수(type parameter)를 가지는 클래스
- 형 매개변수를 이용하여 필드나 지역변수에 사용
- 실제 형 정보는 객체 생성 시에 전달받음
전달 형태
꺽쇠가 핵심
형식
형식 매개변수 형(formal parameter type)
-제네릭 클래스를 선언할 때 사용한 형 매개변수
- class SimpleGeneric { ... }
실제 형 인자(actual type argument)
-제네릭 클래스에 대한 객체를 생성할 때 주는 자료형
-new SimpleGeneric <Int32>(10);
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GenericTest { public class SimpleGeneric<T> //제네릭 사용 <T>를 제일 많이 사용 { private T[] values; //무슨 값이 들어가든 배열로 만듬 private int index; // alt enter -> 생성자 생성 public SimpleGeneric( int len) { values = new T[len];//T이므로 무슨 자료형이 들어가든 생성된다. index = 0; //배열의 인덱스는 0부터 시작 } public void Add(params T[] args) { //for까지 치고 탭두번하면 자동 완성 foreach (var item in args)//var은 T나 마찬가지이다. { values[index++] = item; } } public void Print() { foreach (var item in values) Console.Write(item + " "); Console.WriteLine(); } } class Program { static void Main(string[] args) { SimpleGeneric<Int32> gInteger = new SimpleGeneric<int>(10); //배열 개수 10개 SimpleGeneric<Double> gDouble = new SimpleGeneric<double>(10);//배열 개수 10개 //ctrl+space 하면 자동완성 gInteger.Add(1, 2); gInteger.Add(1, 2, 3, 4, 5, 6, 7); gInteger.Add(0); gInteger.Print(); gDouble.Add(10.0, 20.0, 30.0); gDouble.Print(); } } }
Generic 을 사용하지 않았다면 클래스를 두개를 만들어야 했다. 하지만 제네릭을 사용하면 하나로 다 퉁칠 수 있다.
커밋 하기 푸쉬 하기
예외처리
예외(exception)
실행 시간에 발생하는 에러(run-time error)
-프로그램의 비정상적인 종료
-잘못된 실행 결과 메소드의 호출과 실행, 부정확한 데이터, 그리고 시스템 에러 등 다양한 상황에 의해 야기
예외 처리(exception handling)
-기대되지 않은 상황에 대해 예외를 발생
-야기된 예외를 적절히 처리 (exception handler)
예외 처리를 위한 방법을 언어 시스템에서 제공
-응용프로그램의 신뢰성(reliability) 향상
-예외 검사와 처리를 위한 프로그램 코드를 소스에 깔끔하게 삽입
예외처리를 하게 되면 200~5000배 정도 느려진다. 너무 많이 하면 좋지 않다.
시스템 정의 예외 (system-defined exception)
프로그램의 부당한 실행으로 인하여 시스템에 의해 묵시적으로 일어나 는 예외
SystemException클래스나 IOException 클래스로부터 확장된 예외
CLR에 의해 자동적으로 생성
야기된 예외에 대한 예외 처리기의 유무를 컴파일러가 검사하지 않음 (unchecked exception)
프로그래머 정의 예외 (programmer-defined exception)
프로그래머에 의해 의도적으로 야기되는 프로그래머 정의 예외
프로그래머 정의 예외는 발생한 예외에 대한 예외 처리기가 존재하는지 컴파일러에 의해 검사 (checked exception)
클래스 계층도
최상위 클래스 Object로부터 하나씩 예외처리
시스템 정의 예외의 종류
* ArithmeticException 산술 연산시 발생하는 예외
*** IndexOutOfRangeException 배열, 스트링, 벡터 등과 같이 인덱스를 사용하는 객체에서 인덱스의 범위가 벗어날 때 발생하는 예외
ArrayTypeMismatchException 배열의 원소에 잘못된 형의 객체를 배정하였을 때 발생하는 예외
InvalidCastException 명시적 형 변환이 실패할 때 발생하는 예외
** NullReferenceException null을 사용하여 객체를 참조할 때 발생하는 예외
OutOfMemoryException 메모리 할당(new)이 실패하였을 때 발생하는 예외
묵시적 예외 발생
-시스템 정의 예외로 CLR에 의해 발생
-시스템에 의해 발생되므로 프로그램 어디서나 발생 가능
-프로그래머가 처리하지 않으면 디폴트 예외 처리기(default exception handler)에 의해 처리
명시적 예외 발생
-throw 문을 이용하여 프로그래머가 의도적으로 발생
throw ApplicationExceptionObject;
-프로그래머 정의 예외는 생성된 메소드 내부에 예외를 처리하는 코드 부분인 예외 처리기를 두어 직접 처리해야 함
Console.WriteLine("{0} / {1} = {2}",x,y,value); // 전통적인 방식 Console.WriteLine($"{x} / {y} = {value}"); //앞에 달러 붙여주면 중괄호 안에 변수값 바로 박아도된다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ExceptionTestApp { class Program { static void Main(string[] args) { int x, y, value; x = 100; y = 0; value = 0; value = x / y; Console.WriteLine("{0} / {1} = {2}",x,y,value); Console.WriteLine($"{x} / {y} = {value}"); } } }
피제수를 0으로 나눌 수 없는 예외 (System.DivideByZeroException) 비 정상적 종료
try { // ... "try 블록” }
catch (ExceptionType identifier)
{ // ... "catch 블록” }
catch (ExceptionType identifier)
{ // ... "catch 블록” }
finally {
// ... "finally 블록”
}
고급 프로그래밍 기법 에러 처리 구문(try-catch-finally 구문)
예외를 검사하고 처리해주는 문장 구문 형태
try 블록 : 예외 검사
catch 블록 : 예외 처리
finally 블록 : 종결 작업, 예외 발생과 무관하게 반드시 실행
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace ExceptionTestApp { class Program { static void Main(string[] args) { int x, y, value; x = 100; y = 0; value = 0; try // { value = x / y; // Console.WriteLine("{0} / {1} = {2}", x, y, value); Console.WriteLine($"{x} / {y} = {value}"); throw new Exception(" 사용자 에러"); //throw는 catch로 떨어진다. } catch (DivideByZeroException) { Console.WriteLine(" 2. y의 값을 0보다 크게 입력하세요"); } catch (Exception ex) { //Debug.WriteLine 디버깅 할때만 출력할 수 있다. //Debug.WriteLine(ex.ToString()); //Message , ToString, Stacktrace를 제일 많이씀 Console.WriteLine("3."+ex.Message); //Console.WriteLine(ex.StackTrace); throw; } finally //이 부분은 무조건 실행 에러가 나면 catch로 안나면 그냥 try에서 넘어온다. { Console.WriteLine("4. 프로그램이 종료했습니다."); } } } }
가장 먼저 try에 들어가서 catch finally 순 입니다. 위에서 throw new Exception은 임의로 그냥 에러를 낸 것이다.
가장 먼저 try문에 들어가서 에러가 발생 한다면 catch로 내려오는데 catch내부의 오류 종류에 따라 처리할 내부 구문을 적는다. finally 는 트라이 캐치문 이 끝날 때 무조건 내려온다. 내부 구문을 하나 더 적는다.
'C#' 카테고리의 다른 글
C# 윈폼 계산기 (0) 2020.06.15 C# 윈폼 (2020.06.15) (0) 2020.06.15 C# 클래스 간의 형변환, 중첩 클래스, 델리 게이트, 콜백 메서드(교육 14일차) (0) 2020.06.04 C# 오버라이드, 오버로드 (13일차) (0) 2020.06.03 C# Object Class(조상)+메서드 4종세트, 배열의 조상(System.Array) base, 다형성 (교육 12일차) (0) 2020.06.02