공부/C#

[C#] 이차원 배열과 구조체, static과 트럼프 카드 출력 코드

굴러다니다니 2023. 3. 20. 17:19
728x90

2차원 배열

 1차원으로 쭉 나열했던 배열을 2차원으로 개념을 넓혔다.

 기존의 1차원 배열은 

   int[] arr = new int[n];

 식으로 선언했다면

   int[,] arr = new int[i, j];

 식으로 콤마를 넣는게 두드러지는 특징이다.

또한 int[,] arr = new int [3, 2];로 작성한다면

가로가 3칸 세로가 2칸이 아니라

세로가 3칸 가로가 2칸이다.

따라서 아래 그림처럼 하려면 new int [2, 3]으로 해야한다. 

            [] [] []
            [] [] []

for (int i = 0; i < arr_2.GetLength(0); i++)
{
 	for (int j = 0; j < arr_2.GetLength(1); j++)
 	{
 		arr_2[i, j] = rnd.Next(0, 70);
	}
}

 

크기가 이미 정해져 있는 거는 대부분 길이를 가지고 올 때 Length 사용한다.
  크기가 정해져 있지 않으면 count를 사용한다.

또한 위의 GetLength(0)은 세로의 수만큼 반복, GetLength(1) 은 가로의 수만큼 반복하기 위해 사용되었다.

 

 static int[,] Create_array(int length)
{
	Random rnd = new Random();
           
	for (int i = 0; i < length; i++)
	{
		for (int j = 0; j < arr.GetLength(1); j++)
		{
			arr[i, j] = rnd.Next(0, 70);
		}
	}
	for (int i = 0; i < arr.GetLength(0); i++)
	{
		for (int j = 0; j < arr.GetLength(1); j++)
		{
			Console.Write("| {0:D2} |", arr[i, j]);
		}
	Console.WriteLine();
	}
	Console.ReadLine();
	Console.Clear();
	return arr;
}

위의 코드는 length를 입력받아 반복문을 통해 array에 랜덤한 값을 집어넣는 for문과, 이를 출력해 보여주는 for문으로 이루어져 있다.

실행해보면 이는 length길이의 랜덤한 값을 저장하는 array를 리턴해준다.


static 전역 정적

위의 함수 선언에 사용된 static은 무엇일까

static은 정적인 메서드이며, 객체 생성을 안하고 직접 클래스명.메서드명 형식으로 호출하는 메서드라고 한다.

메서드 내부에서 클래스의 객체 멤버를 참조하면 안된다고 하며 클래스명과 함께 사용되어야 한다고 한다.

전역 정적으로 프로그램 실행과 동시에 메모리에 할당된다.

특징으로는

 - 정적 멤버함수 

    -> static이라고 선언이 되어 있는 것은 객체를 생성하지 않고도 클래스 이름만으로 호출 가능하다

 - 생성할 때 new를 써야되지만 static은 new를 안써도 된다
    -> static class program() -> 선언 후 call 할 때 program.메소드 이렇게 호출하면 됨
 - 객체를 생성하지 않으므로 this 포인터를 가질 수 없다.
    -> this는 클래스에 선언되어 있는데, 매개변수와 이름이 동일한 경우 매개변수를 불러오는 것이 아닌 클래스의 변수를 불러올 때 사용한다

 - 특정 객체(class)와 결합되지 않으므로 정적 멤버 변수밖에 사용할 수 없다


   +       반환형 
            void: 비어있다, 반환되는 것이 없다.
            자료형: 반환될 형태 지정

            구조체 : struct
               자료구조는 변수를 담거나 데이터를 담는 공간
               구조체는 데이터를 만드는 틀

       

  static local (지역변수)
메모리 할당 시기 프로그램의 로드와 동시에 할당 해당 지역에 들어왔을 때 할당
사용 범위 어디서든 쓸 수 있음 (global) 해당 지역에서만 사용 가능 (local)
메모리 해제 시기 프로그램 종료시 해제 해당 지역을 벗어나면 해제

 


52장의 카드를 위의 개념을 적용해 나타내보자

   

public struct card
{
	public char pattern;
    public int number;
}

static char select_pattern(Pattern p) 
    {
    	switch (p)
        {
        	case Pattern.spade:
                    return '♠';
                    break;
            case Pattern.heart:
                    return '♥';
                    break;
            case Pattern.diamond:
                    return '◆';
                    break;
            case Pattern.clover:
                    return '♣';
                    break;
            default:
                    return new char(); //return문의 기본 값을 지정해줘야 오류없이 실행 가능하다
		}
	}

구조체 card에 문양과 숫자를 받을 수 있게 선언해주었다.

select_pattern은 enum인 pattern을 받아 switch로 char의 타입으로 바꿔준다.

 

public enum Pattern
{
	spade = 0, 
	heart,
	diamond,
	clover
}

enum선언을 위와 같이 한다면 hear는 그 다음값인 1, dia는 2,,, 자동으로 할당된다.

 

card[] cards = new card[52];
//card는 구조체, 구조체의 멤버를 불러오고 싶다면 cards[i].number
for (int i = 0; i < cards.Length / 4; i++)
{
	cards[i].number = i + 1;
	cards[i + 13].number = i + 1;
	cards[i + 26].number = i + 1;
	cards[i + 39].number = i + 1;
}
for (int i = 0; i < cards.Length / 4; i++)
{
	cards[i].pattern = select_pattern(Pattern.spade);
	cards[i+13].pattern = select_pattern(Pattern.heart);
	cards[i+26].pattern = select_pattern(Pattern.diamond);
	cards[i+39].pattern = select_pattern(Pattern.clover);
}

for (int i = 0; i < cards.Length; i++)
	{
	Console.WriteLine($"| {cards[i].pattern} {cards[i].number} |");
	}
}

for문을 돌며 number에 i값의 숫자를 받아 1~13까지 4세트가 나오며

아래의 for문을 돌며 4세트의 문양들이 나온다

이를 다시 for문을 돌려 출력하면 트럼프 카드들이 출력된다.

728x90