본문 바로가기

   
Programming/C#

배열

반응형

배열(Array)

 - 같은 데이터행을 갖는 공간의 집합

 - 하나의 변수명을 가지고 여러개의 공간 집합에 접근가능

 - 구조체

 

배열 선언

 - 우리가 생성하는 모든 배열은 System.Array 클래스를 상속받음

 - 자료형[차원] 배열명 = new 자료형[요소갯수] {초기화리스트};

 - int[] nums = new int[5];

 - 선언시 배열의 길이 (방의 갯수) 가 결정

 

배열 접근

 - 배열명[인덱스] = ;

 - 인덱스 사용 주의

 

int n; 선언시 어딘진 모르지만 스택에 n이라는 이름으로 4byte가 잡힌다.

int m; 선언시 똑같이 m이라는 이름으로 4byte가 잡힌다.

 

struct num

//구조체로 만들게 되면 단순 선언일뿐 메모리에 잡히진 않는다. num이라는 변수를 생성해야만 스택영역에 공간이 잡히게 된다.

{

public int n;

public int m;

}

 num.으로 접근한다 구조체는

 

int[] nums = new int[2]; nums라는 이름으로 4byte 4byte 2개의 공간이 하나로 합쳐서 나타나게 된다.

 

구조체 와 배열의 특징 구조체는(멤버변수) 타입에 대한 제한이 없다.구조체는 int n, byte m 을 선언이 가능하다.

 

배열은 같은 타입만 연달아 이을수 있는게 배열이다. int n, int m 이러한 형태로 밖에 지정 해야한다. 하나의 타입만 가능

 

배열은 클래스의 한종류다.

1. 자료형선언(데이타 타입결정) int or string or char ..

2. [] => 배열이라는 뜻으로 연속된 공간을 할당 받겠다.

3. 공간 즉 변수 선언

4. new int [3];

완성문 : int [] ns = new int[3];

 

배열은 각각의 방에 이름이 없다. 구조체와 다르게 그래서 대신 배열의 각방을 위치로 인식한다.

[0] 0번째방 [1] 1번째방 [2] 2번째방

 

방을 찾아가는 방법 ns[0] 배열변수 이름 0번째방

 

ns[0]  ns[1] ns[2]

 

방하나 하나의 이름은 요소(엘리먼트, 데이타)

 

 using System;

 

namespace Csharp

{

       class Ace

       {

        public static void Main(string[] args)

        {

            //사용이유

            //3..국어..점수 관리

            //30..

            //300..

            int kor1 = 100;

            int kor2 = 90;

            int kor3 = 70;

 

            int total1 = kor1 + kor2 + kor3;

            Console.WriteLine("평균 : {0:N1}", total1 / 3.0);

 

            //배열사용

            //변수선언 3개와 같은 효과

            int[] kors = new int[100];

 

            //kors[index]의 타입은 int 입니다.

            kors[0] = 98;

            kors[1] = 85;

            kors[2] = 48;

            kors[2] = 48;

 

            //배열은 index는 변수로 제어할수 있다

            //int total2 = kors[0] + kors[1] + kors[2];

            int total2 = 0;           

 

            for (int i=0; i<100; i++)

            {

                total2 += kors[i];

            }

 

            Console.WriteLine("평균 : {0:N1}", total2 / 3.0);

 

        }

       }

 

}

 

using System;

 

namespace Csharp

{

       class Ace

       {

        public static void Main(string[] args)

        {

            M1();

        }

 

        public static void M1()

        {

            //배열 300개정도 입력 -> 출력

            int[] num = new int[150];//0~299

 

            Random rnd = new Random();

 

            //i를 배열의 index 사용

            for(int i=0; i<150; i++)

            {

                //0~99 중 난수

                num[i] = rnd.Next(100);

            }

 

            for(int i=0; i<150; i++)

            {

                Console.WriteLine("nums[{0}] = {1}", i, num[i]);

            }

   

        }

 


 


       

     public static void M2()

        {

            //배열 사용시에는 방을 미리 계산해서 방의 길이를 가늠한뒤에 해야 문제가 생기지 않는다.

            //배열은 각방의 형태가 값형(Value Type)이면 자동으로 초기화를 해준다.

            int[] num = new int[3];

 

            Console.WriteLine(num[0]);

 

            //방번호의 최대숫자(index) = 배열의 길이 - 1

            //컴파일에서는 이상이 없다. 런타임에서 에러가난다.

            //Console.WriteLine(num[3]);

           

            for(int i=0; i<3; i++)

            {

                Console.WriteLine(num[i]);

            }

            //다른 언어에서 3번째 방이 자동 생성 되지만 c#에서는 되지 않는다.

            //num[3] = 100;

        }

 


 

 

     public static void M3()

        {

            //배열의 길이는 불변이지만...배열의 길이를 런타임시 결정하는건 가능!!

            //프로그램 실행중에 변경 가능

            Console.Write("숫자 : ");

 

            int n = int.Parse(Console.ReadLine());

           

            //**프로그램 실행중에 사용자가 결정할 것이다.

            //**컴파일당시 고정은 아니지만 결정 후엔 고정이 된다.

            int[] num = new int[n];

 

            for (int i=0; i<n; i++)

            {

                Console.WriteLine(i);

            }

        }

 


 

         public static void M4()

        {

            int [] num = new int[5];

 

            Console.WriteLine(num.Length);

           

            //while 도가능 배열탐색 - for문 가독성 때문에

            for(int i=0; i<num.Length; i++)

            {

                num[i] = i + 1;

            }

           

            for(int i=0; i<num.Length; i++)

            {

                Console.WriteLine(num[i]);

            }

        }

 


 

public static void M5()

        {

            string[] name = new string[3];

            //빈 문자열 변수 초기화

            //string str = " ";

            name[0] = "홍길동";

            name[1] = "김종현";

            name[2] = "아이유";

 

            for(int i=0; i<name.Length; i++)

            {

                Console.WriteLine("{0}님 안녕하세요", name[i]);

            }

            //배열은 어떠한 형 도 가능하다.

            /*

            byte[] num = new byte[3];

            num[0] = 100;

 

            bool[] flags = new bool[3];

            flags[0] = true;

            flags[1] = false;

            flags[2] = false;

            */

 

        }

 

 

using System;

 

namespace Csharp

{

 

       struct Student

       {

             public string name;

             public int kor;

             public int eng;

             public int math;

             public int total;

             public double avg;

       }

 

       class ArrayLoop

       {

             public static void Main(string[] args)

             {

                    M6();

             }

 

             public static void M6()

             {

                    //학생 성적 관리 -> 구조체 -> 3

                    //Student s1;

                    //Student s2;

                    //Student s3;

 

                    Student[] list = new Student[3];

 

                    list[0].name = "홍길동";

                    list[0].kor = 100;

                    list[0].eng = 90;

                    list[0].math = 80;

 

                    list[1].name = "아무게";

                    list[1].kor = 80;

                    list[1].eng = 70;

                    list[1].math = 85;

 

                    list[2].name = "하하하";

                    list[2].kor = 95;

                    list[2].eng = 60;

                    list[2].math = 75;

 

                    for (int i = 0; i < list.Length; i++)

                    {

                           list[i].total = list[i].kor + list[i].math + list[i].eng;//총점

                           list[i].avg = list[i].total / 3.0D;

                    }

 

                    //출력

                    Console.WriteLine("[이름]\t[국어] [영어] [수학] [총점]  [평균]");

                    for (int i = 0; i < list.Length; i++)

                    {

                          Console.WriteLine("{0}\t{1,5}{2,7}{3,7}{4,7}{5,8:N1}", list[i].name, list[i].kor, list[i].eng, list[i].math, list[i].total, list[i].avg);

                    }

 

             }

 

       }

}

 

 

 

        public static void M7()

             {

                    //초기화리스트

                    // -> 배열을 선언과 동시에 원하는 값으로 초기화 방법

 

                    //A.

                    //int n1;//a

                    //n1 = 10;//b - 초기화(O)

                    //n1 = 20;//c - 치환

 

                    //B.

                    //int n2 = 20;//a

 

                   

                    //A.

                    int[] ns = new int[3];//a - 초기화 O으로..

                    ns[0] = 100;//b - 치환

                    ns[1] = 200;

                    ns[2] = 300;

 

                    //B. 초기화 리스트(index == 초기데이터의 갯수)

                    int[] ns2 = new int[3] {10, 20, 30};//O

 

                    int[] ns3 = new int[] {10, 20, 30};

 

                    int[] ns4 = {10, 20, 30};//O

 

                    int[] ns5;

                    ns5 = new int[3] {10, 20, 30};

 

                    //int[] ns6;

                    //ns6 = {10, 20, 30};//X

 

                   

             }

 

 

 

 //배열의 차원

int[i] ns = new int[10] ;

1차원 배열 1

2차원 배열 1 + 1

3차원 배열 1 + 1 + 1

4차원 배열  3 + 3

 

3차원까지 사용한다 대부분

공간을 효율 적으로 사용하기위 만든것

using System;

 

namespace Csharp

{

       //Ex64_Array.cs

       class Ex64_Array

       {

             public static void Main(string[] args)

             {

                    //배열의 차원

 

                    //2차원 배열  ns[2,3]

 

                    //int[] nums;//1차원

                    //int[,,] nums;//3차원

                    //int <> byte

                    //int[] <> int[,]

 

                    int[,] nums = new int[2,3];//2차원

 

                    nums[0,0] = 10;

                    nums[0,1] = 20;

                    nums[0,2] = 30;

                    nums[1,0] = 40;

                    nums[1,1] = 50;

                    nums[1,2] = 60;

                   

                    //2차원 배열의 탐색

                    for (int i=0; i<2; i++)

                    {

                           for (int j=0; j<3; j++)

                           {

                                 //Console.WriteLine("{0},{1}", i, j);

                                 Console.WriteLine("nums[{0},{1}] = {2}", i, j, nums[i,j]);

                           }

                    }

                   

 

 

             }

       }

}

 

 






using System;

 

namespace Csharp

{

       class Ace

       {

             public static void Main(string[] args)

             {

                    //1차원 배열 - 단일 for문 탐색

                    int[] ns1 = new int[3] { 100, 200, 300 };

 

                    //2차원 배열 - 2 for문 탐색

                    //{{}, {}} 초기화

                    int[,] ns2 = new int[2, 3] { { 1, 2, 3 }, { 4, 5, 6 } };

 

                    //3차원 배열

                    int[, ,] ns3 = new int[2, 3, 3] { { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } }, { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } } };

 

                    int n = 1;

 

                    for (int i = 0; i < 2; i++)

                    {

                           for (int j = 0; j < 3; j++)

                           {

                                 ns2[i, j] = n;

                                 n++;

                           }

                    }

 

                    for (int i = 0; i < ns2.GetLength(0); i++)

                    {

                           for (int j = 0; j < ns2.GetLength(1); j++)

                           {

                                 Console.WriteLine(ns2[i, j]);

                           }

                    }

 

                    //배열의 길이 : 차원에 상관없이 방의 총 갯수

                    //프로퍼티(속성

                    Console.WriteLine(ns2.Length);

                    Console.WriteLine(ns2.GetLength(0));

                    Console.WriteLine(ns2.GetLength(1));

 

                    // ns1탐색

                    // foreach : 배열, 컬렉션등 탐색 사용 반복문(전용 반복문)

                    // 자료형 변수 in 배열 데이터 형태만 잘지켜준다.

                    // 가독성이 높고 가장 단순한 반복문

                    // 속도가 가장 빠름

                    foreach (int n1 in ns1)

                    {

                           Console.WriteLine(n1);

                    }

 

                    foreach (int n1 in ns2)

                    {

                           Console.WriteLine(n1);

                    }

 

             }

       }

}

 


 

* 배열끼리 복사는 같은 곳을 바라보게 된다.

 

 using System;

 

namespace Csharp

{

    class Ace

    {

        public static void Main(string[] args)

        {

           //배열 복사

           int a = 10;

           int b;

           b = a;//b = 10

 

           int[] aArray = new int[3] {100, 200, 300};

           int[] bArray;

           int c;

           

           //얕은 복사

           //배열끼리의 복사

           bArray = aArray;

           c= aArray[0];

 

           //테스트 - 원본 수정

           aArray[0] = 500;

 

           CheckValue(aArray, bArray, c);

 

           //복사배열 수정

           bArray[0] = 700;

 

           CheckValue(aArray, bArray, c);

 

           //int 수정

           c = 900;

           CheckValue(aArray, bArray, c);

 

 

        }

 

        public static void CheckValue(int[] a, int[] b, int c)

        {

            Console.WriteLine("aArray : {0}", a[0]);

            Console.WriteLine("bArray : {0}", b[0]);

            Console.WriteLine("c : {0}", c);

            Console.WriteLine();

        }

 

    }

}

 


 

using System;

 

namespace Csharp

{

       class Ace

       {

             public static void Main(string[] args)

             {

                    int[] ns = { 100, 200, 300 };

                    int[] cs1, cs2;

                    int[] cs3;

 

                    //주소값 복사               

                    cs1 = ns;

                    //깊은 복사

                    cs2 = CopyArray(ns);

 

                    //C#제공 배열 복사 어떤배열이든 가능

                    //object[]

                    cs3 = (int[])ns.Clone();

 

                    for (int i = 0; i < 3; i++)

                    {

                           Console.WriteLine("{0}", cs3[i]);

                    }

             }

 

             //100 200 300

 

             public static int[] CopyArray(int[] ns)

             {

                    //똑같은 공간

                    int[] temp = new int[ns.Length];

 

                    for (int i = 0; i < ns.Length; i++)

                    {

                           temp[i] = ns[i];

                    }

 

                    return temp;

             }

 

       }

}

 


 


using System;

 

namespace Csharp

{

       class Ac

       {

             public static void Main(string[] args)

             {

                    //System.Array 클래스를 상속받는다.

 

                    Random rnd = new Random();

                    int[] ns = new int[15];

 

                    for (int i = 0; i < ns.Length; i++)

                    {

                           //1~100

                           ns[i] = rnd.Next(1, 101);

                    }

 

                    CheckValue(ns);

 

                    //정렬(Sort) -> 오름차순, 내림차순

                    //오름차순

                    Array.Sort(ns);

                    CheckValue(ns);

 

                    //내림차순(x)

                    Array.Reverse(ns);

                    CheckValue(ns);

 

                    //검색 : 원하는 값이 배열안에 있는냐?

                    //출력 : 네 몇번째 열에 있습니다.

                    //IndexOf() 메서드

                    string[] names = new string[10] { "", "", "", "", "", "", "", "", "", "" };

 

                    //어떤 배열에서 검색하는냐

                    //어떤 값을 찾을 것이냐

                    Console.WriteLine(Array.IndexOf(names, ""));

                    Console.WriteLine(Array.IndexOf(names, ""));

                    Console.WriteLine(Array.IndexOf(names, ""));

 

             }

 

             public static void CheckValue(int[] ns)

             {

                    for (int i = 0; i < ns.Length; i++)

                    {

                           Console.Write("{0, 3}", ns[i]);

                    }

                    Console.WriteLine();

             }

 

       }

}

 

 


 

using System;

 

namespace Csharp

{

       //Ex68_Array.cs

       class Ex68_Array

       {

             public static void Main(string[] args)

             {

                    //System.Array 클래스를 상속받는다.

 

                    Random rnd = new Random();

                    int[] ns = new int[15];

 

                    for (int i = 0; i < ns.Length; i++)

                    {

                           ns[i] = rnd.Next(1, 101);//1~100

                    }

 

                    CheckValue(ns);

 

                    //정렬(Sort) -> 오름차순, 내림차순

                    Array.Sort(ns);//오름차순

                    CheckValue(ns);

 

                    //내림차순(X)

                    Array.Reverse(ns);

                    CheckValue(ns);

 

 

 

                    //검색 : 원하는값이 배열안에 있는냐? -> 2번째에 있습니다.

                    // IndexOf() 메서드

                    string[] names = new string[10] { "", "", "", "", "", "", "", "", "", "" };

 

                    Console.WriteLine(Array.IndexOf(names, ""));

                    Console.WriteLine(Array.IndexOf(names, ""));

                    Console.WriteLine(Array.IndexOf(names, ""));//-1

 

                    Console.WriteLine(Array.IndexOf(names, ""));

                    Console.WriteLine(Array.IndexOf(names, ""));

 

                    // LastIndexOf()

                    Console.WriteLine(Array.LastIndexOf(names, ""));

                    Console.WriteLine(Array.LastIndexOf(names, ""));

 

                    Console.WriteLine(Array.IndexOf(names, "", 2));

 

 

                    //정리*******

                    int index = Array.IndexOf(names, "");//첫번째 ""

                    Console.WriteLine("첫번째 : {0}", index);

 

                    index = Array.IndexOf(names, "", index + 1);//두번째

                    Console.WriteLine("두번째 : {0}", index);

 

                    index = Array.IndexOf(names, "", index + 1);//세번째

                    Console.WriteLine("세번째 : {0}", index);

 

                    index = Array.IndexOf(names, "", index + 1);//네번째

                    Console.WriteLine("네번째 : {0}", index);

 

 

                    //배열을 지우는X -> 배열안의 모든 데이터를 초기화

                    Array.Clear(names, 5, 2);//startIndex, length

 

                    foreach (string name in names)

                           Console.WriteLine(name);

 

                    Array.Clear(names, 5, 10);//5번쨰부터 끝까지 초기화

                    Array.Clear(names, 0, 10);//모든 방을 초기화

 

 

             }

 

             public static void CheckValue(int[] ns)

             {

                    for (int i = 0; i < ns.Length; i++)

                           Console.Write("{0,3}", ns[i]);

 

                    Console.WriteLine();

             }

       }

}

 





using System;

 

namespace Csharp

{

       //Ex72_Array.cs

       class Ex72_Array

       {

             public static void Main(string[] args)

             {

                    //5x5 배열

                    int[,] ns = new int[5,5];

                    int n = 1;                

                   

                   

                    for (int i=0; i<ns.GetLength(0); i++)

                    {

                           for (int j=0; j<=i; j++)

                           {

                                 ns[i,j] = n;

                                 n++;

                           }

                    }

 

            


 

            //3 

/*

for (int i=0; i<ns.GetLength(0); i++)

{

       for (int j=4-i; j<ns.GetLength(1); j++)

       {

             ns[i,j] = n;

             n++;

       }

}

*/

 


             //4

for (int i=0; i<ns.GetLength(0); i++)

{

       for (int j=0; j<ns.GetLength(1); j++)

       {

             ns[j,i] = n;

             n++;

       }

}  

 

 


            /*
  for (int i=0; i<ns.GetLength(0); i++)

                    {

                           for (int j=1; j>=0; j--)

                           {

                                 ns[i,j] = n;

                                 n++;

                           }

                    }

 

            */
            


//출력
          for (int i=0; i<ns.GetLength(0); i++)

                    {

                           for (int j=0; j<ns.GetLength(1); j++)

                           {

                                 Console.Write("{0,3}", ns[i,j]);

                           }

                           Console.WriteLine();

                    }

           

 

             }

       }

}

 

 






반응형