Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

I'm FanJae.

[20260429] string / StringBuilder / 사용자 정의형 타입(struct, enum) 본문

Unity/Unity 초격차캠프

[20260429] string / StringBuilder / 사용자 정의형 타입(struct, enum)

FanJae 2026. 4. 29. 18:18

1. 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를 자동 생성해주는 기능이 있다.

 
Comments