[TIL] C# - 객체 지향 프로그래밍

MINO·2024년 4월 23일
0
post-thumbnail

2024-04-23
그동안 TIL 을 계속 써왔지만, 이 방향이 맞는지 긴가민가 했었다.
나만의 틀을 만들어 오늘의 키워드, 공부한 내용, TIL 마무리 및 내일 할 일 을 정리하였지만,
몇가지의 단점이 있었다.

  • 제목만으로 그 날 무슨 공부를 했는지 모른다는 점
  • 공부한 내용에 대한 비중이 비교적 적다는 점
  • 그 기술을 사용하게 된 앞뒤 상황을 모른다는 점

등의 이유로 TIL 의 틀을 바꾸기로 하였다.


C++ 과 C#

C++ 과 C# 은 모두 C 언어(절차 지향 프로그래밍 언어)에서 파생된 언어이다.
C++ 은 C 언어를 기반으로, 속도나 효율성의 저하 없이 C 언어를 개선함과 동시에 객체 지향 프로그래밍 기능을 추가한 언어이다.

C# 은 C++ 을 기반으로, 비주얼 베이직(visual basic) 의 편의성을 결합하여 만든 객체 지향 프로그래밍 언어이다.

절차 지향 프로그래밍 언어의 경우,
순서에 따라 절차대로 함수를 만들어 프로그래밍 하기 때문에 코드의 양이 많아지고, 관리하기가 어렵다.

반면, 객체 지향 프로그래밍 언어의 경우,
관련있는 데이터와 명령어를 하나로 묶어 객체라는 조립 단위를 만들고,
필요한 객체를 조립하는 방식으로 프로그램을 만들기 때문에 코드의 재사용과 관리 및 유지 보수가 쉽다.


객체 지향 프로그래밍(OOP)

Object-Oriented Programming.

특징

  • 캡슐화 (Encapsulation)

    • 관련된 데이터와 기능을 하나의 단위로 묶는 것
    • 클래스를 사용하여 정보를 은닉하고, 외부에서 직접적인 접근을 제한함으로써 안정성과 유지보수성을 높임
  • 상속 (Inheritance)

    • 기존의 클래스를 확장하여 새로운 클래스를 만드는 메커니즘
    • 부모 클래스의 특성과 동작을 자식 클래스가 상속받아 재사용할 수 있음
    • 코드의 중복을 줄이고, 클래스 간 계층 구조를 구성하여 코드의 구조화와 유지보수성을 높임
  • 다형성 (Polymorphism)

    • 하나의 인터페이스나 기능을 다양한 방식으로 구현하거나 사용할 수 있는 능력

    • 하나의 메서드 이름이 다양한 객체에서 다르게 동작할 수 있는 것

      • 오버로딩 : 동일한 이름의 메서드를 다양한 매개변수 목록으로 다중 정의
      • 오버라이딩 : 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 재정의
    • 코드의 가독성과 재사용성을 높임

  • 추상화 (Abstraction)

    • 복잡한 시스템이나 개념을 단순화하여 필요한 기능에 집중하는 것
    • 세부 구현 내용을 감추고 핵심 개념에 집중함으로써 코드의 이해와 유지보수 용이
  • 객체 (Object)

    • 클래스로부터 생성된 실체
    • 상태(데이터) 와 행동(메서드)을 가짐
    • 객체들 간의 상호작용을 통해 프로그램이 동작하고, 모듈화와 재사용성을 높임

클래스의 구성 요소

  • 필드 : 클래스에서 사용되는 변수, 객체의 상태를 나타내는 데이터를 저장

  • 메서드 : 클래스에서 수행되는 동작 정의, 객체의 동작을 구현하기 위해 사용

  • 생성자 : 객체를 초기화하는 역할, 객체가 생성될 때 자동으로 호출되며, 필드를 초기화

  • 소멸자 : 객체가 소멸될 때 호출되는 메서드, 메모리나 리소스의 해제


클래스와 객체 예시

  • 클래스 (붕어빵 틀) : 객체 (붕어빵)을 만들기 위한 틀.
    • 객체를 생성하기 위해서는 클래스를 사용하여 인스턴스를 만들어야 함
  • 객체 (붕어빵) : 클래스 (붕어빵 틀)로 만들어진 실제 붕어빵.
    • 클래스로부터 생성되며, 각 객체는 독립적인 상태를 가짐

구조체 VS 클래스

모두 사용자 정의 형식을 만드는 데 사용됨

  • 구조체는 값 형식이라, 스택에 할당되고 복사될 때 값이 복사됨

  • 클래스는 참조 형식이라, 힙에 할당되고 참조로 전달됨


코드로 알아보는 구조체와 클래스

Class Person1
{
	public string Name;
    public int Age;
    
    public void Print()
    {
    	Console.WriteLine("Name : " + Name);
        Console.WriteLine("Age : " + Age);
    }
}

Struct Person2
{
   public string Name;
   public int Age;
   
   public void Print()
   {
      Console.WriteLine($"Name : {Name}, Age : {Age}");
   }
}

Person1 p1 = new Person1(); // 참조 형식
p1.Name = "Kim";
p1.Age = 20;
p1.Print();

Person2 p2; // 값 형식
p2.Name = "Lee";
p2.Age = 25;
p2.Print();

위에서 알아봤듯이, 클래스와 구조체를 선언하는 방식이 다르다는 것을 확인할 수 있다.

TIL 마무리

2주차 과제 , 개인 프로젝트를 진행하다보니
코드가 너무 길어져 클래스로 구분해야할 필요를 느꼈다.

객체지향 프로그래밍의 장점을 제대로 활용하지 못하고 있는 것 같아 더 어렵게 느껴졌다.

Player - 상태 (HP, Gold, Lv) , 인벤토리 (Helmet, Armor, Weapon)
Dungeon - 난이도 (얻을 수 있는 골드, 입을 수 있는 피해량)
Shop - Helmet, Armor , Weapon (Price) - (Buy , Sell)

처럼 클래스로 묶을 수 있는 데이터를 정리한 뒤, 클래스화하여
객체지향 프로그래밍의 장점을 최대한 살려
개인 프로젝트를 완성하는 것이 목표이다.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글