본문 바로가기
공부/C#

C# 공부(3) 31~40

by 라이티아 2024. 8. 23.

31. String과 StringBuilder의 차이점

using System;
using System.Diagnostics;
using System.Text;

namespace A031
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder("This is a StringBuilder Test");
            Console.WriteLine($"{sb.ToString()} ({sb.Length} C)");

            sb.Clear();
            Console.WriteLine($"{sb.ToString()} ({sb.Length} C)");

            sb.Append("new string");
            Console.WriteLine($"{sb.ToString()} ({sb.Length} C)");

            sb.Insert(5, "xyz", 2);
            Console.WriteLine($"{sb.ToString()} ({sb.Length} C)");

            sb.Remove(5, 4);
            Console.WriteLine($"{sb.ToString()} ({sb.Length} C)");

            sb.Replace("xyz", "abc");
            Console.WriteLine($"{sb.ToString()} ({sb.Length} C)");

            Stopwatch time = new Stopwatch();
            string test = string.Empty;
            time.Start();
            for (int i = 0; i < 100000; i++)
            {
                test += i;
            }
            time.Stop();
            Console.WriteLine("String : " + time.ElapsedMilliseconds + "ms");

            StringBuilder test1 = new StringBuilder();
            time.Reset();
            time.Start();
            for(int i = 0; i < 100000; i++)
            {
                test1.Append(i);
            }
            time.Stop();
            Console.WriteLine("StringB : " + time.ElapsedMilliseconds + "ms");
        }
    }
}

 

결과

This is a StringBuilder Test (28 C)
 (0 C)
new string (10 C)
new sxyzxyztring (16 C)
new syztring (12 C)
new syztring (12 C)
String : 5592ms
StringB : 0ms

 

StringBuilder 클래스의 속성 - 메소드

 

Capacity

stringbuilder 객체에 할당된 메모리가 허용하는 최대 문자수를 가져오거나 설정함

Length

stringbuilder 객체의 길이를 가져오거나 설정함

 

Append

객체의 끝에 문자열 추가

Clear

객체의 모든 문자 제거

CopyTo

객체의 용량을 최소한 지정된 값이 되도록 함

EnsureCapacity

객체의 용량을 최소한 지정된 값이 되도록 함

Equals

이 객체가 다른 객체와 같은지를 bool값으로 리턴

Insert

특정한 위치에 지정한 문자열을 삽입

Remove

특정 위치에 있는 문자열을 삭제합니다

Replace

객체에서 문자 혹은 substring을 다른 문자 혹은 substring으로 대체합니다

ToString

객체의 값을 String으로 반환함

 

String을 계속해서 수정하는 경우, 직접적으로 수정하기 보다, StringBuiler 클래스를 사용하는게 메모리 최적화에 좋다는 이야기 같다.

 

32. 열거형 enum

using System;
using System.Drawing;

//열거형

namespace Part1
{
    class Program
    {
        enum Size
        {
            Short, Tall, Grande, Venti
        };
        static int[] price = { 3300, 3800, 4300, 4800 };
        enum Colors
        {
            Red = 1, Greem = 2, Blue = 4, yellow = 8
        };
        enum Coffee
        {
            Short = 3300, Tall = 3800, Grande = 4300, Venti =4800
        };
        static void Main(string[] args)
        {
            Console.WriteLine("커피 가격표");
            for(int i = 0; i<4; i++)
            {
                if(i == (int)Size.Short)
                    Console.WriteLine($"{Size.Short, 10} : {price[i]:C}");
                else if (i == (int)Size.Tall)
                    Console.WriteLine($"{Size.Tall,10} : {price[i]:C}");
                else if (i == (int)Size.Grande)
                    Console.WriteLine($"{Size.Grande,10} : {price[i]:C}");
                else if (i == (int)Size.Venti)
                    Console.WriteLine($"{Size.Venti,10} : {price[i]:C}");
            }

            Console.WriteLine("\n커피 가격표(enum)");
            foreach(var size in Enum.GetValues(typeof(Size)))
            {
                Console.WriteLine($"{size,10} : {price[(int)size]:C}");
            }
            Console.WriteLine("\nColors Enum iteration");
            foreach (var color in Enum.GetValues(typeof(Colors)))
            {
                Console.WriteLine($"{color, 10} : {Convert.ToInt32(color)}");
            }

            Console.WriteLine("\n커피 가격표 Enum");
            foreach(var coffee in Enum.GetValues(typeof(Coffee)))
            {
                Console.WriteLine($"{coffee,10} : {Convert.ToInt32(coffee):C}");
            }
        }
    }
}

 

결과

커피 가격표
     Short : \3,300
      Tall : \3,800
    Grande : \4,300
     Venti : \4,800

커피 가격표(enum)
     Short : \3,300
      Tall : \3,800
    Grande : \4,300
     Venti : \4,800

Colors Enum iteration
       Red : 1
     Greem : 2
      Blue : 4
    yellow : 8

커피 가격표 Enum
     Short : \3,300
      Tall : \3,800
    Grande : \4,300
     Venti : \4,800

 

열거형 Enum이다

내가 공부를 시작하게된 주범이다.

Enum안쪽에 들어간 값들은 상수로 판정되며 이를 유효 활용하면 최적화가 잘된다고 하는데...

아직은 잘 모르겠다

 

foreach사용법도 잘 알면 좋을 것 같다

 

33. 상수, const와 readonly

using System;

namespace A033
{
    class ConstEx { public const int Number = 3; }
    class ReadonlyEx
    {
        public readonly int Number = 10;
        public ReadonlyEx()
        {
            Number = 20;
        }
        public ReadonlyEx(int n)
        {
            Number = n;
        }
    }
    class Program
    {
        
        static void Main(string[] args)
        {
            Console.WriteLine(ConstEx.Number);
            ReadonlyEx inst1 = new ReadonlyEx();
            Console.WriteLine(inst1.Number);

            ReadonlyEx inst2 = new ReadonlyEx(200);
            Console.WriteLine(inst2.Number);

        }
    }
}

 

결과

3
20
200

 

const에 대한 내용의 코드이다. 고정된 값을 사용할때 주로 사용된다.

 

34. 값 형식과 참조 형식, ref 키워드

using System;

namespace A034
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "before passing";
            Console.WriteLine(s);

            Test(s);
            Console.WriteLine(s);
            Test(ref s);
            Console.WriteLine(s);
        }

        public static void Test(string s)
        {
            s = "REF check";
        }

        public static void Test(ref string s)
        {
            s = "REF check";
        }

    }
}

 

결과

before passing
before passing
REF check

 

cpp에서 사용되는 참조에 대한 개념이다. 메소드를 걸쳤을때 값이 변해야 하는 경우가 있는데, 이때 ref를 통하지 않으면, 지역변수로 판정되어서 값이 변하지 않는다. 이를 해결하기 위한 개념이다.

 

35. 배열과 객체를 메소드 매개변수로 전달

using System;

namespace A035
{
    class Student { public string name; }
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 10, 20, 30 };
            Console.WriteLine($"Main() before: arr[0] = {arr[0]}");
            Change(arr);
            Console.WriteLine($"Main() before: arr[0] = {arr[0]}");

            Student student = new Student();
            student.name = "test";
            Console.WriteLine($"Main() before: arr[0] = {student.name}");
            Change(student);
            Console.WriteLine($"Main() before: arr[0] = {student.name}");
        }
        private static void Change(int[] arr)
        {
            arr[0] = -10;
        }
        private static void Change(Student student)
        {
            student.name = "test_change";
        }
    }
}

 

결과

Main() before: arr[0] = 10
Main() before: arr[0] = -10
Main() before: arr[0] = test
Main() before: arr[0] = test_change

 

배열([]) 객체(class)의 경우 그 자체가 참조이기 때문에 ref가 붙지 않더라도 메소드를 통해 변경한 값이 유지가 된다

 

36. Null 조건 연산자(?)

using System;

namespace A036
{
    class Program
    {
        static void Main(string[] args)
        {
            string animal = null;

            Console.WriteLine("4글자 이상 동물 이름 출력");
            do
            {
                LongNameAnimal(animal);
            } while ((animal = Console.ReadLine()) != "");
        }
        private static void LongNameAnimal(string animal)
        {
            if (animal?.Length >= 4)
            {
                Console.WriteLine($"{animal} : {animal.Length}");
            }
        }
    }
}

 

결과

4글자 이상 동물 이름 출력
aaaa
aaaa : 4
bbbb
bbbb : 4
a
b
asfasf
asfasf : 6

 

변수?.메소드 의 형식 사용법이다

원래는 if is null && 조건 이렇게 사용하는데, 이를 간편화 시킨 방식이다

 

37. 변수의 초기화와 default

using System;
using System.Diagnostics;

namespace A037
{
    class Program
    {
        enum E { A, B, C };
        static void Main(string[] args)
        {
            int a = default;
            string s = default;
            Console.WriteLine("a = " + a);
            Console.WriteLine("s = " + s);

            Console.WriteLine("E = " + default(E));
            Console.WriteLine("E = " + (E)0);

            TList<int> List = new TList<int>();
            Console.WriteLine("List : " + List.GetLast());

            TList<string> List2 = new TList<string>();
            Console.WriteLine("List : " + List.GetLast());
        }
    }
    public class TList<T>
    {
        private class Node
        {
            public T data;
            public Node next;
        }
        private Node head = default;

        public void addNode(T t)
        {
            Node node = new Node();
            node.next = head;
            node.data = t;
            head = node;
        }
        public T GetLast()
        {
            T temp = default(T);

            Node current = head;
            while (current != null)
            {
                temp = current.data;
                current = current.next;
            }
            return temp;
        }
    }
}

 

결과

a = 0
s =
E = A
E = A
List : 0
List :

 

변수에 아무것도 넣지 않은 상태라면 오류가 생길 수 있기에, 빈값인 null을 넣는데, 이를 일일이 확인하면서 넣기 힘든경우 대충 defualt로 넣으라는 의미인 것 같다

의미있게 볼만한 영역은 T를 사용하는 것인데, var과 비슷하게 작동하나, 자료형을 인식 받아서 자동으로 넣는 차이가 있다.

 

38. nullable 형

using System;

namespace A038
{
    class Program
    {
        static void Main(string[] args)
        {
            int? i = null;
            Console.WriteLine(i.GetValueOrDefault());

            if (i.HasValue)
                Console.WriteLine(i.Value);
            else
                Console.WriteLine("null");

            int? x = null;
            int j = x ?? 0;
            Console.WriteLine($"x = {x}, j = {j}");

            Console.WriteLine($"x >= 10 ? {x >= 10}");
            Console.WriteLine($"x < 10 ? {x < 10}");

            if (Nullable.Compare<int>(i, j) < 0)
                Console.WriteLine("i < j");
            else
                Console.WriteLine("i = j");
        }
    }
}

 

결과

0
null
x = , j = 0
x >= 10 ? False
x < 10 ? False
i < j

 

변수값에 null을 넣을수 없는 경우에도 null을 넣을 수 있게 해주는 nullable에 대한 코드이다.

보통 자료형? 변수명 = null로 사용하는 것 같다

또한 ??라는 것도 있는데 이는 삼항 연산자와 비슷하게 앞의 변수가 null일시 ??의 뒤에 있는 값을 넣는것이다.

즉, a = b ?? 3일시 b가 null이면 3이 들어가고 아닐시 b가 들어간다

 

39. object 타입과 박싱, 언박싱

using System;

namespace A039
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 123;
            object o = i;
            i = i + 10;
            int j = (int)o;
            Console.WriteLine($"V type i = {i}");
            Console.WriteLine($"O type o = {o}");
            Console.WriteLine($"V type j = {j}");

            object p = o;
            o = 100;

            Console.WriteLine($"O type o = {o}");
            Console.WriteLine($"O type p = {p}");
        }
    }
}

 

object형식에 대한 이야기이다. 모든 자료형의 부모인게 포인트

박싱 - 언박싱은 제네릭이 있기 이전에 사용한 것 같은데, 굳이 사용할 필요는없는 것 같다. 지식적인 부분이 강한 코드

 

40. if else 조건문

using System;

namespace A040
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("입력 : ");
            string input = Console.ReadLine();

            while (input != "Q")
            {
                Console.WriteLine($"{input} : 입력함");
                Console.Write("입력 : ");
                input = Console.ReadLine();
            }
            Console.WriteLine("종료");
        }
    }
}

 

너무 기초 문법이라 대충 작성했다

 

GitHub - NoNamed02/C-sharp-Studying: C#언어 공부 정리

C#언어 공부 정리. Contribute to NoNamed02/C-sharp-Studying development by creating an account on GitHub.

github.com

 

'공부 > C#' 카테고리의 다른 글

C# 공부(5) 51~56 (Part 1 End)  (0) 2024.08.24
C# 공부(4) 41~50  (0) 2024.08.24
C# 공부(2) 21~30  (0) 2024.08.22
C# 공부(2) 11~20  (0) 2024.08.21
C# 공부(1) 1~10  (1) 2024.08.21