배열(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);
}
}
{
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);
}
}
}
}
{
//초기화리스트
// -> 배열을 선언과 동시에 원하는 값으로 초기화 방법
//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++;
}
}
/*
for (int i=0;
i<ns.GetLength(0); i++)
{
for (int j=4-i; j<ns.GetLength(1);
j++)
{
ns[i,j] = n;
n++;
}
}
*/
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 j=1; j>=0; j--)
{
ns[i,j] = n;
n++;
}
}
{
for (int j=0; j<ns.GetLength(1); j++)
{
Console.Write("{0,3}", ns[i,j]);
}
Console.WriteLine();
}
}
}
}