본문 바로가기

Study114

[C#/Unity][디자인패턴] 싱글톤 패턴(Singleton Pattern) 1. 싱글톤 패턴이란? - 런타임 동안 "단 하나의 인스턴스만을 생성"하는 패턴 - 싱글톤 패턴이 적용된 객체는 하나의 인스턴스만 생성할 수 있고, 다른 객체에서 싱글톤 객체의 인스턴스를 생성하려 할 경우, 기존에 생성된 인스턴스가 있다면 해당 인스턴스를 반환하는 형태로 사용됨. - 모든 데이터를 전역으로 관리하여 쉽게 접근할 수 있게 하는 것 - 객체의 메모리를 정적으로 할당하여 하나의 객체에만 접근하는 방법 2. 싱글톤 패턴을 사용하는 경우 1) 공통된 객체를 여러개 생성해서 사용해야 하는 경우 2) 인스턴스가 절대적으로 한 개만 존재해야 한다는 것을 명시하고 싶은 경우 3. 싱글톤 패턴의 장점 1) 편리성 : 최초로 생성된 객체 하나에만 접근하게 되므로 데이터를 접근하고 수정하는데 용이함. 2) 중.. 2023. 11. 8.
[C#/Unity][디자인패턴] 디자인 패턴(Design Pattern) 알아보기 1. 디자인 패턴이란? - 설계자로 하여금 재사용이 가능한 설계를 선택하고, 재사용을 방해하는 설계를 배제하도록 도와줌 - 시스템의 유지보수나 문서화를 개선할 수 있고, 클래스의 명세도 정확하게 알 수 있으며, 객체 간의 상호작용 또는 설계의도까지 명확하게 정의할 수 있음. - 즉, "올바른" 설계를 "빨리" 만들 수 있도록 도와줌. - 같은 실수를 반복하지 않기 위해 특정 상황에서 발생하는 문제 패턴을 발견하고 해결방안을 기록한 것 - 효율적인 코드를 만들기 위한 방법론 2. 디자인 패턴의 종류 1) 생성 패턴 - 객체의 생성과 초기화를 다룸 - 객체를 만드는 방법에 대한 패턴 2) 구조 패턴 - 객체와 클래스를 조합해 더 큰 구조를 만드는 방법을 다룸 - 객체들의 구성이나 클래스들의 구성을 다루는 패.. 2023. 11. 7.
[Unity] 유니티 최적화(Unity Batching) 1. Draw Call(드로우 콜) - CPU : 디지털 콘텐츠를 구성하고 있는 게임 오브젝트, 데이터 등을 읽어들이는 역할 - GPU : CPU에게 받아온 데이터를 토대로해서 컨텐츠를 그리는 역할 - Draw Call : CPU가 GPU한테 자신이 읽어들인 데이터를 그리리고 내리는 명령 - Command Buffer : 드로우 콜에 따라오는 데이터들, 다양한 정보들의 버퍼들이 포함되어 있음. - SetPass Call : Command Buffer의 그래픽 계열 쪽(메테리얼, 쉐이더 등)을 묶어놓은 그룹 SetPass를 전달하는 것을 의미 - Batch : Draw Call + SetPass Call 을 통해 GPU로 넘기는 과정, 많으면 많을수록 부하가 줄음. - 최적화 : Batch를 줄이는 것. .. 2023. 11. 3.
[C#] 리플렉션(Reflection) 1. 리플렉션(reflection)이란? - 애플리케이션 실행 중 어셈블리의 내용(메서드, 프로퍼티, 생성자 등, 인스턴스의 데이터 타입 정보)을 확인하거나 검사하려는 경우 사용되는 기능 - 프로그램 실행 도중에 객체의 정보를 조사하거나, 다른 모듈에 선언된 인스턴스를 생성하거나, 기존 개체에서 형식을 가져오고 해당하는 메소드를 호출, 또는 해당 필드와 속성에 접근할 수 있는 기능을 제공한다. - 컴파일 시에 알 수 없었던 타입이나 멤버들을 찾아내고 사용할 수 있게 해주는 메커니즘 2. 리플렉션의 목적 - 애플리케이션 개발시, 디버깅 또는 런타임에 알 수 없는 객체의 동작을 분석하기 위함. - 외부 라이브러리에 존재하는 클래스 및 메서드를 분석하기 위함. - 개발 도구 자체를 개발하거나 분석도구를 만들때.. 2023. 11. 1.
[개발 지식][C++/C#] 얕은 복사, 깊은 복사 1. 얕은 복사(shallow copy) - 한 객체의 모든 멤버 변수의 값을 다른 객체로 복사 - 실제 포인터가 가리키는 값은 같기 때문에 한 쪽이 변하면 다른 한 쪽도 따라서 변함 2. 깊은 복사(deep copy) - 한 객체의 모든 멤버 변수의 값 뿐만 아니라, 포인터 변수가 가리키는 모든 객체에 대해서도 복사 - 포인터까지 복사가 되어 생기는 것으로, 한 쪽이 아무리 바뀌어도 다른 한 쪽에는 영향이 없음 3. 소스코드(C++) // c++ #include #include #include #define _CRT_SECURE_NO_WARNINGS using namespace std; class Student { public: char* name; int age; Student(const char* .. 2023. 10. 31.
[알고리즘] DFS와 BFS 1. DFS(Depth-First Search) - 깊이 우선 탐색 - 루트 노드나 임의 노드에서 "다음 브랜치로 넘어가기 전에 해당 브랜치를 모두 탐색"하는 방법 - 스택이나 재귀함수를 이용해 구현 - 모든 경로를 방문해야 할 경우 적합 - 인접 행렬 : O(V^2) - 인접 리스트 : O(V+E) // V는 접점, E는 간선 2. BFS(Breadth-First Search) - 너비 우선 탐색 - 루트 노드나 임의 노드에서 "인접한 노드부터 먼저 탐색"하는 방법 - 큐를 이용해 구현 - 최소 비용으로 탐색을 진행할 때 적합\ - 인접 행렬 : O(V^2) - 인접 리스트 : O(V+E) 3. 소스코드(C++) // DFS #include #include using namespace std; int .. 2023. 10. 30.
[개발 지식] 클린코드와 리팩토링 1. 클린 코드 - 가독성이 높은 코드 - 코드를 작성하는 의도와 목적이 명확하며, 다른 사람이 쉽게 읽을 수 있어야 함 - 다른 사람이 코드를 봐도 자유롭게 수정이 가능 - 변경된 내용이 어떻게 상호작용하는지 이해하는 시간을 최소화 시키는 것 - 가독성을 높이는 방법 1) 의미있는 네이밍 2) 오류 제거 3) 중복 제거 4) 의존성 최소화 5) 클래스, 메소드가 한가지 일만 처리 6) 보기 좋게 배치하기 7) 주석 달기 2. 클린 코드 예시 // 클린 코드 변경 전 public int A(int a) { return a * a; } // 클린 코드 변경 후 -> 의미있는 네이밍 public int Square(int num) { return num * num; } 3. 리팩토링 - 프로그램의 외부 동작.. 2023. 10. 24.
[알고리즘] 해시 테이블(Hash Table) 1. 해시 테이블 - 완전 탐색(브루트 포스)으로 시간초과에 빠지게 되는 문제들을 풀기 위해 필요함 - Key, Value로 데이터를 저장하는 자료구조 - 데이터를 빠르게 검색할 수 있음 - 각 key에 따라 고유한 index를 생성하고 이 index 값을 활용해 값을 저장하거나 검색한다. - 미리 key값으로 데이터들을 저장해 놓으면 데이터를 찾기 쉽다. - 평균 시간복잡도 : O(1) 2. 해시 함수에서 고유 인덱스 값을 설정하는 방법 1) Division Method - 나눗셈을 이용하는 방법 - 입력값을 테이블의 크기로 나누어 계산 - 테이블의 크기를 소수로 정하고 2의 제곱수와 먼 값을 사용해야 효과가 좋다고 알려짐 2) Digit Folding - 각 key의 문자열을 ASCII 코드로 바꾸고.. 2023. 10. 24.
[C++] final 키워드 2 이것 저것 알아보면서 코드를 보면 final이라는 키워드가 있는데 이게 뭐지 싶었다. 알아보니 final은 c/c++에서는 쓰이지 않고, java에서 쓰이는 것이라고 한다. java에서 변수 앞에 쓰이는 final은 c++에서의 const와 같은 상수를 뜻한다! //요약 final은 java에서 쓰임 변수 앞에 쓰인 fianl은 c++의 const와 같은 의미로 사용 2023. 10. 24.
[C++] strchr함수 - 문자 검색 1. 라이브러리 : 2. 함수 원형 // 검색할 문자열, 존재하는지 확인할 문자(아스키 값) const char* strchr(const char* str, int c); char strchr(char* str, int c); 3. 함수 설명 - 문자열 내에서 해당 문자가 있는지 검색해주는 함수 - 첫번째 문자열 내에 두번째 문자가 존재하는지 검사 - 존재하면 존재하는 곳의 포인터 반환, 존재하지 않으면 널 포인터 반환 4. 예시 1) 특정 문자 찾기 // string 이용 -> 주소값 사용 string str = "aAbBcCdD"; char* ptr = strchr(&str[0], 'C'); // 알파벳 C를 찾음 if(ptr != nullptr) { cout 2023. 10. 20.
[C++] npos 1. string::npos란? - string의 find() 함수 수행 시에 찾는 문자열이 없을 때 반환된다. - '-1' 의 값을 가지는 상수이다. 2. 예시 string s = "abcde"; if(s.find('a') == string::npos) // a는 s에 들어있으므로 false 반환 { cout 2023. 10. 19.
[C++] final 키워드 1. final - 상속을 방지하는 키워드 - 더 이상 가상함수를 오버라이딩하지 않겠다는 의미 - 가상함수의 마지막을 가르키는 키워드 - 클래스와 멤버함수 둘 다 사용 가능 - override와 같은 자리에 쓰임 2. 예시 #include using namespacee std; class A { public: virtual void print() { cout 2023. 10. 18.