본문 바로가기
반응형

개발56

[개발 상식] 값 타입(Value Type)과 참조 타입(Refrence Type) 값 타입(Value Type)과 참조 타입(Refrence Type) 값 타입(Value Type) 값 타입은 데이터를 스택 메모리에 저장합니다. 값 타입은 변수가 값을 직접 포함하며, 메모리 상에서 독립된 복사본을 가집니다. 값 타입은 주로 기본 데이터 유형(예: 정수, 부울, 문자, 실수 등) 또는 사용자 정의 구조체(struct)로 나타납니다. 값 타입의 예: int x = 10; // 정수 (값 타입) char letter = 'A'; // 문자 (값 타입) DateTime date = DateTime.Now; // 날짜 및 시간 구조체 (값 타입) 참조 타입(Reference Type) 참조 타입은 데이터를 힙(heap) 메모리에 저장합니다. 변수는 힙 메모리에 있는 데이터를 가리키는 참조를 포.. 2023. 11. 8.
[개발 상식]박싱(Boxing)과 언박싱(Unboxing)에 대해 박싱(Boxing)과 언박싱(Unboxing) 박싱(Boxing)과 언박싱(Unboxing)은 값 형식과 참조 형식 간의 변환을 수행하는 프로세스입니다. 이러한 변환을 통해 값 형식(예: 정수, 부울, 실수 등)을 참조 형식(예: object 또는 인터페이스)으로 캐스트하고 다시 반대로 참조 형식을 값 형식으로 변환할 수 있습니다. 박싱(Boxing) 박싱은 값 형식을 참조 형식으로 변환하는 프로세스입니다. 이때 값 형식의 인스턴스는 힙 메모리에 새로운 객체로 복제됩니다. 박싱은 object 형식을 포함한 모든 참조 형식으로 수행될 수 있으며, object 형식은 모든 데이터 형식을 포괄합니다. 박싱은 값 형식을 참조 형식으로 저장하려는 경우, 다양한 데이터 형식을 일반화된 방식으로 처리할 때 유용합니다.. 2023. 11. 7.
[개발 상식]태스크(Task)와 코루틴(Coroutine) 태스크(Task)와 코루틴(Coroutine) 태스크 (Task) 특징 병렬 실행: 태스크는 주로 병렬 실행을 관리하기 위한 개념으로 사용됩니다. 여러 개의 테스크가 동시에 실행되며, 각 테스크는 독립적인 작업을 수행합니다. 스레드와 프로세스 내에서 사용: 태스크는 멀티스레딩 환경이나 멀티프로세스 환경에서 사용됩니다. 다른 스레드 또는 프로세스와 동시에 실행될 수 있습니다. 동시성 제어: 태스크는 일반적으로 스레드 또는 프로세스 간에 데이터 공유와 동시성 문제를 다루기 위한 메커니즘을 제공합니다. 예시) using System; using System.Threading.Tasks; class Program { static async Task FooAsync() { Console.WriteLine("Sta.. 2023. 11. 6.
[개발 상식]JSON, XML, CSV의 각 장단점 JSON, XML, CSV의 장단점 JSON (JavaScript Object Notation) 장점 다양한 프로그래밍 언어에서 지원되며, 파싱과 직렬화가 간단 데이터 구조를 효과적으로 표현할 수 있으며, 중첩된 데이터 및 복잡한 객체를 지원 문자열, 숫자, 배열, 객체 등 다양한 데이터 유형 처리 가능 키-값 쌍을 사용하여 데이터를 구조화하고 읽기 쉽게 만듬 단점 XML보다 데이터 양이 더 많을 수도 있음. 주석을 지원하지 않음 예시) { "name": "John Doe", "age": 30, "email": "johndoe@example.com", "hobbies": ["reading", "swimming", "traveling"], "address": { "street": "123 Main St",.. 2023. 11. 5.
[개발 상식]오버로딩(Overloading)과 오버라이딩(Overriding) 오버로딩(Overloading)과 오버라이딩(Overriding) 오버로딩(Overloading) 같은 이름의 여러 함수를 가질 수 있다. 다만 각 함수들은 매개 변수의 유형과 개수가 다르도록 하는 방법 예시) int GetSum() { return 0; } int GetSum(int a,int b) { return a+b; } int GetSum(int[] values) { int result = 0; foreach(int item in values) result =+ item; return result; } 오버라이딩(Overriding) 상속관계의 부모 클래스의 가상함수를 자식 클래스에서 재정의 하여 사용하는 방법 예시) //부모 클래스 public class Parent { public virtu.. 2023. 11. 4.
[개발 상식]프로세스(Process)와 스레드(Thread) 프로세스(Process)와 스레드(Thread) 프로세스(Process) 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 또는 OS에서 할당한 프로그램 작업 단위 특징 독립성 : 각 프로세스는 독립된 메모리 공간을 가지며, 한 프로세스의 오류가 다른 프로세스에 영향을 끼치지 않음. 통신 : 프로세스 간 통신이 필요한 경우, 복잡한 메커니즘이 필요(ex 소켓 등) 생성 비용 : 프로세스를 생성하고 관리하는 데는 시스템 자원이 많이 필요하며, 많은 시간과 비용이 소요 안정성 : 프로세스 간의 오류나 출돌이 발생해도 다른 프로세스는 영향을 받지 않아 시스템 전체의 안정성이 유지 스레드(Thread) 프로세스 내에서 할당된 실행 단위, 모든 프로세스에는 하나 이상의 스레드가 실행된다. 특징 공유 .. 2023. 11. 3.
c# List나 Dictionary 의 capacity 설정 c# List나 Dictionary 의 capacity 설정 capacity는 크기를 조정하지 않고 포함될 수 있는 요소 수입니다. 혹시 List나 Dictionary를 사용할때 미리 메모리를 할당하면 좋을까? 한번 찾아봤다. C# program that tests capacity using System; using System.Collections.Generic; class Program { const int _m = 100000; static List _values = new List(); public static void Main() { // Add 100 strings for testing. for (int i = 0; i < 100; i++) { _values.Add("value" + i.ToS.. 2021. 2. 23.
c# ? 연산자 사용하기 코드를 작성하다가 보면 우리는 오류를 피하기위해 null 체크를 자주 하게됩니다. 보통 null 체크를 할때는 if문에서 null인지 아닌지 체크를 합니다. 그런데 이를 간결하게 체크할 수 있게 해주는 연산자가 있습니다. 바로 ? 연산자 입니다. 바로 예시를 들어보겠습니다. List testList = null; ... if(testList!=null) testList.add(77); testList를 null체크해서 null이 아니면 77을 추가하는 코드입니다. 이 코드를 ? 연산자를 사용해보겠습니다. List testList = null; ... testList?.add(77); testList 뒤에 ? 를 사용함으로써 null 체크를 하고 null이 아니면 Add함수를 실행하는 코드가 됩니다. 2021. 2. 23.
Unity - 다운로드 에셋 버전관리 직접하기 유니티가 에셋번들은 직접 관리를 해주고 있으나 때로는 직접 버전을 관리해야할 수 있다. 다운로드 받을 파일에 대한 정보를 담아둔 텍스트가 있으면 좋을 것 같다. 구조는... 1.Filename : 파일명 2.path : 다운로드 경로 3.HashKey : 파일 해쉬값 ... 맨처음 파일 정보를 담아둔 텍스트를 받아 메모리에 저장한다. 그리고 로컬에 저장된 파일과 다운로드 받을 파일의 값을 비교하여 다운로드한다. 해시값이 서로 달라 다운받은경우 파일의 저장위치를 ..[파일명]/[HashKey]/ 으로 해두면 다음 패치시 파일 비교할때 해당 경로에 파일이 있는지 비교하여 없으면 다운로드 있으면 패스 하게 할 수 있다. 이후 파일을 다운로드하고는 이전에 받아둔 파일은 제거하는것이 좋을 것 같다. 다운받은 경로.. 2021. 2. 15.
Unity - 에디터에서 에셋번들 리소스 바로 불러오기 에셋번들로 리소스를 묶으면 테스트할때 매우 불편할때가 많다. 리소스가 수정되거나 추가되었을때 테스트를 하려고하면 에셋번들을 빌드해서 서버에올리고 또 내려받아서 에셋 번들을 통해 리소스를 불러왔었다. 다음은 에셋번들로 묶일 에셋들을 찾는 코드이다. //모든 에셋 번들 명을 불러온다. string[] assetBundleNames = UnityEditor.AssetDatabase.GetAllAssetBundleNames(); for(int i =0 ; i< assetbundleNames.Length; ++i) { //에셋번들에 포함된 에셋의 경로를 모두 불러온다. string[] assetPaths = UnityEditor.AssetDatabase.GetAssetPathsFromAssetBundle(asse.. 2021. 2. 15.
삽입정렬(Insertion Sort)이란 무엇일까? 삽입정렬 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘 해당 원소의 값과 앞의 원소들의 값을 비교해나가며 자신의 위치를 찾아서 삽입한다. 삽입을 하기 위해 데이터들의 이동이 불가피하여 데이터 양이 많아질 수록 효율이 저하된다. 시간복잡도 O(n^2) 이해를 돕는 이미지 이해를 돕는 영상 [C 코드] void insertion_sort ( int *data, int n ) { int i, j, remember; for ( i = 1; i = 0 && remember < data[j] ){ //선택된 원소값이 비교하는 원소의 값보다.. 2020. 12. 31.
버블정렬(Bubble Sort, Sinking Sort)이란 무엇일까? 버블정렬 두 인접한 원소를 비교하여 정렬하는 방법 시간 복잡도가 O(n^2)로 상당히 느리다 양방향으로 번갈아 수행하면 칵테일 정렬이 된다. 버블정렬은 이해하기 쉽고 코드도 간단하지만 시간복잡도 때문에 비교할 데이터의 개수가 많아질수록 성능이 저하됩니다. 이해를 돕는 영상 [C++] int* bubble_sort(int arr[], int n) { int i, j, temp; for (i=n-1; i>0; i--) { for (j=0; j arr[j+1]) { //앞에 값이 더 크기때문에 서로 스왑 temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } return arr; } 2020. 12. 30.
728x90