▶ C#언어의 배열 특징
- C#언어의 배열은 참조형식의 데이터 타입에 속한다.
ㄴ 즉, 가비지 컬렉션에 의해서 메모리가 관리된다.
-C#언어의 배열은 가변 길이 배열을 지원한다.
ㄴ 즉, 배열의 각 행의길이를 서로 다르게 명시하는 것이 가능하다.
단, 가변길이 배열은 2차원 배열만 지원한다.
C++은 다차원 지원, C#에서는 가변배열 지원. = 2차원 지원. 왜 2차원? 행렬을 표현하기 위함
String과 StringBuilder
String :
string은 값타입이 아닌 참조변수다. 즉, 문자열을 조합할때마다 새로운 클래스가 생성이 되고 이전의 데이터는
GB(Gabage Collector)에 의해서 수집이 된다. 따라서 문자열을 조합할때마다 메모리 낭비 및 부하가 발생되는 비효율적인 코드가 생산된다.
string을 사용하는 경우
- 읽기가 많은 경우는 String 클래스를 사용하는게 더 적합하다.
- 문자열을 작성하는 동안 광범위한 검색 작업을 수행하는 경우 (StringBuilder 클래스는 IndexOf 또는 StartWith과 같은 함수가 없음)
StringBuilder :
stringbuilder를 사용하면 문자열을 조합할때마다 새로운 변수를 생성하지 않고 결합할 수 있다.
내부에 함수가 존재해서 값들을 조합하거나 삭제할때에도 새로운 인스턴스가 생성되지 않습니다.
- 객체의 참조 값을 힙에서 관리한다. (추가, 삽입, 삭제 가능)
- 새로운 객체를 만들지 않고 문자열을 수정할 수 있다.
- 속도 빠르다. 대신 메모리 더 많이 필요
- stringBuilder는 메모리를 블럭 단위로 할당한 후 현재 블럭 내 메모리가 모두 소진된 경우에 한하여 메모리를 재할당하게 되어있다. (빌더가 훨씬 빠르다.)
StringBuilder 를 통한 문자열 이어붙이기 작업은 단순한 + 연산자를 사용하는 것보다 성능 측면에서 장점이 있다. 이는 메모리가 할당되는 방법에 있어 차이가 있기 때문인데, 매 문자열 이어붙이기 작업 수행시마다 메모리를 재할당하는 대신에, StringBuilder 는 메모리를 블럭 단위로 할당한 후 현재 블럭 내 메모리가 모두 소진된 경우에 한하여 메모리를 재할당하게 되어 있다. 이는 작은 문자열 이어붙이기 작업을 다량으로 수행할 때에 큰 차이를 불러올 수 있다.
StringBuilder를 사용하는 경우
-응용 프로그램이 설계시에는 알 수 없는 횟수의 문자열을 변경해야 할 때 ( 사용자의 입력등으로 조합할때 )
-문자열에서 많은 횟수의 변경이 예상될때
(참고)
힙에서 관리 = 동적메모리 = 추가, 삽입, 삭제 가능
필요한 메모리보다 더 많이 확보를 해놓기 때문에 쉽게 추가 가능
속도 빠르다. 대신 메모리 더 많이 필요
System.Text.StringBuilder()클래스
(참고)
System.Text.StringBuilder 클래스는 새 개체를 만들지 않고 문자열을 수정하고 싶을 때 사용
StringBuilder.메서드이름 으로 다양한 기능을 사용할 수 있다.
ex)
StringBuilder.Append : 현재 stringBuilder의 끝에 정보를 추가한다.
StringBuilder.AppendFormat : 문자열에 전달된 서식 지정자를 서식 있는 텍스트로 바꾼다.
..
[,]로 2차원 배열 정의하고 각 행의 합 출력하기
arr.getLength()로 행과 열의 개수를 출력할 수 있다.
[][]로 입, 출력하기
▶정적 클래스
클래스의 멤버변수, 함수가 모두 정적으로 이루어진 클래스를 의미
- 정적 클래스는 객체화 시키는 것이 불가능하다.
- 정적 클래스는 정적변수, 함수 이외에 멤버변수, 함수 등을 선언하는 것이 불가능하며, 상속 또한 불가능
▷C# 언어 정적 클래스 특징
- C# 언어의 정적 클래스는 static 키워드를 명시함으로 정의하는 것이 가능
ㄴ static 키워드가 명시된 클래스는 클래스 변수, 함수 이외에는 다른 멤버를 정의하는 것이 불가능
▶확장메서드란?
기존에 제공되는 클래스 또는 외부 라이브러리에 속해있는 클래스에
새로운 기능을 "상속"이 아닌 메서드를 이용해서 기능을 확장하는 것을 의미
▷확장메서드의 특징
- c#언어의 확장 메서드는 정적 클래스만을 통해서 정의하는 것이 가능하다.
즉, 정적 클래스가 아니면 확장 메서드 자체를 구현하는 것이 불가능하다.
- c#언어의 확장 메서드를 정의하는 정적 클래스는 반드시 최상단 영역에 위치 시켜야한다.
- 특정 클래스의 중첩 클래스로는 확장 메서드를 정의하는 것이 불가능
- c#은 상속 하나만 가능. (다중상속 x ) + 확장메서드 + 인터페이스
▶변수 표기법
헝가리안
절차지향적(C) 코드 방식을 선호할때 사용한 표기법
(객체지향적:(C++,C#))
어느 자료형의 변수인지 알기위해 변수 앞에 자료형의 악어를 붙인 표기법
Ex) int player => nPlayer
카멜
가독성 때문에 나온 표기법
Ex) int playerselectnumber => playerSelectNumber
파스칼 케이스
언리얼 + 유니티에서 많이 채용한다.
Ex) int playerselectnumber => CPlayerSelectNumber (C : 클래스)
스네이크
단어를 구분할 때 _(언더바)
보통 전처리기, ENUM, CLASS에 사용
Ex) int playerselectnumber => Player_Select_Number
<기타 내용>
var : auto와 비슷한 키워드
장점 : 편리하다 단점 : 협업할때 유추해야함.
c#의 형식검사는 강한 or 약한이 있다.
강한 형식 검사 : int, float string 등등
ㄴ데이터 손실(라운딩에러) 및 프로그래머 실수 방지
약한 형식 검사 : 자동으로 해당 변수의 형식을 지정(추정)
ㄴ 단, 지역변수로 선언하고 선언과 동시에 초기화를 해줘야한다.
'C# > C# 학습 (TIL)' 카테고리의 다른 글
C# 인덱서, 제네릭, 확장메서드 (0) | 2022.07.01 |
---|---|
C# 컬렉션 - 딕셔너리 / 해쉬테이블 (0) | 2022.06.30 |
C# 자료형의 특징 , 변수의 특징 - 값 형식 / 참조 형식 데이터 타입 (0) | 2022.06.29 |
C# CLR(공통언어런타임) / CIL(공통 중간 언어) / C#의 메모리 관리 방식 (0) | 2022.06.28 |
C# 오브젝트 풀링 (0) | 2022.06.26 |