본문 바로가기

전체 글

(59)
13. String과 StringBuilder 프로그래밍을 할 때에, 자료를 문자열로 관리하는 경우가 굉장히 많이 생기는데, 이전까지는 문자열을 char형의 배열을통해 관리했었다. char배열을 통한 문자열 관리에 있어, 구조적 한계 때문에 관리하기 어려운 부분이 생긴다. 이러한 문제점을 해결하기 위해 C#에서는 문자열을 string이라는 클래스를 통해 문자열을 관리한다. 오늘은 이 string과, 문자열을 관리하는 또 다른 클래스인 StringBuilder에 대해 알아볼 것이다. string은 앞서 설명했듯, 문자열을 관리하는 클래스이다. 그러나, string은 다른 자료형들과 같이 자료형 처럼 선언할 수 있다. 아래와같이 말이다. using System; namespace Favor { internal class Program { static v..
12. 객체지향의 특징 이전에 다룬 적 있던 객체지향의 특징에 대해 다시 한 번 자세히 키워드로 알아보려고 한다. 객체지향에는 4대특징이라 불리우는 것이 있다. 첫 째로는 '캡슐화' 이다. 캡슐화란 객체를 상태와 기능으로 묶는 것을 의미하며, 이렇게 묶인 객체는 객체 내부의 상태와 기능을 숨기고 허용한 상태와 기능에만 접근을 허용하는 것이다. 이렇게 캡슐화 된 객체들은 서로의 정보에 접근 및 수정하는 것이 제한적이게 되고, 이와 같은 특성은 각 객체들간의 의존도는 낮아고, 자율성은 높이는 결과를 불러온다. 서로 섞일 위험은 줄이면서, 각 객체들이 가진 고유한 기능들이 각각 철저히 분리되어있으면 있을 수록, 유지보수가 굉장히 용이해진다. 각 정보와 기능들의 세분화가 가능해지기 때문에, 어느 부분에서 문제를 봉착했는지 알기 쉽고,..
11. 인터페이스 (Interface) 앞서, 추상 클래스와 추상 함수에 대해 알아봤었다. 이번에 다룰 인터페이스는 추상 클래스와 굉장히 유사한 개념이지만, 다른 부분이 분명히 존재하는 개념이다. 그렇기에 어떤 부분이 다른지, 어떻게 사용하는지에 대해 확실히 알아보고자 한다. 추상 클래스는 실체는 없어도 어엿한 부모였으며, 추상 함수 역시 실체는 없지만 부모가 자식에게 이렇게 하도록 해라 라고 하는 지침이었다. 이러한 특징이 있기에 추상 클래스도 추상 함수도 상속받은 자식 클래스와의 관계가 뚜렸했으며, 서로간의 유대가 깊었다. 이번에 배울 인터페이스는 추상 클래스와는 사뭇 다른 느낌이다. 인터페이스도 마찬가지로 실체가 없는 점에서 추상 클래스와 같다. 인터페이스 역시 추상 클래스 처럼 함수를 선언하고, 정의는 할 수 없으며, 인터페이스를 상속..
10. 추상 클래스(Abstract Class) 클래스 상속을 통해 여러 기능들을 상속시키면서 봉착하는 문제는 하나 더 있다. 9. 가상함수와 오버라이드를 다룰 때 만났던 문제는, 부모와 비슷하지만 달라질 필요가 있는 기능에 대해서 였고, 이를 가상함수와 오버라이드를 통해 선택적으로 부모의 특성을 그대로 물려받거나 재정의해서 사용할 수 있었다. 그렇다면 오늘 만나볼 문제는 무엇일까? using System; namespace Favor { class Item { protected int index; protected float weight; public virtual void Use() { Console.WriteLine("아이템을 사용합니다."); } } class Portion : Item { public override void Use() { C..
9. 가상 함수와 오버라이드 (Virtual & Override) 8. 클래스 상속에서 배운대로 클래스를 상속시키면서 생기는 문제가 있다. 자식 클래스는 부모 클래스의 성질을 온전히 물려받게 되고, 거기서 확장되는 개념을 추가로 정의하게 되는데, 그렇다면 자식 클래스가 부모 클래스의 성질 중 하나를 상황에 맞게 변경 혹은 확장시킬 수는 없을까? 라는 문제이다. 예를들어, 아래와 같은 상속 클래스들이 있다고 가정해보자. using System; namespace Favor { class Vehicle { public void Enter() { Console.WriteLine("탈것 안에 들어간다.");} } class Bike : Vehicle { public void BikeEnter() { Console.WriteLine("오토바이에 올라탄다."); } } } 위와 ..
8. 클래스 상속 우리는 객체지향 프로그래밍을 하면서 많은 클래스를 만들고, 이를 통해 다양한 객체들을 만들어 상호작용 시킨다. 이 때, 서로 비슷한 클래스거나, 서로 공유하는 부분이 많은 클래스들이 생기는 경우가 있다. 자동차를 예로 들어보자. 자동차의 종류는 여러가지이다. SUV도 있고, 트럭도 있고, 승용차도 있다. 이 자동차들은 모두 바퀴가 달려있으며, 엔진이 있고, 시동거는 기능, 엑셀 기능 등 여러 기능과 요소들이 공통되어있다. 이런 경우에, 우리는 아래와 같이 하나하나 전부 다른 클래스들로 만들었어야 했다. using System; namespace Favor { class SUV { int wheel; string engine; float oil; void Accel() { Console.WriteLine(..
7. 프로퍼티(Property) 우리가 객체지향 프로그래밍 언어인 C#을 통해 코딩하면서, 클래스의 사용은 불가피하다. 그리고 객체지향에서는 정보은닉이 굉장히 중요하다. 객체지향에서는 여러 객체들이 서로의 정보를 공유하면서 그 상호작용을 통해 프로그램을 완성시키는 것이기 때문에 상호간의 데이터 공유가 활발해지면서 생기는 메모리 침범현상등의 문제가 발생할 수 있다. 예를 들면, 접근해야 할 값이 아닌 곳에 접근하여 사용자가 식별할 수 없는 임의의 공간에 있는 임의의 자료의 값을 수정하는 등의 문제는, 고치는 것은 물론이고, 어디에서 문제가 발생했는지를 찾는 것 조차 어려워진다. 이렇기 때문에 우리가 class를 통해 객체의 정보를 꾸릴 때는 정보의 은닉이 필수불가결하다. 그러면 어떻게 객체의 정보를 은닉하는 것이 좋을까? 우리가 객체의 ..
6. 정적 멤버 (static) 클래스를 통해 여러 객체들을 만들다 보면, 하나의 클래스를 통해 생성된 여러 객체들에게 서로 공유가 가능한 데이터를 부여해야 할 때가 있다. 예를 들면, Monster 클래스를 통해 생성된 몬스터들의 수를 파악하고 싶을 때라고 해보자. 이 때, 생성될 때 마다 임의의 변수 monsterCount를 누적시켜 파악하려고 할 때의 코드의 예시를 만들어보자. using System; namespace Favor { class Monster { public int monsterCount; public Monster(){ monsterCount++; } } internal class Program { static void Main(string[] args) { Monster mon1 = new Monster(); ..