Languages(59)
-
[C#] 객체를 배열처럼 인덱싱하자! : 인덱서(Indexer)
인덱서 (Indexer) 객체 내의 데이터를 인덱스를 통해 접근하게 해주는 일종의 프로퍼티라고 생각하면 된다. 객체를 마치 배열처럼 사용할 수 있는 것이 특징이다. 인덱서는 다음과 같이 선언한다. class 클래스이름 { 한정자 인덱서형식 this[형식 index] { get { // index를 이용하여 내부 데이터 반환 } set { // index를 이용하여 내부 데이터 저장 } } } 인덱서는 별다른 식별자를 가지지 않는다. 필요한 것은 오로지 인덱스 뿐이며 이것을 통해 객체 내의 데이터에 접근할 수 있게 해준다. 인덱서 사용 예제 class ItemList { private int[] itemList; public ItemList() { itemList = new int[10]; } public..
2022.03.25 -
[C#] 레코드(Record) 형식으로 만드는 불변(Immutable) 객체
불변 객체(Immutable Object) 불변 객체는 내부 상태(데이터)를 변경할 수 없는 객체를 말한다. 상태를 변경할 수 없다는 특성 때문에 불변 객체에서는 데이터 복사와 비교가 많이 이뤄진다. 레코드(record)는 이런 불변 객체에서 빈번하게 일어나는 복사와 비교 연산을 편하게 수행할 수 있도록 C# 9.0에서 도입된 형식이다. record Transaction { ... } "불변 객체는 클래스나 구조체로도 만들 수 있지 않아?" 클래스는 참조 형식이므로 모든 필드를 readonly로 선언하면 불변 객체로 만들 수 있다. 구조체는 값 형식이므로 readonly struct로 구조체를 선언하면 된다. 컴파일러가 모든 필드를 readonly로 선언하도록 강제하기 때문. 참조 형식과 값 형식의 장점..
2022.03.23 -
[C#] 인터페이스와 클래스의 사이 : 추상 클래스(Abstract Class)
추상 클래스 (Absract Class) 구현부를 가질 수 있지만, 인스턴스는 생성할 수 없다. 추상 클래스는 구현부를 가질 수 있다. 구현부를 가질 수는 있지만, 클래스와 달리 인스턴스 생성은 할 수 없다. 하지만 추상 클래스를 상속 받은 클래스의 인스턴스는 생성 가능하며, 업캐스팅 또한 가능하다. 추상 클래스 선언은 다음과 같이 absract 키워드를 사용하여 선언한다. abstract class 클래스이름 { // 클래스와 동일하게 구현 } 접근성 측면에서 본다면, 클래스와 더 가깝다. 인터페이스는 모든 메소드가 public으로 선언되는 반면, 클래스는 한정자를 명시하지 않으면 모든 메소드가 private으로 선언된다. 추상 메소드(Abstract Method)를 가질 수 있다. abstract c..
2022.03.23 -
[C#] 객체지향의 꽃, 인터페이스(Interface) - 2편
*이 글은 책을 바탕으로 공부한 글입니다. 1. 인터페이스는 상속이 가능하다. 인터페이스를 상속할 수 있는 것은 클래스만 있는 것이 아니다. 구조체는 물론이고, 인터페이스도 인터페이스를 상속할 수 있다. 기존의 인터페이스에 새로운 기능을 추가한 인터페이스를 만들고 싶을 때 인터페이스를 상속하는 인터페이스를 만들면 된다. 그런데, 그냥 수정하면 되지 왜 상속까지 지원하게 만들었을까? 수정이 가능하다면 그렇게 해도 되지만, 다음과 같이 인터페이스를 수정할 수 없는 상황이 있기 마련이다. 상속하려는 인터페이스가 소스 코드가 아닌 어셈블리로만 제공되는 경우 상속하려는 인터페이스의 소스 코드를 갖고 있어도, 이미 인터페이스를 상속하는 클래스들이 존재하는 경우 첫 번째 문장의 의미는, .NET SDK에서 제공하는 ..
2022.03.22 -
[C#] 객체지향의 꽃, 인터페이스(Interface) - 1편
/* 책을 바탕으로 공부한 글입니다. */ 다중상속이 허용되지 않는 C#에서 인터페이스(Interface)는 객체지향 프로그래밍을 한층 더 강력하게 만들어주는 요소다. 객체지향의 꽃이며, 객체지향 프로그래밍의 고수는 인터페이스를 잘 활용할 수 있어야 한다고 한다. 인터페이스(Interface)의 선언과 특징 인터페이스는 다음과 같은 선언 형식과 특징을 가진다. interface 인터페이스이름 { 반환형 메소드이름1(매개변수 목록); 반환형 메소드이름2(매개변수 목록); ... } 인터페이스는 메소드, 이벤트, 인덱서, 프로퍼티만 가질 수 있다. 접근 제한 한정자를 사용할 수 없고, 모든 것이 public으로 선언된다. 인터페이스는 자신을 상속받는 클래스에게 오버라이딩을 강제한다. 자식 클래스에서 구현할 ..
2022.03.22 -
[C#] 여러 필드를 담을 수 있는 구조체, 튜플(Tuple)
튜플 (Tuple) 여러 필드를 담을 수 있는 구조체로, 역시 값 형식이다. 읽기 전용이 아니므로, 튜플 구성 필드의 값 변경이 가능하다. 구조체와 달리, 튜플은 형식 이름이 없다. 그렇기 때문에 즉석에서 사용할 복합 데이터 형식을 선언할 때 적합하다. 명명되지 않은 튜플(Unnamed Tuple) 다음과 같이 필드의 이름을 지정하지 않는 튜플을 명명되지 않은 튜플(Unnamed Tuple)이라고 한다. var tuple = (123, 789); 튜플은 괄호 사이에 두 개 이상의 필드를 지정함으로써 만들어 진다. 위 예제처럼 생성한 경우, C# 컴파일러는 자동적으로 123을 Item1이라는 필드에 담고, 789를 Item2라는 필드에 담는다. var tuple = (123, 789); Console.Wr..
2022.03.21