객체지향
- 기존 코딩에서 기능이 늘어나면 cs 가독성이 떨어지고, 코드가 길어짐
- 나중에 git을 통해 한파일을 여러명이 동시에 작업하면 충돌이 많이 일어남
- 기존에 컴퓨터에게 명령을 내리는 방법이 이상하다 → “”저기에 있는 차를 전진시켜” = 지시자가 있고, 항상 상태와 동작을 전부 다 관리해야 함, 자료형으로만든 변수는 , 그저 데이터 덩어리에 불과함
- 구조체를 구성하는 요소들과 조작하는 부분들이 따로 놀아서 복잡함
- main문이 너무 많은 명령을 책임지고 있음
- 이에 개발자들이 고민을해서 속성과 + 기능을 합치자! → 그걸 정하는 객체를 정의하자
- 객체지향은 기존 절차지향 과 달리, 객체가 중점임
- 객체 : 데이터(속성)와 메서드(기능)를 가진 독립적인 소프트웨어 단위이다
- 목표: 객체 간의 유기적인 상호작용을 통해 프로그램을 구성함으로써, 코드의 재사용성, 유지보수성, 확장성을 높이는 것을 목표로 합니다
객체지향의 4대 요소
1. 캡슐화 (Encapsulation)
- 정의: 관련된 데이터(속성)와 그 데이터를 처리하는 메서드(기능)를 하나로 묶고, 외부로부터 객체의 내부 구현을 숨기는 것(정보 은닉)입니다.
- 목적: 데이터에 대한 직접적인 접근을 막고, 정해진 메서드(Public 인터페이스)를 통해서만 접근하도록 하여 데이터의 무결성(Integrity)을 보호하고, 객체 간의 결합도를 낮춥니다.
2. 상속 (Inheritance)
- 정의: 기존 클래스(부모/상위 클래스)의 속성과 기능을 새로운 클래스(자식/하위 클래스)가 물려받아 사용하는 것입니다.
- 목적: 코드를 재사용하여 중복을 줄이고, 공통 기능을 상위 클래스에 정의함으로써 유지보수를 용이하게 하며, 클래스들 간의 계층적 관계를 구축합니다.
- 예: '동물' 클래스를 상속받아 '강아지', '고양이' 클래스를 만들면, '동물'의 먹다() 기능을 재사용할 수 있습니다.
3. 추상화 (Abstraction)
- 정의: 객체들의 공통적인 특징(속성 및 행위)을 간추려 정의하는 과정이며, 불필요한 세부 정보는 숨기고 사용자에게 꼭 필요한 핵심 기능만 노출하는 것입니다.
- 목적: 복잡성을 줄이고, 객체의 공통적인 인터페이스를 정의하여 시스템을 단순화하고 모델링의 효율성을 높입니다.
- 예: '자동차' 객체에서 운전자에게 필요한 것은 '시동 켜기', '가속' 기능이며, 내부 엔진의 복잡한 동작 원리는 추상화되어 숨겨집니다.
4. 다형성 (Polymorphism)
- 정의: '여러 가지 형태를 가질 수 있는 성질'을 의미하며, 하나의 메서드나 객체가 상황에 따라 다르게 동작하는 것입니다.
- 구현 방법:
- 오버로딩 (Overloading): 같은 클래스 내에서 메서드 이름은 같으나, 매개변수의 개수나 타입이 다르게 정의됨.
- 오버라이딩 (Overriding): 상위 클래스의 메서드를 하위 클래스에서 같은 이름, 같은 매개변수로 재정의하여 다르게 동작하게 함.
- 목적: 코드를 유연하게 만들고, 상위 클래스 타입의 변수로 하위 클래스의 인스턴스를 참조하여 다양한 객체를 동일하게 처리할 수 있게 합니다.
- 예: '동물' 타입의 변수가 '강아지' 인스턴스를 가리키든 '고양이' 인스턴스를 가리키든, 울다() 메서드를 호출하면 각 객체의 고유한 소리를 냅니다.
클래스
- 클래스는 객체지향 프로그래밍의 핵심 요소로 객체를 만들기 위한 설계도이다
- 클래스는 기본적으로 참조형이며 기존 스택이라는 메모리가 아닌 힙이라는 메모리에 할당된다
- 클래스 내부의 변수는 그 값이 저장되는것이 아닌 변수의 주소가 힙에 저장된다
- 클래스의 인스턴스가 다른 변수나 메서드에 전달되면 그 주소가 복사되어 보내지는 방식이라 두 변수가 같은 객체를 가리키게 된다 그래서 변수가 수정되면 다른변수에도 그 영향을 미친다
구조체와 클래스의 차이
| 특징 | 구조체 (struct) | 클래스 (class) |
| 형식 분류 | 값 형식 (Value Type) |
참조 형식 (Reference Type)
|
| 메모리 위치 | 주로 스택 또는 포함하는 타입 내부에 인라인 할당 |
힙에 할당되며, 변수는 그 참조(주소)를 가짐
|
| 할당/전달 | 값 복사 (데이터 전체 복사) |
참조 복사 (주소만 복사)
|
| 상속 | 다른 구조체나 클래스를 상속할 수 없음 |
다른 클래스 상속 가능
|
| 기본 생성자 | 명시적인 매개변수 없는 생성자 정의 불가능 (컴파일러가 자동 제공) |
명시적인 매개변수 없는 생성자 정의 가능
|
| null 할당 | 기본적으로 null을 할당할 수 없음 (Nullable<T>를 사용해야 함) |
null 할당 가능 (참조가 없음을 의미)
|
클래스의 구성요소
| 구성 요소 | 설명 | C# 예시 |
| 필드 (Field) | 객체의 상태를 저장하는 변수 (데이터) |
private string name;
|
| 속성 (Property) | 필드에 안전하게 접근하는 수단 (데이터 읽기/쓰기 제어) |
public int Age { get; set; }
|
| 메서드 (Method) | 객체가 수행할 수 있는 행위 (기능/로직) |
public void Run() { ... }
|
| 생성자 (Constructor) | 클래스의 인스턴스를 만들 때(초기화) 호출되는 특별한 메서드 |
public Dog(string n) { name = n; }
|
프로퍼티
프로퍼티는 다시말해, 외부에 노출될 필요가 없는 멤버변수를 정보은닉 시켜주는 동시에
외부와 소통할 일이 있을 때 겟셋을 통해 직접적인 접근을 제공하는 대신 필터도 해줌
프로퍼티를 이용하는 게 퍼블릭 보다 좋은점 →겟만 존재하면 읽기전용, 셋에 필터옵션을 넣어 거름망 가능

SOLID 원칙
- 객체지향에서 더 체계적으로 프로그래밍을 하기 위해 고안된 원칙이다
S : 단일 책임 원칙 (Single Responsibility Principle)
- 클래스(객체)는 단 하나의 책임만 가져야 한다. 즉, 하나의 클래스는 하나의 기능 담당하여 하나의 책임을 수행하는데 집중되도록 클래스를 개별적으로 설계하는 원칙입니다.
O : 개방 폐쇄 원칙 (Open Closed Priciple)
- '확장에 열려있어야 하며, 수정에는 닫혀있어야 한다.' 기능 추가시 기존의 코드를 수정하기보다 추가적인 코드를 작성해 기능을 추가할 수 있어야 한다는 원칙입니다.
L : 리스코프 치환 원칙 (Listov Substitution Priciple)
- 자식 객체는 언제나 부모 타입으로 교체될 수 있어야 한다. 다형성의 특징을 이용하기 위해 상위 클래스 타입으로 객체를 선언하여 하위 클래스의 인스턴스를 받으면, 상태에서 부모의 메서드를 사용해도 프로그램이 동작해야 한다는 원칙입니다.
I : 인터페이스 분리 원칙 (Interface Segregation Principle)
- 하나의 큰 인터페이스보다 용도에 맞는 인터페이스를 잘게 분리해야 한다. 프로그램의 유지보수에서 발생할 수 있는 인터페이스의 분리나 수정으로 인한 많은 양의 코드 수정을 막기 위해 불필요한 정보까지 가질 수 있는 하나의 거대한 인터페이스보다, 상황에 맞도록 소규모로 분리된 인터페이스를 사용할 수 있어야 한다는 원칙입니다.
D : 의존 역전 원칙 (Dependency Inversion Principle)
- 고수준의 모듈은 저수준 모듈의 구현에 의존해선 안 된다. 객체가 객체를 참조하거나 의존 관계를 맺을 때, 세부구현된 객체보다 상위 객체를 참조함으로서, 세부구현된 클래스의 변화 발생 시에도 유연하게 동작할 수 있는 구조를 맺는 원칙입니다.
'C# > 객체지향 활용과 응용 개발' 카테고리의 다른 글
| 메모리와 GC(가비지 컬렉터) (0) | 2025.11.15 |
|---|---|
| 추상 클래스 (0) | 2025.10.10 |
| 상속 (0) | 2025.10.10 |
| Static (0) | 2025.10.10 |
| 생성자와 클래스 심화 (0) | 2025.10.05 |