C#/기본기

C#/기본기

Tuple

보호되어 있는 글입니다.

C#/기본기

[C#] 일반화 프로그래밍 (=제네릭)

일반화 프로그래밍 - 특수한 개념으로부터 공통된 개념을 찾아 묶는 것을 "일반화"라고 한다 - 그 일반화하는 대상이 특이하게 데이터 형식이다 void CopyArray( int[] source, int[] target) { for(int i = 0; i< source.Length; i++) target[i] = source[i]; } CopyArray()메소드를 다음과 같이 오버로딩 void CopyArray( string[] source, string[] target) { for(int i = 0; i< source.Length; i++) target[i] = source[i]; } 만약 이러한 매개변수에 입력되는 배열의 형식만 다르고 내부논리는 똑같은 31가지 버전이 필요하다면? 31가지를 모두 오버..

C#/기본기

[C#] 배열

foreach - 배열과 함께 사용되는 반복문 - 한번 반복을 수행할 때 마다 배열/컬렉션 요소를( scores 의) 차례대로 순회하며 in앞의 변수 score에 담는다 foreach (int score int scores) { Console.WrieLine(score); } 마지막 요소에 접근하고 싶을 때 원래는 배열의 길이 =5, 마지막 요소 = 4이기 때문에 scores[scores.Length-1] (5-1 = 4) => scores[4] 를 해줬는데 C# 8.0부터는 이런 불편을 없앤 System.Index형식과 ^연산자가 생김 ^연산자 : 컬렉션의 마지막부터 역순으로 인덱스를 지정하는 기능 ^1 : 컬렉션의 마지막 요소 (score.Length - 1 이라고 생각) ^2 : 마지막에서 두번째 ..

C#/기본기

[C#] 레코드와 객체비교

레코드 형식으로 만드는 불변 객체 불변객체는 내부 상태(데이터)를 변경할 수 없는 객체 (앞에서도 많이 했던 readonly) 상태를 변경할 수 없다는 특성 때문에 불변 객체에서는 데이터 복사와 비교가 많이 이루어짐 새로운 상태를 복사한 뒤 이 중 일부를 수정해서 새로운 객체를 만들고 , 상태를 확인하기 위해 객체 내용을 자주 비교한다 레코드는 불변 객체에서 이뤄지는 이 두 가지 연산을 편리하게 수행할 수 있도록 C# 9.0에 도입된 형식 앞에서 불변 객체를 만드는 방법이 참조 형식 : 클래스의 모든 필드를 readonly로 선언 값 형식 : readonly struct로 구조체를 선언 값 형식 객체는 다른 객체에 할당할 때 깊은 복사를 수행 (모든 필드를 새 객체가 가진 필드에 1:1로 복사) 필드가 ..

C#/기본기

[C#] 자동구현 프로퍼티(get; set;)

자동구현 프로퍼티 프로퍼티는 데이터의 오염에 대해선 메소드처럼 안전하고, 데이터를 다룰 때는 필드처럼 간결하다 하지만 그것 또한 중복작업의 느낌이 든다 ★ 프로퍼티는 또한 Set이나 Get접근자에 논리를 추가해 접근단계에서 제어가 가능하다 하지만 아무논리도 섞여있지 않은 단순히 필드를 읽고 쓰기만 한다면? C#은 3.0부터 이런경우에 사용해서 코드를 더 단순하게 만드는 자동 구현 프로퍼티를 지원한다 방법은 그저 get; set;만 쓰면된다 필드를 선언할 필요도 없고 set의 value도 없는 등 많은 것을 생략하게 해줌 자동구현 프로퍼티 using System; using static System.Console; namespace Sample { class BirthdayInfo { public stri..

C#/기본기

[C#] 프로퍼티

public 필드의 유혹과 Get/Set메소드 필드는 public으로 선언하면 안된다 99프로의 필드는 private 필드의 값을 접근 및 변경할때 필드를 public으로 선언해놓고 Get/Set메소드 대신, 외부에서 cat.height = 100; 을 사용하는 것 처럼 " = " 연산자로 필드를 읽거나 할당하고 싶어진다 이렇게 되면 외부에서 클래스 내부의 필드에 쉽게 접근할 수 있기 때문에 객체 지향의 은닉성이 위반되고 자칫 데이터가 오염되기 쉽다 그렇기 때문에 통상적으로 은닉성을 지키고 접근 및 변경을 프로그래머가 원하는 대로 (조건문을 추가하거나 등) 할 수 있게 하기 위해 Get/Set메소드를 일일이 구현해주는 것이고, 한단계 발전하여 이를 간단하게 해주는게 프로퍼티다 Get/Set메소드? Get..

C#/기본기

[C#] 추상클래스 (abstact)

추상클래스 abstact class 클래스이름 { //클래스와 동일하게 구현 //추상메소드를 가질 수 있음 } - 인터페이스와 클래스 사이 - 추상 클래스는 "구현"을 가질 수 있다 - 하지만 클래스와 달리 "인스턴스"를 가질 수 없다 - 기본접근성(한정자를 명시하지 않을 때)을 private와 public 두가지를 가진다 (-> 추상메소드 설명에 같이 설명) - 추상메소드를 가질 수 있다 추상메소드 : 추상클래스가 한편으로 인터페이스의 역할도 할 수 있게 해주는 장치이다. 구현을 갖지는 못하지만 파생클래스에서 이 메소드를 반드시 구현하도록 강제한다. 이 때 파생클래스에선 override수식어를 사용하여 구현한다 (이것 또한 인터페이스-약속의 개념) 부가설명: 추상클래스에서 다른 일반 메소드 프로퍼티 등..

C#/기본기

[C#] 인터페이스 - 2. 인터페이스는 커넥터다

이전글 https://zizh.tistory.com/52 [C#] 인터페이스 - 1. 인터페이스는 약속이다 인터페이스 클래스는 객체의 청사진이라면 인터페이스는? 클래스의 청사진 즉, 클래스가 해야하는 행동 (= 메소드)를 결정 인터페이스의 실제 선언 예) interface ILogger { void WriteLog( string Message ); // zizh.tistory.com 인터페이스 - 커넥터의 의미 인터페이스는 커넥터다. 마치 USB포트 처럼. 두 클래스를 이어줌 예를 들어 사용자로부터 온도를 반복적으로 입력받아 기록하는 ClimateMonitor메소드를 만드는데, 로그를 저장하는 방식 등은 ClimateMonitor 클래스를 사용하는 다른 프로그래머들의 입맞에 따라 결정할 수 있어야 한다면..

파워지훈
'C#/기본기' 카테고리의 글 목록