C#의 기초 - 10 (객체지향, 클래스)

krokrai·2025년 12월 22일

객체지향, 클래스

개요

  • 객체지향 프로그래밍과 class
  • 객체지향의 원칙

객체지향 프로그래밍과 class

  • 프로그래밍의 방식 중 하나이며, 객체(object)들끼리 상호작용하며, 인간의 관점에 가까운 방식입니다.
  • 객체지향 프로그래밍으로 유명한 언어로 JAVA가 있으며, 비슷한 방식으로 프로그래밍을 합니다.
  • 객체 지향 프로그래밍을 할때 자주 사용하는 명령어는 classstruct와 다르게 참조 타입형식입니다.

void main()
{
	Human human = new Human();
    human.thirst = 50;
    // human.Hungry = 20; private로 선언된 메소드(동작)나, 필드(데이터)에 접근 할 수 없습니다.
    human.DrinkWater(20);
    Human human2 = human;
    
    human2.DrinkWater(20);
}

class Human
{
	private int health = 100;
    private int hungry = 50;
    public int thirst = 20;
    
    public void DrinkWater(int value)
    {
    	thirst += value;
        Console.WriteLine($"물을 마셔 {value}만큼 갈증이 해소 됬습니다. 현제 갈증 상태는 {Thirst}입니다.");
    }
    
    public void EatFood(int value)
    {
    	hungry += value;
        Console.WriteLine($"먹을 것을 먹어 {value}만큼 배고픔이 해소됬습니다.")
    }
}
물을 마셔 20만큼 갈증이 해소 됬습니다. 현제 갈증 상태는 70입니다.
물을 마셔 20만큼 갈증이 해소 됬습니다. 현제 갈증 상태는 90입니다.
  • 위와 같이 복사를 하게 될 경우, 참조 방식(주소)으로 작동하여, 원본 값에 영향을 줍니다.

객체지향의 원칙

캡슐화

  • 어떤 기계가 작동할때 필요로 하는 부분은 사용자에게 알리거나 사용할 수 있도록 열어두고, 필요 이상의 접근은 하지 못하게 감추고나 접근이 힘들게 만들어 둡니다.
  • 이렇든 캡슐화란, 어떤 기계를 만드는 것으로 작동에 필요한 데이터(필드)나 내부에서 작동하는 장치(메서드)들을 만들고 필요하면 사용할 수 있게 외부에 공개(버튼 같은 사용자가 이용할 수 있는 부분)하거나, 비공개(장치가 움직이기 위해 필수적인 데이터, 핸드폰의 경우 핸드폰 고유번호 같은)처리 하여, 부분적인 노출(은닉)할 수 있습니다.

상속

  • 상위 객체가 갖이고 있는 필드나 메서드를 받아서 사용할 수 있습니다. 예를 들어 상위 객체에는 HP가 있다고 가정하였을 때 상속 받은 하위 객체에는 HP가 없지만 HP에 접근할 수 있습니다.

    접근 제한자에 의해서 접근 범위가 결정됩니다.
    private의 경우에는 자신을 제외한 모든 객체에 대한 접근 거부
    protected의 경우에는 자신과 자신을 상속 받는 하위 객체에게만 접근 허용
    public의 경우에는 자신을 포함한 모두에게 접근 허용입니다.

추상화

  • 객체의 본질적이고 중요한 부분만을 만들고 그 외에 부과적인 부분은 하위 객체 등에서 세부적인 구현을 하게 만드는 방식이며, 상위 객체일 수록 너무 많은 것을 세부 구현하게 될 경우, 하위 객체에서 꼬임이 발생하거나, 단일 객체가 너무 많은 책임을 져 객체 한개가 수정 등으로 문제가 생겼을때 하위 또는 사용하는 다른 객체에서 문제가 발생할 수 있습니다.

다형성

  • 체의 속성이나 기능이 상황에 따라 바뀔 수 있는 성질로, 상속 받은 하위 객체에서 불필요하는 등의 경우가 생겼을때 불필요한 부분을 강제로 바꾸는 등을 할 수 있는 성질입니다.

SOLID

  • S: 단일 책임 원칙 (Single Responsibility Principle)
    • 클래스(객체)는 단 하나의 책임만 가져야합니다. 즉, 하나의 클래스는 하나의 기능만을 담당하여, 하나의 책임을 수행하는데 집중되도록 클래스를 개별적으로 설계하는 원칙입니다.
  • O : 개방 페쇄 원칙 (Open Closed Priciple)
    • 확장에 열려 있어야 하며, 수정에는 닫혀 있어야 합니다. 수정보다는 추가적인 코드를 작성하여, 기능을 추가할 수 있어야 한다는 원칙입니다.
  • L : 리스코프 치환 원칙 (Listov Substitution Priciple)
    • 자식 객체는 언제나 부모 타입으로 교체될 수 있어야 합니다. 다형성의 특징을 이용하기 위해 상위 클래스 타입으로 객체를 선언하여, 하위 클래스의 인스턴스를 받은 상태에서 부모의 메서드를 사용해도 프로그램이 동작해야 한다는 원칙입니다.
  • I : 인터페이스 분리 원칙 ( Interface Segregation Principle)
    • 하나의 큰 인터페이스보다 용도에 맞는 인터페이스를 잘게 분리해야 합니다. 프로그램의 유지보수에서 발생할 수 있는 인터페이스의 분리나 수정으로 인한 많은 양의 코드 수정을 막기 위해 불필요한 정보까지 갖일 수 있는 하나의 거대한 인터페이스보다, 상황에 맞도록 소규모로 분리된 인터페이스를 사용할 수 있어야 한다는 원칙입니다.
  • D : 의온 역전 원칙 ( Dependency Inversion Principle)
    • 고수준의 모듈은 저수준 모듈의 구현에 의존해선 안됩니다. 객체가 객체를 참조하거나, 의존 관계를 맺을 때, 세부구현된 객체 보다 상위 객체를 참조함으로서, 세부구현된 클래스의 변환 발생시에도 유연하게 동작핤 ㅜ있도록 구조를 맺은 원칙입니다.
profile
게임을 좋아하고 만들고 싶은 개발자 지망생입니다.

0개의 댓글