14.August.2023 (다차원 배열, 오버로딩)

정제로·2023년 8월 14일
0

C#

목록 보기
15/30

다차원 배열

2차원, 3차원,,,, n차원 배열!

1차원 배열

  • 타입[] 변수명 = new 타입[배열크기];
    or
  • 타입[] 변수명 = new 타입[배열크기] { 요소1, 요소2, 요소3,,,,};
ex)
//사용법 1
int[] ints = new int[5];
ints[0] = 1;
ints[1] = 2;
ints[2] = 3; .....

//사용법 2
int[] ants = new int[5] { 1, 2, 3, 4, 5, };

//자료형 아무거나 다 가능하다! 
string[] names =- new string[3] { "김아무개", "홍길동", "정철" };

이런식으로 1차원 배열은 쉽게 이해가능하다

2차원 배열

2차원 배열부터는 테이블(표)를 생각하면 개인적으로 편한듯 하다.

  • 타입[,] 변수명 = new 타입[행 크기 , 열 크기];
    or
  • 타입[,] 배열이름 = new 타입[,] { {요소11,요소12,...,},{요소21,요소22,...}, ...};
    or
  • 타입[,] 배열이름 = new 타입[4,5] { {요소11, 요소12, 요소13, 요소14}, {요소21, 요소22....} };
ex)
//사용법 1
int[,] arr = new int[2,2];
arr[0,0] = 10;
arr[0,1] = 0;
arr[1,0] = 0;
arr[1,1] = 11;

//출력
10 0
0 11

//사용법 2
int[,] arr2 = new int[5,5]
{
	{1, 1, 1, 1, 1},
    {0, 0, 0, 0, 0},
    {1, 1, 1, 1, 1},
    {0, 0, 0, 0, 0},
    {1, 1, 1, 1, 1}
};

//출력
1 1 1 1 1
0 0 0 0 0
1 1 1 1 1
0 0 0 0 0
1 1 1 1 1

이런식으로 행과 열에 맞는 값을 넣어주면 된다!

2차원 배열로 맵 구성해보기!

//2차원 배열로 맵 구성해보기!
int[,] map = new int[5, 5]
{
    { 1, 1, 1, 1, 1 },
    { 1, 0, 0, 0, 1 },
    { 1, 0, 1, 0, 1 },
    { 1, 0, 0, 0, 1 },
    { 1, 1, 1, 1, 1 }
};

for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 5; j++)
    {
        if (map[i, j] == 1)
        {
            Console.Write("■ ");
        }
        else
        {
            Console.Write("□ ");
        }
    }
    Console.WriteLine();
}

출력!

3차원 배열

사용할 일 거의 없으니 나중에 필요하면 공부해서 사용하자!
사용법은 이해가 되는데 출력이 이해가 불가능한 수준임ㅋㅋㅋㅋㅋ


오버로딩

using System;

namespace BJ
{
    class Program
    {
        

        static int Addnum (int a, int b)
        {
            return a * b;
        }
        
        //static long Addnum (int a, int b)
        //{
        //    return a * b;
        //}
        
        static int Addnum (int a, int b, int c)
        {
            return a * b * c;
        }

        static float Addnum (float a, float b)
        {
            return a * b;
        }

        static void Main(string[] args)
        {
            int multi1 = Addnum (1, 2);
            int multi2 = Addnum (2, 3, 4);
            float multi3 = Addnum(3.3f, 4.6f);
        }
    }

}

위의 식을 보자.
static long Addnum (int a, int b)
{
return a * b;
}
이 식이 안되는 이유는, int반환값인 int Addnum(int a, int b)가 이미 있는데,
그 형식을 똑같이 long으로 받으려해서 그렇다

아무튼 이런식으로 한가지의 메서드 이름을 오버로딩(overloading : 과적하다), 말 그대로 한 메서드를 여러 방법으로 이용할 수 있도록 도와주는 방법이다!


재귀함수

using System;
namespace BJ
{
    class Program
    {
            static void **CountDown**(int n)
        {
            if (n <= 0)
            {
                Console.WriteLine("Done");
            }
            else
            {
                Console.WriteLine(n);
                **CountDown**(n - 1);
            }
        }
        static void Main(string[] args)
        {
            CountDown(5);
        }
    }
}
이렇게 함수 자신 내부에서 자신을 불러오는것을 재귀함수 라고 함.
  1. 주의점
    1. 재귀 호출은 복잡한 문제를 단순한 방식으로 해결할 수 있는 장점이 있다
    2. 재귀 호출을 사용할 때 주의해야 할 점은 종료 조건을 명확히 정의해야 하며, 종료 조건을 만족하지 못하면 무한히 재귀 호출이 반복되어 무한루프에 걸린다.
    3. 재귀 호출은 메모리 사용량이 더 크고 실행 속도가 느릴 수 있으므로, 적재적소의 상황에 사용해야 한다.

심심해서 해본 피라미드 별찍기 (성공!)

using System;

namespace BJ
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("Enter Natural Odd Number");
                int num = int.Parse(Console.ReadLine());

                if (num <= 0)
                {
                    Console.WriteLine("Re-enter Natural Odd Number");
                }

                else if (num > 151)
                {
                    Console.WriteLine("Re-enter Under 151, Odd Number");
                }

                else if (num % 2 != 0)
                {
                    Pyramid(num);
                    break;
                }
                else if (num % 2 == 0)
                {
                    Console.WriteLine("Re-enter Natural Odd Number");
                }
            }
        }

        static void Pyramid(int num)
        {
            for (int i = 0; i < num; i++)
            {

                for (int j = 0; j < num - 1 - i; j++)
                {
                    Console.Write(" ");
                }
                for (int z = 0; z < i; z++)
                {
                    Console.Write("+");
                }

                for (int a = 0; a < num * 2; a++)
                {
                    if (a == num / 2)
                    {
                        Console.Write("+");
                    }
                }

                for (int t = 0; t < i; t++)
                {
                    Console.Write("+");
                }
                for (int e = num - 1; e > i; e--)
                {
                    Console.Write(" ");
                }
                Console.WriteLine();
            }
        }
    }
}

중간을 기준으로 좌로 입력된 값 -1, 우로 입력된값 -1개 있으니,
순서대로 좌 입력된 값 -1, 입력된값/2, 우 입력된 값 -1 출력하는 순서로 작성했다.
이런접근방식이 맞는지 모르겠는데, 잘 작동되니 만족!

반복문 빠져나가기, 건너띄기

  1. break 문: 현재 루프나 switch 문에서 빠져 나올 때 사용합니다.

  2. continue 문: 루프의 현재 반복을 건너뛰고 다음 반복을 계속하는 데 사용됩니다.

  3. return 문: 메서드를 종료하고 호출한 메서드에 값을 반환하는 데 사용됩니다.


char형을 int형으로 쉽게 변환하기

'0'과의 차이

using System;
 
public class Example
{
    public static void Main()
    {
        char ch = '9';
        int intVal = ch - '0';
 
        Console.WriteLine(intVal);
    }
}

출력 -> 9

0을 안빼면 자동으로 int형으로 형변환, 그 int형에 맞는 아스키 코드값으로 변환되어 이상한 숫자가 출력된다.
뒷쪽에 '0'을 해주는것만으로도 쉽게 변환할수있다

ASCII 코드에서 숫자 '0'부터 '9'까지의 값은 연속적으로 정의되어 있다.
'0'의 ASCII 코드 값은 48이며, '1'은 49, '2'는 50, ... , '9'는 57이다.
이때, char 형 변수에 숫자 문자가 저장되어 있다면 '0'을 빼면 해당 숫자의 정수 값이 얻어진다.
예를 들어, '3'(51)에서 '0'(48)을 빼면 3이 됩니다.

int32.Parse메서드

using System;
 
public class Example
{
    public static void Main()
    {
        char ch = '9';
        int intVal = int.Parse(ch.ToString());
 
        Console.WriteLine(intVal);
    }
}

대신 char형을 바로 int로 형변환이 안되기에, ToString으로 문자열로 변환해준 후 int형으로 변환해준다

profile
초보자입니다.. 잘못된 정보, 달게 받겠습니다..

0개의 댓글

관련 채용 정보