본문 바로가기
C#/C# 학습 (TIL)

C# Array 배열/ Static Class 정적 클래스 / Extend Method 확장메서드 / 변수 표기법 / StringBuilder

by jjiing 2022. 6. 29.

▶ C#언어의 배열 특징


- C#언어의 배열은 참조형식의 데이터 타입에 속한다.
ㄴ 즉, 가비지 컬렉션에 의해서 메모리가 관리된다.

-C#언어의 배열은 가변 길이 배열을 지원한다.
ㄴ 즉, 배열의 각 행의길이를 서로 다르게 명시하는 것이 가능하다.
단, 가변길이 배열은 2차원 배열만 지원한다.

C++은 다차원 지원, C#에서는 가변배열 지원. =  2차원 지원. 왜 2차원? 행렬을 표현하기 위함

 

배열 사용

 

 

StringBuilder 예시
결과

 

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 키워드가 명시된 클래스는 클래스 변수, 함수 이외에는 다른 멤버를 정의하는 것이 불가능

 

 

 

 

awake 문 외부의 함수

 

awake문 내부
결과

 

 

 

 


▶확장메서드란?


 기존에 제공되는 클래스 또는 외부 라이브러리에 속해있는 클래스에
새로운 기능을
"상속"이 아닌 메서드를 이용해서 기능을 확장하는 것을 의미

 

 


▷확장메서드의 특징
- 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 등등
       ㄴ데이터 손실(라운딩에러) 및 프로그래머 실수 방지

약한 형식 검사 : 자동으로 해당 변수의 형식을 지정(추정)
        ㄴ 단, 지역변수로 선언하고 선언과 동시에 초기화를 해줘야한다.