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("종료");
}
}
}
너무 기초 문법이라 대충 작성했다
'공부 > 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 |