-
[TIL]C# 문법 4TIL 2024. 4. 26. 21:02
값형과 참조형
C#에서 변수가 데이터를 저장하는 방식
1.값형(value Typue)
변수에 값을 직접 저장
변수가 실제 데이터를 보유하고 있으며, 다른 변수에 할당하거나 전달할 때는 값이 복사
ex) int, float ,double, bool
2. 참조형(Reference Type)
변수가 데이터에 대한 참조(메모리 주소)를 저장
참조형 변수의 수정은 동일한 데이터를 가리키고 있는 다른 변수에 영향을 끼친다.
ex) 클래스, 배열, 인터페이스 등
값형과 참조형의 차이점
값형은 실제 데이터를 변수에 저장, 참조형은 데이터에 대한 참조를 변수에 저장
값형은 변수 간 값 복사가 이루어지고, 참조형은 변수 간의 참조 복사
값형은 독립적으로 데이터를 가짐, 참조형은 변수가 동일한 데이터를 참조
박싱과 언박싱
값형과 참조형 사이의 변환을 의미
1. 박싱(Boxing)
값형을 참조형으로 변화하는 과정
값형 변수 값을 메모리 합 영역에 할당된 객체로 래핑
2. 언박싱(Unboxing)
박싱된 객체를 다시 값형으로 변환하는 과정
언박싱은 명시적으로 타입 캐스팅 해야 함, 런타임에서 타입 검사가 이루어짐
주요 특징
박싱과 언박싱은 값형과 참조형 사이의 변환 작업이므로 성능에 영향을 미침
박싱된 객체는 힙영역에 할당되므로 가비지 컬렉션에 대상, 메모리 관리에 유의
박싱된 객체와 원래 값형은 서로 독립적이므로 값을 수정하더라도 서로 영향을 주지 않음
static void Main() { //값형 ex) int, float, bool.. int x = 10; int y= x; y= 20; Console.WriteLine(x); // 10 Console.WriteLine(y); // 20 //참조형 arr, Class, interface int[] arr1 = new int[] {1, 2, 3}; int[] arr2 = arr1; arr2[0]=4; Console.WriteLine(arr1[0]); // 4 Console.WriteLine(arr2[0]); // 4 }
델리게이트 (Delegate)
메서드를 참조하는 타입
다른 프로그래밍 언어에서는 함수 포인터라는 용어를 사용
델리게이트를 이용하면 메서드를 매개변수로 전달하거나 변수에 할당 가능
더보기사용 예시)
delegate int Calulate(int x, int y) static int Add(int x, int y) { return x+ y; } class Program { static void Main() { //메서드 등록 Calucate calc =Add; //델리게이트 사용 int result= calc(3,5) Console.WriteLine(result); } }
활용 예시)
//활용 예시 delegate void MyDelegate(string message); static void Method1(string message) { Console.WriteLine(message); } static void Method2(string message) { Console.WriteLine(message); } class Program { static void Main() { Myelegate myDelegate = Method1; myDelegate += Metho2; myDelegate("Hello"); /* 출력결과 * Hello * Hello */ } }
이렇게 Delegate에 두가지 함수를 넣으면 한번에 두개를 호출할 수 있다.
Class간의 데이터 전달도 가능
람다(Lambda)
람다는 익명 메서드를 만드는 방법
람다를 사용하면 메서드의 이름 없이 메서드를 만들 수 있다.
간단하면 사용해도 괜찮지만 복잡해지면 메서드로 빼주는게 좋다.
// 제가 아직 이해를 못 했습니다.
Func과 Action
Func와 Action은 델리게이트를 대체하는 미리 정의된 제너릭 형식
Func는 값을 반환하는 메서드를 나타내는 델리게이트 ex) Func<int, string>은 int 를 입력받아 string을 반환
Action은 값을 반환하지 않는 메서드 ex) Action<int, string>은 int와string을 입력받고 아무런 값도 반환하지 않음
둘 다 제너릭 형식으로 미리 정의되어 있어 매개변수와 반환 타입을 간결하게 표현 가능
LINQ(Lanagaue Integrated Query)
.NET 프레임워크에서 제공되는 쿼리 언어 확장
데이터 소스(컬렉션, 데이터베이스, XML 문서 등) 에서 데이터를 쿼리하고 조작하는데 사용
데이터베이스와 유사한 방식으로 데이터를 필터링, 정렬, 그룹화, 조인 등 다양한 작업 수행
var result = from 변수 in 데이터소스 [Where 조건식] [Orderby 정렬식 [, 정렬식...]] [select 식];
from : 데이터 소스 지정
where: 선택적으로 사용, 조건식을 지정하여 데이터 필터링
orderby: 선택적으로 사용, 정렬 방식 지정
select: 선택적으로 사용, 조회할 데이터 지정
Nullable 형
null 이란?
아무것도 없음을 의미 ( TMI ) null은 0이 아니다. )
참조형 변수가 어떠한 객체를 참조하지 않을때 사용
Nullable
C#에서는 원래 null을 못가지지만 null 값을 가질 수 있는 특별한 형식
? 연산자를 사용하여 선언 ex) int?는 int에 null을 할당할 수 있는 Nullable<int> 형식을 나타낸다.
문자열 빌더(StringBuilder)
1. 문자열조작
Append(), Insert(), Replace(), Remove()등 다양한 메서드를 제공하여 문자열에 대한 추가 ,삽입, 치환, 삭제 작업 수행
2. 가변성
내부 버퍼를 사용하여 문자열 조작을 수행, 크기를 동적으로 조절할 수 있다. 따라서 문자열의 크기가 늘어나거나 줄어도 추가적인 메모리 할당이 발생하지 않는다.
3. 효율적인 메모리 관리
문자열 조작시 내부 버퍼를 사용하므로 반복적인 문자열 조작 작업이 발생해도 메모리 할당 및 해제 오베헤드가 크게 감소
주요메서드
Append : 문자열 뒤에 추가
Insert: 문자열을 지정한 위치에 삽입
Remove: 지정한 위치에서 문자열 제거
Replace: 문자열 일부를 다른 문자열로 대체
Clear: StringBuilder의 내용 모두 지움
StringBuilder sb = new stringBuiler(); sb.Append("Hello)"; sb.Append(" "); sb.Append("World"); sb.Insert(5,", "); //Insert(문자열 인덱스,넣을 문장) sb.Replace("World:, "C#"); sb.Replace(5,2); //Replace (문자열 인덱스, 제거할 양) string result = sb.ToString(); Console.WriteLine(result); // HelloC#
'TIL' 카테고리의 다른 글
[TIL]특강 (C#, 코드컨벤션,깃허브) (0) 2024.04.29 [TIL]C# 알고리즘 (0) 2024.04.28 [TIL]C# 강의 과제 정리 (2) 2024.04.25 [TIL]C#문법3 (0) 2024.04.24 [TIL]C#문법 2 (0) 2024.04.23