I'm FanJae.
[20260429] string / StringBuilder / 사용자 정의형 타입(struct, enum) 본문
[20260429] string / StringBuilder / 사용자 정의형 타입(struct, enum)
FanJae 2026. 4. 29. 18:181. string
1) string
- 문자열을 저장하는 참조형(Reference Type) 클래스다.
- 사용 방식은 값 형식처럼 동작하게 설계되어 있다.
- 실제 구현은 System.String 클래스이며, 내부적으로는 char 배열 기반의 불변 객체이다.
2) string의 불변성
① 특징
- 한 번 생성된 문자열은 수정이 불가능하다.
- 문자열 변경처럼 보이는 연산은 기존 string 객체를 수정하는 것이 아니라, 다른 string 객체를 참조하게 된다.
string str = "abc";
str = str + "123";
// "abc" 문자열 리터럴에 해당하는 string 객체는 관리 힙에 존재한다.
// str은 그 객체를 참조한다.
// str + "123" 연산은 기존 "abc" 객체를 수정하지 않는다.
// 런타임에 "abc123"에 해당하는 새로운 string 객체를 생성하고,
// str은 새로 생성된 "abc123" 객체를 참조하게 된다.
- 이때, "abc"나 "123" 등의 리터럴 값은 intern pool의 참조 여부에 따라 GC가 수집 여부를 결정한다.
3. StringBuilder
① 기존 string의 문제점
- string은 불변(Immutable)이지만, StringBuilder는 가변(Mutable)이다.
- string의 경우 문자열을 추가하면, 새로운 문자열을 생성하여 참조하게 만든다.
- StringBuilder 는 내부 버퍼를 변경하는 방식이다.
4. string이 제공하는 여러 메서드
① IndexOf() - 문자열 내에서 특정 문자/문자열이 처음 나타나는 인덱스를 반환하는 함수
string text = "Hello World!";
text.IndexOf("Hello");
// 결과 : 0
- 처음 나타나는 인덱스를 반환한다. Hello의 첫 글자 H가 0번째에 나타나므로 0을 반환한다.
- 찾지 못한 경우 -1을 반환한다.
② LastIndexOf() - 마지막으로 나타나는 인덱스를 반환하는 함수
string text = "Hello World!";
text.LastIndexOf("o");
// 결과 : 7
- 마지막으로 나타나는 인덱스를 반환한다. o가 마지막으로 나타나는 위치 7을 반환한다.
- 찾지 못한 경우 -1을 반환한다.
③ Contains() - 값이 ‘포함’ 되어 있는지 확인하는 함수
string text = "Hello World!";
text.Contains("Hello");
// 결과 : True
- 값이 포함되어있으면 True, 없으면 False 를 반환한다.
④ StartsWith() - 특정 문자열로 시작하는지 확인하는 함수
string text = "Hello World!";
text.StartsWith("Hello");
// 결과 : True
- 특정 문자열로 시작하면 True , 아니면 False 를 반환한다.
⑤ Replace() - 특정 문구를 다른 문구로 변경하는 함수
string text = "Hello World!";
text.Replace("World!", "FanJae!");
// 결과 : Hello FanJae!
- 특정 문구를 다른 문구로 변경할 때 사용한다.
⑥ Substring() - 문자열의 일부를 추출하는 함수
string text = "Hello World!";
text.Substring(0, 5); // 시작 인덱스와 길이
// 결과 : Hello
- 문자열의 일부를 추출할 때 사용할 수 있다.
⑦ Trim() - 앞 뒤 공백을 제거하는 함수
string text = " Hello World! ";
text.Trim();
// 결과 : Hello World!
- 앞 뒤 공백을 제거할 수 있다. 단, 중간 공백은 제거해주지 않는다.
⑧ Split() - 특정 기준자(Separator)를 기준으로 나누는 함수
string str9 = "C# Java Python C++";
string[] strArr = str9.Split(' '); // 기준자(여기서는 공백이다.)를 기준으로 하여 잘라 배열로 넣어준다.
foreach(string s in strArr)
{
Console.WriteLine(s);
}
// [출력 결과]
// C#
// Java
// Python
// C++
- 특정 기준자를 기준으로 문자열을 쪼개주는 함수다.
이외의 여러 메서드들은 공식 문서를 통해서도 확인할 수 있다.
Microsoft Learn : https://learn.microsoft.com/ko-kr/dotnet/api/system.string?view=net-10.0
String Class (System)
Represents text as a sequence of UTF-16 code units.
learn.microsoft.com
2. struct
1) struct의 정의
- struct는 데이터와 관련 기능을 묶을 수 있는 값 형식 자료형이다.
- 데이터를 저장하기 위한 단위 용도로 사용한다.
- 클래스처럼 다음 요소를 가질 수 있다.
필드
메서드
프로퍼티
생성자
- 값 타입이므로 스택에 저장되며, 클래스와 다르게 상속이 불가능하다.
- 단, struct가 배열의 요소이거나 class의 필드라면 힙에 저장된다.
- 해당 부분에 대한 자세한 내용은 별도의 포스트에서 다룬다.
2) 선언 방법
struct 구조체 이름
{
구조체 내용 형태
}
- 사용 형태는 기본적으로 struct 구조체 이름 { 구조체 내용 } 과 같은 형태로 사용한다.
- 구조체 내용으로는 변수와 메서드를 포함할 수 있다.
- 접근 지정자와 같은 것도 있을 수 있지만, 여기서는 다루지 않는다.(추후 객체지향에 대해 배울때 다시 정리한다.)
3) 기본 형태와 사용 방법
struct StudentInfo
{
public string name;
public int math;
public int english;
public int science;
public float Average()
{
return (math + english + science) / 3.0f;
}
}
- StudentInfo 구조체는 학생의 점수 데이터를 저장하고, 평균을 계산하는 메서드를 가진다.
① new를 사용한 방법
StudentInfo st = new StudentInfo();
st.math = 10;
st.english = 20;
st.science = 30;
Console.WriteLine(st.Average());
- new StudentInfo() 를 사용하면 구조체의 필드가 기본값으로 초기화된다.
② new 없이 사용하는 방법
StudentInfo st;
st.name = "홍길동";
st.math = 10;
st.english = 20;
st.science = 30;
Console.WriteLine(st.Average());
- 구조체는 new 없이도 선언할 수 있다.
- 모든 필드가 사용 전에 초기화 되어야 하며, 연관이 없는 필드도 모두 초기화를 진행해야 한다.
3. enum (열거형)
- enum 은 관련 있는 상수를 이름으로 묶어서 관리하는 값 형식이다.
1) enum의 특징
- 관련된 상수를 하나의 타입으로 묶을 수 있다.
- 숫자 대신 의미 있는 이름을 사용하므로 가독성이 좋아진다.
- 기본적으로 첫 값은 0부터 시작한다.
- 필요하면 값을 직접 지정할 수 있다.
- 상태, 방향, 옵션, 플래그 등을 표현할 때 사용한다.
2) 선언 방법
① 기본 형태
enum Direction
{
Up, // 0
Down, // 1
Left, // 2
Right // 3
}
Direction dir = Direction.Up;
- 위와 같은 형태로 사용할 수 있고, 명시적으로 지정할 수도 있다.
② 값 명시 형태
enum Direction
{
Up = 1,
Down = 2,
Left = 3,
Right = 4
}
- 이처럼, 각 값을 명시적으로 지정한 형태로 사용할 수도 있다.
3) switch와 enum
- enum 은 switch 문과 함께 자주 사용된다.
switch (dir)
{
case Direction.Up:
break;
case Direction.Down:
break;
case Direction.Left:
break;
case Direction.Right:
break;
}
- Visual Studio 등에서는 switch에 enum 변수를 넣으면 각 enum 값에 대한 case를 자동 생성해주는 기능이 있다.
'Unity > Unity 초격차캠프' 카테고리의 다른 글
| [20260430] 클래스(Class) (0) | 2026.04.30 |
|---|---|
| [20260429] 구조체(struct)와 클래스(class)의 차이점 (C#) (0) | 2026.04.29 |
| [20260428] 메서드(Method)와 배열(Array) (0) | 2026.04.28 |
| [20260427] C# 값 형식(Value Type)과 참조 형식(Reference Type) (0) | 2026.04.27 |
| [20260427] C#의 기본적인 내용 정리 (0) | 2026.04.27 |