CS/C# 12

[C#] 무명 형식, 인터페이스와 프로퍼티, 추상 클래스의 프로퍼티

프로퍼티의 마지막 시간입니다. 무명 형식, 인터페이스와 프로퍼티, 추상 클래스의 프로퍼티 배울 것이 많아 보입니다. 빠르게 공부해봅시다! # 무명 형식 (Anonymous Type) 제목 그대로 이름이 없는 형식을 무명 형식이라고 합니다. 보통은 임시로 사용하는 경우 특별히 다시 사용하지 않기 때문에 람다처럼 이름을 붙이지 않습니다. 무명 형식은 형식의 선언과 동시에 인스턴스를 할당합니다. 인스턴스를 만들고 다시는 사용하지 않을 때 무명 형식이 요긴합니다. var tempInstance = new {Name = "나, 무명", Age = 20}; 무명 형식의 프로퍼티에 할당된 값은 변경 불가능합니다. 읽기만 가능하죠. 나중에 LINQ(링큐)에서 요긴하다고 합니다. using System; namespac..

CS/C# 2021.12.21

[C#] Record 와 Property

프로퍼티 두 번째 시간입니다. # 프로퍼티란? 레코드에 들어가기 전에 참조 형식과 값 형식에 대해서 잠깐 언급하고 가보겠습니다. 값 형식은 필드가 많으면 많을수록 복사 비용이 커지게 됩니다. 왜냐하면 깊은 복사로 새 객체가 기존에 가진 모든 필드를 1:1 복사하기 때문이죠. 그렇지만 참조 형식에서는 이런 오버헤드가 없습니다. 객체가 참조하는 메모리 주소만 복사하면 되기 때문입니다. 하지만 참조는 얕은 복사를 진행하며, 깊은 복사가 필요한 경우 따로 프로그래머가 구현해줘야 합니다. 더 들어가봅시다. 값 형식은 객체를 비교할 때에도 기본적으로 내용을 비교하는데 모든 필드를 1:1 비교합니다. 불변 객체에서 필요한 방법입니다. 참조 형식은 내용 비교를 할 수 있으려면 프로그래머가 직접 비교 코드를 작성해야 합..

CS/C# 2021.12.21

[C#] property, 프로퍼티

오늘은 프로퍼티에 대해서 배워보겠습니다. 기존에 C++을 공부를 했었고, 은닉성을 위해서는 public으로 필드 멤버를 선언하는 것이 아닌 private로 감추고 필요한 부분만 getter, setter를 구현해서 사용하라고 배웠습니다. 맞는 방법이지만 한 변수에 getter와 setter까지 하면 변수가 많아질수록 이 수 또한 엄청 많아지게 될 것입니다. C#에서는 이러한 것들을 한 뭉치로 묶을 수 있는 프로퍼티를 제공합니다! # 프로퍼티 class Program { private int age; public int Age { get { return age; } set { age = value; } } } age라는 것을 Age라는 프로퍼티로 제공하게 됩니다. Program p = new Program..

CS/C# 2021.12.21

[C#] 인터페이스와 추상 클래스

객체지향 프로그래밍의 '꽃'인 인터페이스와 추상 클래스에 대해서 공부했습니다. 배우기에 앞서서는 인터페이스와 추상 클래스가 많이 비슷하기도 하고 다른 점이 뭐가 있을까에 대해서 궁금했었는데 빠르게 알아봅시다! # 인터페이스 선언 C#의 인터페이스는 다음과 같이 생겼습니다. interface flyable { void fly(); } 인터페이스에서는 메서드, 이벤트, 인덱서, 프로퍼티만을 가질 수 있고, 클래스의 선언과 비슷하지만 언뜻 보면 구현부가 없고 함수의 정의 부분만 있습니다. 인터페이스에서는 접근 제한 한정자를 사용할 수 없으며, 모든 것들이 public으로 선언됩니다. 클래스와는 다르게 인스턴스화를 만들 수 도 없고요. 다만, 인터페이스를 상속한 클래스에서는 인스턴스를 만드는 것이 가능합니다. ..

CS/C# 2021.12.20

[C#] 정적 필드와 메서드(static)

C#에 오면서 헷갈리는 부분이 바로 정적 필드와 메서드 부분이었습니다. 아마도 이쪽 부분에 대해서 개념이 흔들려서 그런 것 같기도 했으나 오늘 공부로 한 층 더 업그레이드해보겠습니다. # static 메서드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지정하는 한정자라고 합니다. 하나의 프로그램에는 인스턴스는 여러 개가 존재할 수 있으나, 붕어빵을 만드는 틀(클래스)은 단 하나만 존재합니다. 어떤 필드가 클래스에 소속된다는 것은 그 필드가 프로그램 전체에서 유일하게 존재한다는 것을 의미합니다. 유심히 살펴보면 Main 함수도 static으로 선언되어 있습니다. 말이 어렵죠. 일반적으로 만드는 인스턴스와 static을 비교해보겠습니다. # 정적 필드 using System; class Ins..

CS/C# 2021.12.12

[C#] 생성자와 소멸자

객체를 생성하고 만드는 과정에서 사용되는 생성자와, 언젠간 객체도 사용되지 않는다면 소멸하므로 소멸할 때 사용하는 소멸자에 대해서 알아보겠습니다. # 생성자 이름 그대로 생성할 때 호출되는 녀석입니다. 생성자의 임무는 클래스의 객체를 생성하는 것이며, 동시에 스페셜하게 readonly도 초기화가 가능합니다. class Name { public int a; public int b; public Name() { // 디폴트 생성자 } public Name(int a, int b) { // 매개변수를 입력받아 원하는 값으로 초기화 this.a = a; this.b = b; } } 클래스를 선언할 때 명시적으로 생성자를 구현하지 않아도 객체가 생성이 됩니다. 그 이유는 컴파일러에게 디폴트 생성자를 만들어주기 때..

CS/C# 2021.12.11

[C#] 클래스

프로그래머는 추상주의 예술가라고 합니다. 세상에 존재하거나 존재하지 않는 것을 코드로 나타내야 하며 컴퓨터 세계에서 실체화합니다. 객체로 표현하는 방법이 객체지향 프로그래밍입니다. # 객체 객체란 것은 세상의 모든 것을 지칭하는 단어입니다. 자동차, 연필, 붕어빵 등등 객체의 주요 특징은 속성과 기능이 있습니다. 속성(property) : 데이터 기능(function) : 행동 예를 들어 사람이라는 객체는 속성은 나이, 주민번호, 몸무게, 키가 될 수 있고, 기능은 걷기, 뛰기, 달리기, 먹기와 같이 나열할 수 있습니다. 이러한 객체를 어떻게 만들 수 있을까요? 바로 클래스를 이용해서 만들 수 있습니다. # 클래스 클래스는 객체를 만들기 위한 청사진(틀)입니다. 붕어빵이라는 객체를 만들기 위해서는 붕어빵..

CS/C# 2021.12.11

[C#] 문자열 찾기 함수들

항상 문자열의 함수는 자주 사용하지 않거나 경험이 적으면 까먹는 경우가 종종 있습니다. 매번 서치 해서 보는 것도 좋지만.. 따로 정리를 해두면 어떨까 해서 자료들을 모아 정리해보겠습니다. C#에서는 string에 대해서 여러 가지 다양한 문자열 찾기 함수를 지원하고 있습니다. # IndexOf() : 현재 문자열에서 찾고자 하는 지정된 문자 혹은 문자열의 위치를 앞에서부터 찾아서 반환합니다. 해당하는 부분이 없으면(존재하지 않으면) -1을 리턴합니다. 중요한 점은 맨 처음 발견되는(시작되는) 인덱스를 보고한다는 점입니다. string str = "Hello, World!"; int a = str.IndexOf('W'); // 7 int b = str.IndexOf("rld!"); // 9 int c =..

CS/C# 2021.12.10

[C#] var

[ var ] var에 대해서 정리해봅시다! C++에서도 'auto'라는 키워드가 있었는데, C#에서도 'auto'와 비슷한 기능을 하는 'var'가 존재합니다. var a = 3; var b = "string"; var를 사용해서 변수를 선언하면 컴파일러가 자동으로 해당 변수의 형식을 지정해줍니다. 이러한 키워드는 왜 사용하는지 항상 의문이 들었는데, 변수의 형식이 긴 경우에 간단하게 해 준다는 장점이 있습니다. C++에서는 iterator 같은 형식을 지정할 때 생각보다 길게 되는데 이러한 형식을 줄여주는 것처럼 말이죠. vector v; vector::iterator iter = v.begin(); // 간단해진 타입명 auto iter = v.begin(); vector v2; for(auto i..

CS/C# 2021.12.10

[C#] foreach

이번에는 foreach문에 대해서 공부해보겠습니다. foreach 문이 왜 등장했을까요? 기존에 for, while, do~while 문으로 대체가 가능한데.. 그러다가 어떤 한 블로그의 말을 듣고 납득이 되었습니다. 그 말은 foreach문은 index범위를 벗어나는 위험성이 없다는 것입니다. 무슨말이냐면, 배열이나 컬렉션의 끝에 도달하면 자동으로 반복이 종료하게 되는데요. 만약에 foreach문을 사용하지 않고 기존에 알고 있었던 for문을 이용해서 구현했더라면 프로그래머의 실수로 인해 할당되지 않은 영역을 참조하는 경우가 발생할 수 있습니다. 이러한 경우가 바로 IndexOutOfRangeException 입니다. 정확히는 해당 범위 외부에 있는 인덱스를 사용해서 배열 또는 컬렉션의 요소에 액세스하..

CS/C# 2021.12.05