본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 17.객체지향과 클래스

지금까지 C#의 기본적인 문법들을 배웠다.
그러나 지금까지 배운 C# 은 C# 문법을 사용했을뿐이지 사실상 C스타일의 절차지향 코딩과 더 가깝다

즉 class를 배우지 않으면 C#을 배운것이 아니다.

심화 강의부터는 Class, OOP등을 강의하도록 하겠다.



1. 객체 지향 프로그래밍 (object oriented programming), OOP


지금까지 배운 프로그래밍 방식은 절차지향 프로그래밍으로

각종 변수와 구조체등을 모듈화된 함수등을 사용하여 특정 절차를 거치도록하여 프로그램을 구성하였다.


그러나 프로그램이 커지면서 해당방식으로 프로그래밍 하는것이 힘들어졌고

세상이 구성된 그대로를 가져오다는 컨셉으로 객체지향 개념이 생겨나게 되었다.


그럼 여기서 객체 지향언어란 무엇인가?


세상은 객체와 객체의 상호작용으로 이루어져있다.

예를 들어 내가 TV를 본다고 하면

"내" 가 "TV"를 보는것이다

여기서 나랑 TV는 실제 사물이다.

보는것은 나와 TV의 상호작용이다


여기서 "내" 랑 "TV"를 객체(오브젝트) 라고 부른다


이러한 세상의 개념을 프로그래밍 방식으로써 적용한것이 C#이다



슈퍼 마리오 게임을 만든다고 가정하자.


슈퍼 마리오 게임은
마리오(캐릭터) 와 아이템, 블록, 적, 미사일등의
복합적으로 상호작용하는 게임이다.


여기서

여기서 상호작용하는 각각의 요소들이 전부 객체 이다.


그럼 클래스는 무엇인가?

클래스는 객체를 만들기 위한 틀이다. (흔히 붕어빵틀에 비교한다.)


예를 들어서 마리오라는 객체를 만들어야한다.

그러면 게임캐릭터 라는 틀(class)를 우선 만들어주어야한다.


그다음 게임캐릭터라는 틀로 마리오를 찍어내어 마리오라는 객체를 만든다.


만약 루이지라는 캐릭터를 추가하고 싶으면

이미 만들 게임캐릭터라는 틀로 루이지를 찍어내면 된다.



지금까지의 설명은 class와 객체를 개념적으로 설명한것이고

class를 프로그래밍 관점으로 보자면


데이터와 함수가 결합되어있는 내가만든 자료형(사용자 정의 자료형)이다.


내가 만든 자료형이라니 익숙하지 않은가!

저번시간에 이미 구조체를 하면서 구조체는 데이터들을 결합한 내가만든 자료형이라고 했다.

구조체의 개념에 함수를 추가한것이 클래스개념이다. 즉 클래스에는 정보(데이터) 뿐만 아니라 행위(함수) 까지 포함되어있다.



C#의 클래스로 마리오를 만들어 보자


using System;

namespace ConsoleApp1
{
class Character
{
public int hp;
public int speed;
public string name;
public void Move(int dir)
{
//
}
public void Jump()
{
//
}
public void Hit()
{
//
}
}
class Program
{
static void Main(string[] args)
{
Character mario = new Character();
mario.name = "슈퍼마리오";
mario.Jump();
}
}
}



구조체와 거의 유사하다.

똑같은 방식에 character 클래스안에 각종 함수를 추가하였다.

또한 해당 클래스를 main에서 사용할때 new를 이용하여 캐릭터를 만들었다 (이를 인스턴스화 했다고 한다.)


구조체를 사용할때와 똑같이 . 으로 사용한다.

구조체를 사용할때는 . 을 사용하고 뒤에 변수를 가져왔는데 class에서는 안에 있는 함수를 부를수가있게 되었다.


만약 함수를 안에 넣을수 없었다면 어떻게 될까?


뭐.. 지금처럼


using System;

namespace ConsoleApp1
{
class Character
{
public int hp;
public int speed;
public string name;
}
class Program
{
static public void Move(Character c,int dir)
{
//
}
static public void Jump(Character c)
{
//
}
static public void Hit(Character c)
{
//
}
static void Main(string[] args)
{
Character mario = new Character();
mario.name = "슈퍼마리오";
Jump(mario);
}
}
}

요런식으로 함수를 따로 분리해서 짯을것이다.

이렇게 해도 프로그램은 동작할것이다.


그럼에도 불구하고 왜 객체 지향 프로그래밍 사용하는 이유는 무엇일까?


그이유는 다양하게 있다.

우선 행동을 하는 주체(객체)와 행동(함수) 가 묶여 누가 무엇을 하는지 명확하다


기존의 방식 jump(mario) 보다 mario.jump() 가 마리오가 점프한다! 가 명확하다.

또한 상대 적도 점프 기능이 있다면

함수명을 이제 myJump() 와 enemyJump() 등으로 나누어지겠지만


객체 지향은 적 클래스를 만들고 해당 객체를 만들어


mario.jump();

enemy.jump();

와 같이 사용할것이다.


또한 어디서 잘못 되었는지 명확하다.


절차지향이라면


해당 순서에따라 어떤 기능이 잘못되면 그 함수가 잘못되었는지, 그 함수 위에서 어떤 데이터를 잘못써서 그 함수가 잘못되었는지

부르는 순서가 잘못되어 그 기능이 잘못 되었는지 알기가 힘들어지고 모든것을 다시 되짚어봐야한다.


그러나 객체지향을 사용하면 캐릭터에서 잘못되면 캐릭터 클래스와 관련한것만 고치면되어 디버깅이 쉽고

캐릭터의 요구사항이 변경되면 캐릭터클래스만 수정하면된다.

또 슈퍼마리오 게임을 만들다가 다른게임을 만들때도 캐릭터클래스를 가져와 재사용할수도 있다.


ps. 프로그래밍 하다보면 사실... 음..



아무튼 객체지향으로 프로그래밍을 함으로써 많은 이득을 얻을 수 있다.


이번 강의는 우선 개념적으로 객체지향 프로그래밍과 클래스를 알아보았다.

다음시간부터 본격적으로 클래스의 사용법에 대하여 알아보도록 하겠다.

728x90