C#

객체지향 프로그래밍의 특징

잼잼재미 2023. 11. 8. 10:07

객체란? (Object)



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

 

 

객체지향 설계원칙(SOLD 원칙)


SRP (Single Responsiblilty Principle, 단일책임의 원칙)


  • 하나의 클래스는 하나의 책임만 가짐
  • 너무 많은 기능을 넣으면 안됨
  • 각자의 SRP 기준은 다를
  • 변경사항이 있을 때, 애플리케이션의 파급 효과가 적으면 SRP 원칙을 잘 따른 것으로 볼 수 있음

 

 

OCP (Opne Closed Principle, 개방폐쇄의 원칙)


  • 확장에 대해서는 개방적이고, 수정에 대해서는 폐쇄적 (데이터 직접 접근 x)
  • 유연한 코드 수정, 쉽게 확장할 수 있게 설계
  • 객체를 직접 수정하는 것을 제한



LSP (Liskov Substitution Principle, 리스코프 치환 원칙)


  • 프로그램의 정확성을 깨지 않으면서 하위 타입의 인스턴스로 변환
  • 하위클래스는 인터페이스의 규약을 잘 지켜야 함
  • 자식 객체는 부모 객체를 완전히 대체할 수 있어야 함

 


ISP (Interface Segragation Principle, 인터페이스 분리 원칙)


  • 범용 인터페이스 하나보다는 특정 클라이언트를 위한 여러 개의 인터페이스 분리가 좋다.

 

 

DIP (Dependency Inversion Principle, 의존관계 역전 원칙)


  • 구체화가 아니라 인터페이스에 의존
  • 구현 클래스가 아니라 인터페이스에 의존

 

 

캡슐화



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

☞ 접근제한자 : https://kkln2486.tistory.com/53

 

접근 제한자 (public, private, protected)

클래스, 필드, 메서드 등의 접근 가능한 범위를 지정하는 키워드 클래스의 캡슐화를 제어하는 역할 public : 외부에서 자유롭게 접근이 가능 private : 같은 클래스 내부에서만 접근 가능 protected : 같

kkln2486.tistory.com

 


상속



 - 기존의 클래스를 확장하여 새로운 클래스를 만드는 메커니즘

 - 부모 클래스의 특성과 동작을 자식 클래스가 상속받아 재사용 가능
 - 코드의 중복을 줄이고, 코드의 구조화와 유지보수를 용이하게 함

 - 클래스 간의 계층 구조를 표현하여 코드의 구조를 명확하게 표현

 - C#에서는 단일상속만 지원 :

    * 단일상속 : 하나의 자식 클래스가 하나의 부모 클래스만 상속받음
 - 인터페이스 상속은 다중상속 지원

// 부모 클래스
public class Animal
{
    public string Name { get; set; }
    public int Age { get; set; }

    public void Eat()
    {
        Console.WriteLine("Animal is eating.");
    }

    public void Sleep()
    {
        Console.WriteLine("Animal is sleeping.");
    }
}

// 자식 클래스
public class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine("Dog is bark.");
    }
}

public class Cat : Animal
{
    public void Sleep()
    {
        Console.WriteLine("Cat is sleeping.");
    }

    public void Meow()
    {
        Console.WriteLine("Cat is meow.");
    }
}

// 사용 예시
Dog dog = new Dog();
dog.Name = "Bobby";
dog.Age = 3;

dog.Eat();      // Animal is eating.
dog.Sleep();    // Animal is sleeping.
dog.Bark();     // Dog is bark.

Cat cat = new Cat();
cat.Name = "KKami";
cat.Age = 10;

cat.Eat();		// Animal is eating.
cat.Sleep();		// Cat is sleeping.
cat.Meow();		// Cat is meow.

 * Animal class와 Cat class 모두 Sleep() 함수 존재함으로, Cat class에 있는 Sleep()함수가 호출된다.

 * 다형성을 유지하는 방법이 아님. (좋은 방법이 아님) -> virtual, abstract, override 사용해야 함.

 

 

클래스의 상속


기본 생성자

 - 부모 클래스 생성자 -> 자식 클래스 생성자 실행

class Parent
{
    public Parent() 
    {
        Console.WriteLine("부모 생성자");
    }
}

class Child : Parent 
{
    public Child()
    {
        Console.WriteLine("자식 생성자");
    }
}

Child child= new Child();
// 출력
// "부모 생성자"
// "자식 생성자"

 

 

매개변수가 있는 생성자

 - 매개변수가 있는 부모 클래스의 생성자가 실행되지 않고, 기본 생성자가 실행

public class Parent
{
    public Parent()
    {
        Debug.Log("부모 생성자");
    }

    public Parent(string str)
    {
        Debug.Log($"매개변수가 있는 부모 생성자 {str}");
    }
}

public class Child : Parent
{
    public Child()
    {
        Debug.Log("자식 생성자");
    }

    public Child(string str)
    {
        Debug.Log($"매개변수가 있는 자식 생성자 {str}");
    }
}

Child child = new Child("Test");

// 출력
// "부모 생성자"
// "매개변수가 있는 자식 생성자 Test"

 

 

매개변수가 있는 부모 클래스 생성자 호출

public class Parent
{
    public Parent()
    {
        Debug.Log("부모 생성자");
    }

    public Parent(string str)
    {
        Debug.Log($"매개변수가 있는 부모 생성자 {str}");
    }
}

public class Child : Parent
{
    public Child()
    {
        Debug.Log("자식 생성자");
    }

    public Child(string str) : base(str)
    {
        Debug.Log($"매개변수가 있는 자식 생성자 {str}");
    }
}

Child child = new Child("Test");

// 출력
// "매개변수가 있는 부모 생성자 Test"
// "매개변수가 있는 자식 생성자 Test"

 

 

다형성



 - 하나의 인터페이스나 기능을 다양한 방식으로 구현, 사용 가능
 - 하나의 메서드 이름이 다양한 객체에서 다르게 동작할 수 있도록 함

 - 가상 메서드와 추상 메서드를 통해 구현
 - 오버로딩과 오버라이딩을 통해 구현

 

☞ 가상 메서드와 추상 메서드 : https://kkln2486.tistory.com/55

 

가상 메서드 (Virtual), 추상 메서드(Abstract)

● 가상 메서드 (Virtual) - 가상 메서드는 기본적으로 부모 클래스에서 정의되고 자식 클래스에서 재정의 할 수 있는 메서드 - 자식 클래스에서 부모 클래스의 메서드를 변경하거나 확장할 수 있

kkln2486.tistory.com

☞ 오버로딩과 오버라이딩 : https://kkln2486.tistory.com/56

 

오버로딩(overloading)과 오버라이딩(overriding)

● 오버로딩(overloading) - 동일한 메서드 이름을 가지고 있지만, 매개변수의 개수, 타입 또는 순서가 다른 여러개의 메서드를 정의하는 것 public class Calculator { public int Add(int a, int b) { return a + b; } pu

kkln2486.tistory.com

 


추상화



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

'C#' 카테고리의 다른 글

프로퍼티 (Property)  (0) 2023.11.08
접근 제한자 (public, private, protected)  (0) 2023.11.08
배열과 컬렉션(Collection)  (0) 2023.11.07
Random  (0) 2023.11.07
do-while문  (0) 2023.11.07