C#(33)
-
[C#] 부모 클래스와 자식 클래스 사이의 형변환을 해 보자! (is, as)
이 글은 책을 바탕으로 공부한 글입니다. 개요 개인적으로 생각하는 객체 지향의 꽃 중 하나는 업캐스팅(Upcasting)이라고 생각한다. 수많은 자식 클래스들이 있지만, 그 많은 클래스들을 부모 클래스 하나로 가리킬 수 있다는 것은 생산성에 정말 큰 영향을 미치는 것 같다. 처음 객체지향언어를 다룰 때는 당연히 나도 이게 무슨 의미인지 잘 알지 못했다. 내가 이해한 내용을 예시를 들면서 한 번 설명해보려고 한다. 다음과 같이 자식 클래스들이 있다고 하자. class Monster { public void Attack() { ... } } class Slime : Monster { public void LiquidAttack() { ... } } class Bubbling : Monster { public..
2022.03.21 -
[C#} new 와 sealed 키워드
*이 글은 책을 바탕으로 공부한 글입니다. 1. 부모 클래스의 메소드 숨기자! : new 키워드 부모 클래스로부터 상속 받은 멤버와 이름은 동일하지만 완전히 다른 새로운 멤버로 재정의하고 싶을 때 사용한다. 객체를 생성할 때 사용하는 new 키워드의 의미와는 다르다. 클래스를 작성하다 보면, 만들고 있는 메소드를 나중에 오버라이딩을 할 지 안 할지를 미리 생각한다는 건 쉬운 게 아니다. 왜냐하면, C#에서 오버라이딩을 하기 위해서는 부모 클래스의 메소드를 virtual으로 선언해야 하기 때문이다. 이런 부분까지 전부 설계를 신경써서 작성한다는 것은 경험이 많은 프로그래머가 아니면 어려울 것이다. 그래서 C#에서는 우리 같은 사람들을 위해서, 메소드 숨기기를 지원한다. class Monster { publ..
2022.03.21 -
[C#] 부모 클래스를 가리키는 Base 키워드와 생성자
base 키워드란? 자식 클래스에서 부모 클래스의 멤버에 접근할 때 사용한다. 이런 상황이 있을 수 있다. "부모 클래스와 자식 클래스 모두 동일한 이름의 변수가 있다면?" 이 경우에는 부모 클래스의 변수와 자식 클래스의 변수를 구분해줄 식별자가 필요하다. 이 때, base 키워드가 사용된다. class Monster { protected string name; protected int hp; protected int attackDamage = 1; } class Slime : Monster { protected int attackDamage; public Slime() { this.attackDamage = 5; Console.WriteLine("자식 클래스의 attackPower = {0}", thi..
2022.03.20 -
[C#] this( ) 생성자와 접근 한정자(Access Modifier)
*이 글은 책을 바탕으로 공부한 글입니다. this 생성자란? 자기 자신의 생성자를 가리킨다. 생성자들을 여러 개 만들다 보면, 생성자들 사이에서 코드가 중복되는 상황이 발생하곤 한다. 이런 부분을 해결하고 싶을 때 this( ) 생성자가 유용하게 사용된다. class Monster { string name; int hp; int damage; public Monster(string name) { Console.WriteLine("Monster(string name) 생성자 호출"); this.name = name; } public Monster(string name, int damage) : this(name) { // this(name)는 Monster(string name) 생성자를 호출함 Cons..
2022.03.18 -
[C#] 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy) + ICloneable 인터페이스
*이 글은 책을 바탕으로 공부한 글입니다. C#의 클래스 부분을 공부하고 있었다. 어떤 객체지향언어를 배우든 클래스와 생성자란 개념이 나왔고, 이것은 익숙하게 알고 있는 내용이었다. 이번에 정리할 글인 얕은 복사와 깊은 복사 또한 잘 알고 있는 내용이었지만, 복사 생성자를 사용할 일이 나에겐 잘 없었다. 그래서 나중에 막힘없이 사용하기 위해 이렇게 글을 포스팅할까 한다. 그 전에 참고로 알아두면 좋은 지식을 먼저 보자. C#에도 종료자(소멸자)는 존재한다. 나는 C#에 생성자만 존재하고 소멸자는 없는 줄 알았다. 하지만 존재했다. class Monster { ~Monster() // 소멸자 { ... } } 생성자와 다르게 오버로딩이 불가능하고, 매개변수를 받지 않는다는 점까지 C++의 소멸자와 성질이 ..
2022.03.18 -
[C#] 참조에 의한 매개변수 전달 (ref, out)
*이 글은 책을 바탕으로 공부한 글입니다. 1. 값에 의한 호출 (Call by value) 함수와 메소드를 호출할 때, 필요한 값들을 전달해주기 위해 매개변수에 값을 넣어 전달해 준다. 값 형식(Value type)은 매개 변수로 전달 시에 해당 인자의 값을 복사해서 전달 함수와 메소드에서 값을 리턴할 때도 마찬가지 이것을 값에 의한 호출(Call by value)이라고 함 두 매개 변수를 받아서 서로 값을 바꾸는 Swap() 함수에서 이런 예시가 자주 나온다. static void Swap(int x, int y) { int temp = x; x = y; y = temp; } 그리고 다음과 같이 사용을 해 본다. static void Main(string[] args) { int x = 3; int ..
2022.03.18