프로그래밍 언어/C#

객체 지향 프로그래밍(Object Oriented Programming)

gcreators 2024. 9. 4. 16:55

OOP(Object Oriented Programming) 라고 불린다

 

프로그래밍엔

절차 지향과 객체 지향 두가지로 나뉘어 지는데

 

절차 지향 프로그래밍은 컴퓨터의 관점에서 생각하고 데이터를 처리하도록 짜여져 실행 속도가 빠르다는 점이 있으며

대표적으로 C가 해당되고

 

객체 지향 프로그래밍은 정보와 기능을 하나로 묶어서 생각하게 된다

기능별로 묶어 모듈화를 시킴으로서 같은 기능을 중복으로 연산하지 않으며

모듈을 재활용하기에 데이터처리량을 줄였고 C#, Java등이 이에 해당된다.

 

객체 지향에는 몇가지 특징이 있는데

캡슐화 (Encapsulation) 가 그중 핵심이다

객체를 캡슐로 만들어서 그 내부를 보호하고 볼 수 없게 한다(은닉)

실제로 캡슐에 든 약을 보면 우리가 그 약의 안이 어떻게 되어있는지 어떠한 성분을 가졌는지는 볼 수가 없지만

이 약이 어떤 약인지는 알고 사용을 하는 것 처럼

캡슐화가 진행되면 클래스(Class)의 모양 그대로 만들어진 이 객체(Instance)의 내부를 알 수는 없지만 클래스에 만들어 놨던 그 기능을 이용 하는 것에는 문제가 없다.

 

Class에 Field(멤버 변수 - int, string, float 등)와 Method(맴버 함수)를 구현하고 

이를 캡슐화 하여 Field에 대한 외부로부터의 접근을 제한 하는 것이 기본적인 구조이다.

Method를 잘 짜서 이를 활용할때 그 내부가 어떤 구조인지를 생각하지 않고도 동작 시킬 수 있도록 만드는 것이

잘 짜여진 클래스라고 할 수 있다.

 

접근 지정자

public - 아무대서나 접근 가능

private(default) - 클래스 내부에서만 접근 가능

protected - 상속때 자세히 다룰 예정

internal - 같은 컴파일 내에서 접근 가능

 

//Program.cs

class Program
{
    static void Main()
    {

        Character player = new Character(); //Character 클래스 동적할당, player라는 객체 생성
        //Character npc = new Character(); //C#에서는 객체를 사용하려면 무조건 동적할당을 해야 한다.
        //Character npc = null; 동적할당을 하지 않을거면 null을 붙여놔야함
        player.hp = 100;
        player.Damage(10);
        Console.WriteLine("Player.hp: " + player.GetHP());
        //player.mp = 10;

    }
}
//Character.cs

class Character
{
    public int hp = 10;
    private int mp = 0; 
    protected int exp; 
    internal int lv;
}

public void Damage(int _dmg)
{
    if (_dmg > 100) return;//안정적인 데이터 처리 가능
    hp -= _dmg;
    if (hp < 0) hp = 0;
}

두개의 클래스 파일을 만들어준 뒤

각 접근 지정자를 사용, 그리고 객체를 생성했다.

이 상태로 public인 hp에는 접근이 가능한 반면

private인 mp에는 접근이 불가한 것을 확인 할 수 있다.

 

이렇게 만들어낸 객체의 변수에 직접적으로 접근 하는 것을 차단할 수 있는데

간접적으로 함수를 이용해 접근을 하도록 코드를 짜는 것이 옳은 방향이다.

 

Damage라는 함수를 만들어서 이를 활용해 hp 혹은 mp등 변수에 접근 할 수 있도록 한다.

 

변수에 직접적으로 접근을 할 수 있다면 개발자의 실수나 혹은 사용자가 모종의 방법을 통해

변수에 있어선 안될 값을 주게 되어 프로그램이 터질 수 있는데

함수를 이용해 이를 처리하면 그러지 않도록 예외처리를 하여 미연에 이를 방지 할 수 있다는 장점이 있다.

 

예를들자면

게임에서 hp 같은 경우에는 함부로 사용자가 접근해서 조정하게 될 경우 문제가 생길 가능성이 높을 것이다.

그러니까 hp 같은 경우엔 private를 사용하여 접근을 제한시키고 hp에 대한 조정을 Damage / heal 등 hp를 다루는 method를 잘 만들어 두는 것이 좋을 것이다.

 

이렇게 Field 와 Method 를 잘 만들어둔 클래스는 나중에 해당 파일만 따로 가져가서도 활용 할 수 있어

생산성이 높아지는 결과를 만들어 낼 수 있다.

 

 

 

Getter / Setter

 

그런데 변수에 직접적인 접근을 막는 것은 좋은데

프로그램에 따라서는 변수 자체에 접근을 해야 할 필요가 있지는 않을까?

 

예를 들어 hp를 조정하는 method는 만들어 뒀는데

우리 눈에 hp를 표시해야할 때는 어떻게 해야하지?

 

그래서 나온 것이 바로 Getter와 Setter이다.

//Character.cs


    public void SetHP(int _hp)
    {
        hp = _hp;
    }

    public int GetHP()
    {
        return hp;
    }

이렇게 hp에 대한 접근을 제한적으로 할 수 있게 해주는 함수를 만든다면

hp라는 변수 자체를 변형시키는 것은 예외처리로 비정상적인 변형은 막아내고

변수 값은 hp를 return시켜 받아 화면에 출력하는 등의 형태로 활용 할 수 있을 것이다.

 

 C#에서는 property 라는 기능을 제공해주는데

//Character.cs


    // property
    public int MP
    {
        set { 
            mp = value;
            if (mp > 99) mp = 99;
        }
        get { return mp; }
    }

Getter와 Setter의 귀찮음을 아주 간편하게 해결해버리니 C#을 이용할 땐 이쪽을 잘 활용 하도록 하자

'프로그래밍 언어 > C#' 카테고리의 다른 글

상속(Inheritance)  (0) 2024.09.05
생성자(Consturctor)와 소멸자(Destructor)  (0) 2024.09.05
Garbage Collection(가비지 컬렉션)  (3) 2024.09.04
Namespace  (0) 2024.08.30
String(문자열)과 활용  (0) 2024.08.30