스마트한 개발 공부/C#

[C#] Random 을 사용과 입력값 형변환 및 String 타입(가변, 불변)

스마트한지노 2021. 8. 14. 12:46
728x90
반응형

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에 저장된 값을 계속 바꿔주기 때문에 가비지 데이터가 생기지 않는다.

728x90
반응형