[TIL] 30 반별 강의정리, 4시강의 정리 ⭐⭐⭐

업데이트:

카테고리:

태그: , ,


유니티 생성주기 , 클래스, 접근제한자
값 참조타입, 클래스 구조체 , 클래스 인터페이스, 리스코프 치환 원칙
제네릭, 오브젝트 풀, 설계, 좋은코딩? SOLID

유니티 숙련주차 1일차

   [o] 알고리즘 문제 42 ~ 43
   [o] 강의 듣기
   [o] 다른반 강의 듣기
   [o] 4시 강의 듣기
   [X] 다른반 발표 보기
   주말에 알고리즘 과제 풀어보기.







1. 알고리즘 문자열

public int solution(string t, string p) {
        int answer = 0;
        for(int i = 0; i < t.Length-p.Length+1; i++)
        {
            string strA = t.Substring(i, p.Length);
            int compare = strA.CompareTo(p);
            if (compare<=0) answer++;
        }
        return answer;
    }
  • 예) t = “123”, p=”2”

t.Substring(i, p.Length)

  • t의 i번째부터 p.Length(1) 개만큼 가져와서 strA에 저장.


strA.CompareTo(p)

  • strA와 P를 비교한다
  • strA가 크면 +1
  • 같으면 0
  • 작으면 -1







2. 1반강의

1 ~ 3 정리

깃허브유니티 생성
클래스 (데이터 + 메서드(기능))
접근제한자 public private, protected

유니티 생성주기

생성주기 awake -> onenabel -> start ->
image







3. 2반강의

값 참조타입, 클래스 구조체 , 클래스 인터페이스, 리스코프 치환 원칙

클래스 vs 구조체

image

클래스 vs 인터페이스

image







4. 3반강의

공통역량
c# , 자료구조, 알고리즘
데이터베이스, 네트워크
운영체제, 컴터구조
디자인 패턴의 이해

클라이언트 추가 역량
python등 생산성높은 언어
그래픽스 렌더링, 쉐이더 프로그래밍
AI, Navigation
Game Physics
게인 엔진 사용경험

서버 추가 역량
Multi Thread
Parallel
NetWork SQL, 클라우드 기반 서비스 보안, 안전성 등등

디자인 패턴

디자인패턴







4시 강의

제너릭 : 마법상자

  • 다양한 타입을 담을 수 있음
  • 코드의 재사용성과 유연성, 유지보수에 효율적
  • list에 int, string / GetComponent <T(ype)>
  • return을 t로 하거나 로도 퉁치기 가능
  • 여러 데이터를 동일한 로직에 사용할 떄
  • where - 제약조건 추가 image
public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }

    public double Add(double a, double b)
    {
        return a + b;
    }

    public int Add(int a, int b, int c)
    {
        return a + b + c;
    }
}

// 사용 예시
Calculator calculator = new Calculator();
int sum1 = calculator.Add(2, 3); // int Add(int a, int b) 메소드 호출
double sum2 = calculator.Add(2.5, 3.7); // double Add(double a, double b) 메소드 호출
int sum3 = calculator.Add(2, 3, 4); // int Add(int a, int b, int c) 메소드 호출



오버로딩 오버라이딩

-오버로딩 : 파라미터에 따라 함수의 기능이 달라진다.
같은이름 다른기능
-오버라이딩 : 부모에 정의된 메서드를 새롭게 정의한다.
재정의



오브젝트 풀

프리팹 -> 인스턴스화 setactive.False -> 오브젝트풀 -> 활성화 -> 실제 오브젝트 -> 사용한 오브젝트 false -> 다음에 재사용

이유 : 성능향상, 메모리 관리
활용 : 총알, 적 캐릭터

1) 미리 생성하는 방식

문제점 오브젝트 생성할때 너무 많으면 로딩이 오래걸릴 수 있다.

public class ObjectPool : MonoBehaviour
{
    public GameObject prefab;
    public int poolSize;

    private List<GameObject> objectPool;

    private void Start()
    {
        objectPool = new List<GameObject>();

        for (int i = 0; i < poolSize; i++)
        {
            GameObject obj = Instantiate(prefab, transform);
            obj.SetActive(false);
            objectPool.Add(obj);
        }
    }

    public GameObject GetObjectFromPool()
    {
        foreach (GameObject obj in objectPool)
        {
            if (!obj.activeInHierarchy)
            {
                obj.SetActive(true);
                return obj;
            }
        }

        return null;
    }
}

오브젝트를 다 썻는데 더 필요할 때 오래된걸 지우고 가져오기.
dequeue(오래된거 뺴기) -> enqueue(다시 pool)

2) 동적 오브젝트 풀

public class ObjectPool : MonoBehaviour
{
    public GameObject prefab;
    public int initialPoolSize; // 100
    public int maxPoolSize; // 10000

    private List<GameObject> objectPool;

    private void Start()
    {
        objectPool = new List<GameObject>();

        for (int i = 0; i < initialPoolSize; i++)
        {
            GameObject obj = Instantiate(prefab, transform);
            obj.SetActive(false);
            objectPool.Add(obj);
        }
    }

    public GameObject GetObjectFromPool()
    {
        foreach (GameObject obj in objectPool)
        {
            if (!obj.activeInHierarchy)
            {
                obj.SetActive(true);
                return obj;
            }
        }

        if (objectPool.Count < maxPoolSize)
        {
            GameObject obj = Instantiate(prefab, transform);
            objectPool.Add(obj); 
            obj.SetActive(true);
            return obj;
        }
        else
        {
            // 풀에 더 이상 생성할 수 없음
            return null;
        }
    }
}

3) 유니티 내장 함수

Objectpool()
image

Objectpool()

using UnityEngine;
using UnityEngine.Pool;

public class BulletPoolExample : MonoBehaviour
{
    public GameObject bulletPrefab;

    private ObjectPool<GameObject> bulletPool;

    private void Start()
    {
        bulletPool = new ObjectPool<GameObject>(
            createFunc: () => Instantiate(bulletPrefab), // 오브젝트 생성 방법
            actionOnGet: (obj) => obj.SetActive(true),   // 오브젝트를 풀에서 가져올 때 실행할 액션
            actionOnRelease: (obj) => obj.SetActive(false), // 오브젝트를 풀에 반환할 때 실행할 액션
            actionOnDestroy: (obj) => Destroy(obj),     // 오브젝트를 파괴할 때 실행할 액션
            defaultCapacity: 10,                        // 초기 용량
            maxSize: 20                                 // 최대 용량
        );
    }

    public GameObject GetBullet()
    {
        return bulletPool.Get();
    }

    public void ReturnBullet(GameObject bullet)
    {
        bulletPool.Release(bullet);
    }
}

언제사용? 오브젝트의 생성과 파괴가 계속 일어난다.
오브젝트를 많이 생성해야된다. (30개 이상)
생성관리를 체계적으로 하고 싶다.



소프트웨어 설계와 객체지향 원칙

폭포수식 개발
agon, mimicry, ilinx, alea
기능별로 모두 나눈다?
높은 응집도(Cohesion)낮은 결합도(Coupling)은 좋은 소프트웨어
응집도 : 모듈 내부에 존재하는 구성 요소들 사이의 밀접한 정도를 나타내며,
결합도 : 모듈과 모듈 사이의 관계에서 관련 정도를 나타낸다.

SOLID원칙
SRP(단일책임의 원칙) 한 클래스는 최소한의 기능만 갖는다.
OCP(개방폐쇄의 원칙) 확장에 대해 개방, 수정 폐쇄적.
LSP(리스코프 치환 원칙) 하위클래스는 인터페이스의 규약을 지켜야한다. 설계 많이해보기.
ISP(인터페이스 분리 원칙) 병용 인터페이스 하나 보다는 여러개의 인터페이스 분리가 더 좋다, 다중상속으로 사용.
DIP(의존관계 역전 원칙) 특정 클래스를 할당 X -> 부모,인터페이스를 사용하라 (편집됨)







잡담




[Unity] TIL 30


참고 : 유니티 TOP


📔

댓글남기기