C# 객체지향

1 minute read

객체지향

일상에서 공통적인 특징을 가지는 것들을 포괄하는 상위 개념이 존재한다. 쉽게 말해서 동물, 식물 이런 것들이 해당한다.

이러한 것들은 구체적으로 대상이 특정되지 않은 추상적인 개념이라고 볼 수 있다.

이러한 추상적이고 포괄적인 개념이 객체지향의 핵심이라고 할 수 있다.


예를 들어 책을 생각해본다.

책이라면 가져야하는 공통적인 특징들에는 제목, 저자, 가격 등의 값으로 정해질 수 있는 속성들뿐만 아니라 펼치다, 읽다, 덮다 등의 행위들도 있다.

책
├──속성
│   ├──제목
│   ├──저자
│   └──가격
│
└──행위
    ├──펼치다.
    ├──읽다.
    └──덮다.


Class

프로그래밍에서는 포괄적이고 추상적인 개념을 클래스로 만들고 가질 수 있는 공통적인 특징들을 변수와 메서드로 만들 수 있다.

class Book() {
  string title;
  string author;
  int price;

  void Open(){}
  void Read(){}
  void Close(){}
}

클래스도 일종의 자료형으로 볼 수 있으며 이를 사용자 정의 자료형이라고 한다.

따라서 변수가 선언되는것과 마찬가지로 클래스 역시 ‘자료형’ ‘변수명’의 형태로 선언해서 사용되어진다.

Book nineAgeLife;

이렇게 클래스 타입으로 선언된 변수를 객체 또는 인스턴스라고 하며 타입이 실체화 되었다고 표현한다.

주의할점은 클래스가 참조형이라는 것은 이미 알고있다. 따라서 참조형 타입을 사용할 때 처럼 반드시 new 연산자로 메모리 할당을 해주어야한다.

Book nineAgeLife = new Book();

이렇게 책이라는 공통적인 특징을 정의한 Book 클래스를 만들었기 때문에 이제 ‘아홉살 인생’ ‘괭이부리말 아이들’ 등 다양한 책들을 인스턴스로 만들어 사용할 수 있다.

책이 한 두 권이라면 큰 문제가 아니겠지만 백권 천권의 책들을 관리해야한다면 매번 새로운 변수명과 메서드를 만드는 반복적인 작업을 해야하고 공통적으로 가져야할 부분에서 실수로 빠뜨릴 위험도 생길것이기 때문에 객체지향 프로그래밍 중 클래스화는 중요하면서 가장 기본이라고 볼 수 있다.


필드

클래스에 정의된 속성을 필드라고 한다.

생성된 객체들은 각각이 속성을 가지게 되며 다음과 같이 접근하여 사용한다.

Book nineAgeLife = new Book();
nineAgeLife.title = "아홉살 인생";
nineAgeLife.author = "위기철";

string title = nineAgeLife.title;

Console.WriteLine(nineAgeLife.title);

값을 채우거나 가져올 때는 동일한 타입이어야한다.


한정자

한정자는 클래스 내부의 변수나 메서드에 접근을 제한하는 역할을 한다.

using System;

namespace Bakcoding {

class Book() {
  private string title;
  protected string author;
  public price;

  void Open(){ Console.WriteLine(title) };
  protected void Read(){}
  public void Close(){}
}

class Program{
    static void main(string [] args)
    Book nineAgeLife = new Book();
    // 에러
    nineAgeLife.title = "아홉살 인생";
    // 접근 가능
    nineAgeLife.price = 10000;
  }
}
  • private

    한정자를 명시하지 않으면 기본적으로 private 상태이다. 클래스 내부에서만 접근이 가능하며 외부에서 접근시 에러가 발생한다.

  • protected

    상속 받은 자식 클래스에서만 접근이 허락된다.

  • public

    제한없이 접근이 가능하다.