객체지향 프로그래밍 세션 정리
순차적/절차적 프로그래밍
순차적 프로그래밍
- 시간의 흐름대로, 위에서 아래로
절차적 프로그래밍
- 하나의 절차를 재사용을 위해 함수화
- 대규모 프로그래밍을 만들기 힘들음
- 복잡한 프로그래밍에 맞춰진 것이 아님
객체지향 프로그래밍
OOP(Object-Oriented Programming)
객체지향 = 세포 (앨런 케이)
- 프로그래밍을 하나하나 세포처럼 만들자! 세포는 각자의 역할만 수행하고 옆에 있는 세포에 정보를 전달한다.
- 객체는 다른 객체와 메세지만 주고받으면 되지 않을까?
-> 순차/절차적 프로그래밍의 단점을 보안할 아이디어
객체는 함수와 데이터의 집합이다.
객체와 객체는 서로에게 의존한다.
객체는 다른 객체를 상속한다.
다이어그램으로 클래스들을 데이터와 함수로 그려놓으면
겹치는 부분 또는 부족한 부분, 복잡한 부분이 눈이 보일 것
클래스를 짤 때는 각각의 클래스에 어떤 영향을 미치는지 생각하면서 짜야한다.
-> 코드를 많이 짜봐야 함
객체지향 프로그래밍의 특징
추상화
공통된 특징, 본질을 모아 추출
설계와 구현을 분리
설계: 인터페이스 등을 이용, 객체의 핵심적 기능을 규정
구현: 설계(인터페이스 등)를 상속받은 클래스에서 구현
상속
기존 클래스 재활용
반복적인 코드, 오류를 줄여줌
메서드 오버라이딩을 통해 재정의
다형성
오버라이딩
Sound()
-> Dog.Sound()
-> Cat.Sound()
-> Duck.Sound()
캡슐화
class 는 껍데기, 데이터와 함수를 캡슐(Class)안에 넣어주는 것
외부에서 쉽게 접근하지 못하게 은닉
접근제어자 (public, private,getter, setter, ...)
데이터에 접근해서 변경하는 것을 최소화 시켜야 함
데이터는 public으로 설정하지 않는 편이 좋음
객체지향 설계원칙(SOLID)원칙
SRP 단일 책임의 원칙
Single Responsibility Principle
하나의 클래스는 하나의 책임만 갖는다.
너무 많은 기능을 넣지 않는다. -> 많은 기능을 넣으면 재활용하기 어려워짐
작은 단위로 줄이는 편이 좋다 - 나중에 조합할 때 오류를 최소화할 수 있음
SRP의 기준은 각자 다를 수 밖에 없다. -> 스스로의 기준을 세우자
어떤 기능을 하나 고쳤을 때 다른 부분에서 변경사항이 적거나 없으면 SRP원칙을 잘 지켰다고 볼 수 있음
OCP 개방폐쇄의 원칙
Open Closed Principle
확장에 대해서는 개방적, 수정에 대해서는 폐쇄적
-> 데이터, 객체에 직접 접근, 수정하는 것에 대해서는 페쇄적이어야 함
유연한 코드 - 수정에 대해서 오류가 적은 코드
LSP 리스코프 치환 원칙
Liskov Substitution Principle
자식 객체는 부모 클래스를 대체할 수 있어야 한다.
작은 단위를 상속해서는 안된다.
ISP 인터페이스 분리 원칙
Interface Segragation Principle
큰 인터페이스 하나보다는 어려 개의 인터페이스 분리가 더 좋다.
최대한 인터페이스를 쪼개서 사용해라
DIP 의존관계 역전 원칙
Dependency Inversion Principle
구체화가 아니라 인터페이스에 의존해라
인터페이스 자체를 활용해라
인터페이스나 클래스를 상속받은 클래스를 사용하기 보다
부모(인터페이스 또는 클래스)를 가져와 사용해라
이 원칙을 우선순위에 두게 되면 상속과 대립됨
설계도를 가져와서 사용(DIP) <-> 이미 있는 것을 가져다 사용(상속)
-> 대규모 프로그래밍을 하기 위해 필요함, 확장성을 위해
객체 '지향' 프로그래밍
위에 나온 원칙들이 절대 법칙이 아님을 유의하자.
프로젝트에 맞는 설계 방식과 원칙을 생각해야한다.
위 개념들을 잘 생각해놓으면 디자인패턴을 공부할 때 좋다.
조원분의 코드를 보면서 공부하다가 몇 가지 생소한 것, 짚고 넘어갈 것이 있어 정리해보려고 한다.
new()
GameObject obj = new();
C# 9.0에서 추가된 편의 기능
변수의 형식을 명시하지 않아도 되는 문법이다.
GameObject obj = new GameObject();
기존에는 위와 같이 변수의 형식을 반드시 명시해야 했는데,
C# 9.0 에서는 형식을 생략할 수 있다.
UnityEngine.Object
Unity엔진에서 모든 개체의 기본 베이스 클래스인 추상 클래스
GameObject, Componenet, Material, Texture등이 이 클래스로부터 파생된다.
Vector<UnityEngine.Object> vec = new();
이런식으로도 사용 가능하다.
Dictionary - ContainsKey(string key)
Dictionary에 이 key값을 가지고 있는 값이 있는지 확인하는 bool값 반환
제너릭 타입 매개변수
public void SampleFunc<T>(T first, T second) {
swap(first, second);
}
함수에서 사용하는 예시다.
as
C#에서 형변환을 시도하는 표현식
변환에 실패하면 null을 반환
result = obj as type;
Composite Collider
이어져(겹쳐)있는 collider를 하나로 이어주는 옵션
사용예시: Tilemap Collider를 하나로 이어줄 때
Tilemap에 옵션으로 있음(Used by Composite)
'내일배움캠프(Unity)' 카테고리의 다른 글
TIL - 푸드 파이트 대회(알고리즘 코드카타) (0) | 2023.12.01 |
---|---|
TIL - 디자인 패턴 특강, coroutine, map (0) | 2023.11.30 |
내일배움캠프 게임개발(Unity) 22일차 231128 TIL (2) | 2023.11.28 |
내일배움캠프 게임개발(Unity) 21일차 231127 TIL (3) | 2023.11.27 |
내일배움캠프 게임개발(Unity) 20일차 231124 TIL - Unity 게임개발입문 시작 (2) | 2023.11.24 |