객체란? (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
상속
- 기존의 클래스를 확장하여 새로운 클래스를 만드는 메커니즘
- 부모 클래스의 특성과 동작을 자식 클래스가 상속받아 재사용 가능
- 코드의 중복을 줄이고, 코드의 구조화와 유지보수를 용이하게 함
- 클래스 간의 계층 구조를 표현하여 코드의 구조를 명확하게 표현
- 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
☞ 오버로딩과 오버라이딩 : https://kkln2486.tistory.com/56
추상화
- 복잡한 시스템이나 개념을 단순화하여 필요한 기능에 집중하는 것을 의미
- 세부 구현 내용을 감추고 핵심 개념에 집중함으로써 코드의 이해, 유지보수를 용이하게 함
'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 |