1. Random 사용 및 입력값 형 변환
Random 메서드를 사용하여 일정 범위에서 임의의 정수를 추출한 뒤 이를 int형으로 변환시키는 예제이다.
class RandomTest
{
static void Main()
{
Random rnd = new Random();
int com = rnd.Next(10, 100); //10~99
Console.Write("수입력 (10~99) : ");
int user = int.Parse(Console.ReadLine());
if (com == user)
Console.WriteLine("정답");
else if (com > user)
Console.WriteLine("Up");
else
Console.WriteLine("Down");
}
}
Random을 사용하기 위해서는 Random 클래스로 instance를 생성해 주어야 한다.
객체명. Next(minValue, maxValue)를 사용하면 변수에 최솟값과 최댓값 사이에서 임의의 숫자를 할당한다. maxValue에서 1 작은 값이 범위로 주어지기 때문에 99까지의 숫자를 출력하고 싶다면 100을 넣어줘야 한다.
입력값을 int형으로 바꾸는 방법은 여러 가지이다.
int user = int.Parse(Console.ReadLine());
int user = Convert.ToInt32(Console.ReadLine());
success = int.TryParse(Console.ReadLine(), out int user)
- int.Parse는 값을 int로 변환해주는데 문자열만 가능하다. null 값이 들어오거나 변환할 수 없을 때는 오류가 난다.
- Convert.ToInt32는 형 변환을 위해서. net에서 기본으로 제공해주는 System.Convert 클래스이다. int.Parse와 다른 점은 null 값이 들어왔을 때 오류가 나지는 않고 0을 리턴한다.
- int.Tryparse(string 입력값, out type 출력 값)는 bool 타입 함수이다. 입력값이 잘 들어오면 success는 true, out으로 정한 변수 출력 값에 변환한 입력값을 반환해준다. 그렇지 않으면 success에는 false를 반환하고 out으로 정한 변수에는 0을 반환한다.
2. int형 변환 및 string 타입
//명시적 형변환
/int k = (int)10.5;
Console.WriteLine(k);
k = Convert.ToInt32(10.5);
Console.WriteLine(k);
//암시적 형변환
int tot = 30 + 20 + 10;
double avg = tot / 3.0;
2.1 명시적 형 변환과 암시적 형변환
2.1.1 명시적 형변환
명시적 형 변환은 내가 변환하려는 type을 직접 선언해서 변환하는 방법이다
- type s = (type) w : w를 type으로 변환시키는 방법이다. int type은 정수이기 때문에 10.5를 int로 변환시키면 10이 출력된다.
- System.Convert 클래스에서 Convert.ToInt32는 int 타입 반환 함수이다. 그리므로 10.5를 10으로 반환한다.
2.1.2 암시적 형 변환
암시적 형 변환은 내가 선언하지 않더라도 변환이 가능한 경우 시스템이 자동으로 변환을 해주는 것이다.
- double avg = tot / 3.0 같은 경우는 tot는 int 형 변수이다. int형 변수는 double 형 변수의 하위에 속해있는 type이기 때문에 int형 변수를 double 형인 3.0으로 나누면 자동으로 형 변환이 되어 값이 계산된다.
2.2 string 타입 (가변/ 불변)
값 타입은 new를 선언하지 않아도 되지만 참조 타입 같은 경우에는 new를 선언해서 객체를 만들어야 한다. new가 선언될 때 heap에 공간(instance)이 만들어지는데 string은 참조타입 중에서 유일하게 new 없이 사용이 가능하다. (너무 많이 쓰다 보니 기본으로 만들었나 보다)
string은 불변 타입 (immutable)이라 문자열을 합쳐서 작업하지 않는 게 좋은데 이는 string을 사용할 때마다 heap에 공간을 생성하고 이에 따라서 garbage라고 하는 필요 없는 데이터가 너무 많이 생겨서 성능 저하를 일으킨다. (요즘 컴에는 별 영향을 못 끼지지만..
str = "안녕하세요. '홍길동'님";
str = str+ "\n안녕하세요. \"홍길동\"님";
str = str + "\n안녕하세요. \\홍길동\\님";
str = str + "반갑습니다";
다음과 같이 코드를 짜면 str은 1개인 것처럼 보이겠지만, heap에는 총 4개의 instance가 생성이 되고 전에 생성됐던 3개의 instance는 아무것도 가리키고 있지 않은 가 바지 데이터가 된다.
이를 해결하기 위해서 가변 타입으로 string을 만들어 사용할 수도 있다. stringBuilder 클래스를 이용하면 가변 타입(mutable)이므로, 가비지가 생기지 않는다.
StringBuilder sb = new StringBuilder();
sb.AppendLine("abc");
sb.Append("abc");
sb.Append("abc");
Console.WriteLine(sb.ToString()); //ToString은 instance 값을 string으로 출력해준다.
StringBuilder class로 만들어진 객체는 새로 instance를 만들지 않고 해당 instance에 저장된 값을 계속 바꿔주기 때문에 가비지 데이터가 생기지 않는다.
'스마트한 개발 공부 > C#' 카테고리의 다른 글
[C#] 상속과 interface(인터페이스) 그리고 abstract class(추상 클래스) (0) | 2021.08.18 |
---|---|
[C#] Method의 Parameter 전달방식과 Shallow, Deep Copy (0) | 2021.08.17 |
[C#] 사용자 정의 함수 (Method) (0) | 2021.08.15 |
[C#] 제어문(선택문 - 연산자, if, switch && 반복문 - for, while ) (0) | 2021.08.14 |
[C#] Data Type의 종류 및 특징과 형 변환 (0) | 2021.08.03 |