Languages/C#(31)
-
[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 -
[C#] 구조체(Structure)에 대해 알아보자!
구조체 (Structure) C#의 복합 데이터 형식에는 클래스 말고도 구조체가 있다. C 언어에서 봤던 그 구조체가 맞긴 하지만 여러모로 다른 점이 있다. 클래스처럼 필드와 메소드를 가질 수 있는 점에서 클래스와 구조체 둘은 서로 많이 비슷해 보인다. struct MyStructure { public int data; public void Method() { ... } } 클래스와 달리 은닉성을 비롯한 객체지향의 원칙을 강하게 적용하지 않는 편이라, public으로 필드를 사용해서 주로 쓴다. 그렇다면, 구조체와 클래스의 차이점은 뭘까? 특징 클래스 구조체 키워드 class struct 형식 참조 형식 (힙 할당) 값 형식 (스택 할당) 복사 얕은 복사 (Shallow Copy) 깊은 복사 (Deep ..
2022.03.21 -
[C#] 확장 메소드 (Extension Method)
확장 메소드(Extension Method)란? 기존 클래스의 기능을 확장하는 C#에서 지원하는 기법이다. 일반적인 사용자 정의 클래스의 경우에는 추가적인 메소드가 필요하다면 클래스 내부에서 추가로 정의하면 된다. 하지만 내장 라이브러리들 같은 경우에는 그럴 수가 없다. 이런 경우에 유용한 것이 확장 메소드이다. 확장 메소드를 사용하려면 다음과 같이 필요하다. 네임스페이스를 선언 메소드를 선언하되, static 한정자로 수식해야 한다. 선언하는 클래스 또한 static 한정자로 수식해야 한다. 메소드의 첫 번째 매개변수는 반드시 this 키워드와 함께 확장하고자 하는 클래스의 인스턴스여야 한다. 메소드에 필요한 매개변수는 두 번째 매개변수부터 채워준다. namespace 네임스페이스이름 { public ..
2022.03.21 -
[C#] 중첩 클래스(Nested Class)와 분할 클래스(Partial Class)
*이 글은 책을 바탕으로 공부한 글입니다. 중첩 클래스(Nested Class) 가끔씩 코드들을 보면, 중첩 클래스로 구현한 코드들이 보이곤 했다. class OuterClass { class NestedClass // 중첩 클래스 { } } 사실 아직까지 중첩 클래스를 사용의 필요성을 잘 느끼지 못하고 있긴 하다. 책을 읽어보니, 기본적으로 다음과 같은 두 가지 이유 때문에 사용하곤 한다고 한다. 클래스 외부에 공개하고 싶지 않은 형식을 만들고 싶을 때 현재 클래스의 일부분처럼 표현할 수 있는 클래스를 만들고자 할 때 중첩 클래스는 다른 클래스의 private 멤버에도 접근할 수 있다는 특징을 가지고 있다. 테스트를 해보니, 외부 클래스에서 내부 중첩 클래스의 private 멤버 접근은 안 되는 것 같..
2022.03.21 -
[C#] const와 readonly 둘 다 읽기 전용인데, 뭐가 다를까?
*이 글은 책을 바탕으로 공부한 글입니다. const const float range = 5f; // 공격 사거리 컴파일러는 상수에 지정된 값을 실행파일 안에 기록해둔다. 이 말은 상수는 프로그램이 실행되기 전부터 이미 값이 정해져 있다는 의미가 된다. (컴파일 타임에 이루어짐) 그렇기 때문에 변수와 달리, 상수는 프로그램 실행 중(런타임)에는 그 값을 절대로 바꿀 수 없다. 이러한 const 상수는 다음과 같은 특징들을 가진다. 1. 선언 시, 반드시 값을 할당해야 한다. // const float range; 컴파일 오류 const float range = 5f; 2. 자동으로 정적 변수(static) 속성을 가진다. class Monster { public const float range = 5f;..
2022.03.21 -
[C#] 부모 클래스와 자식 클래스 사이의 형변환을 해 보자! (is, as)
이 글은 책을 바탕으로 공부한 글입니다. 개요 개인적으로 생각하는 객체 지향의 꽃 중 하나는 업캐스팅(Upcasting)이라고 생각한다. 수많은 자식 클래스들이 있지만, 그 많은 클래스들을 부모 클래스 하나로 가리킬 수 있다는 것은 생산성에 정말 큰 영향을 미치는 것 같다. 처음 객체지향언어를 다룰 때는 당연히 나도 이게 무슨 의미인지 잘 알지 못했다. 내가 이해한 내용을 예시를 들면서 한 번 설명해보려고 한다. 다음과 같이 자식 클래스들이 있다고 하자. class Monster { public void Attack() { ... } } class Slime : Monster { public void LiquidAttack() { ... } } class Bubbling : Monster { public..
2022.03.21