[TIL] 배열 Array
배열이란?
크기와 성격이 같은 일련의 원소들이 모여 공동의 집합 구조를 갖는 자료의 집합체를 의미하는 것으로 동질적인 (homogeneous) 성격을 가진 자료들에 대해 개별적으로 자료 형을 부여하지 않고 하나의 이름을 가지고 처리할 목적으로 사용된다.
배열의 특징
- 배열은 동일한 타입의 여러 변수들을 하나의 묶음으로 다루는 것이다.
- 배열의 각 요소는 메모리상에 연속적으로 저장된다.
- 배열의 이름(참조형 변수, 레퍼런스 변수)는 연속된 메모리 공간에 저장된 값을 참조하기 위한 참조 값(포인터)를 갖는다.
- 배열은 처음 설정한 크기를 변경 할 수 없다. (배열의 단점) => 늘리려면 새로이 만들고 그곳에 내용을 복사해야함
- 배열의 크기를 변경하기 위하여 다시 메모리를 할당하는 경우 기존 배열은 가비지 콜랙터의 대상이 된다.
- 배열에 접근하기 위한 첨자는 int형 32bit를 사용한다. (byte short char 도 가능)
*** 배열의 크기를 변경할 수 없다*****
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
package ex0729;
public class Array_Ex3 {
public static void main(String[] args) {
int []a = new int[3];
a[0]=10; a[1]=20; a[2]=30;
System.out.println("배열의 크기가 3인 경우");
for(int i =0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
System.out.println();
// 배열은 배열의 크기를 변경할 수 없다.
// 배열의 크기를 변경하려면 이전 배열은 카비지컬렉터(메모리회수)의 대상이 된다.
a=new int[5];
System.out.println("배열의 크기가 5인 경우");
for(int i = 0 ;i <a.length;i++) {
System.out.print(a[i]+" ");
}
}
}
/* 출력값
배열의 크기가 3인 경우
10 20 30
배열의 크기가 5인 경우
0 0 0 0 0
*/
|
cs |
배열의 선언
자료형 또는 배열명 뒤에 대괄호[]를 붙여 배열을 선언한다.
배열의 메모리 할당
만일 음수 크기의 배열을 생성한다면 런타임 오류가 발생한다.
또한 배열요소수 보다 큰수를 사용하면 런타임 오류가 발생한다.
배열은 new연산자를 이용하여 메모리를 할당한 경우 타입이 숫자형이면 0, 객체는 null로 자동 초기화 된다.
[ ]괄호 안에 들어가는 숫자를 첨자/인덱스라고 하며 해당 숫자는 "배열 전체 요소의 개수 -1"까지 사용할 수 있다.
ex) a[5] 라면 안의 요소는 [0]~[4]까지 구성되어 있다.
배열의 이용
향상된 for문 :
a= new int [5];
for(int x : a){ for(자료형 변수 : 배열)
// 실행문
}
배열의 요소를 자료형 변수에 하나씩 순차적으로 대입시켜줌
두 레퍼런스 변수가 하나의 배열 공유
배열의 초기화
초기화를 할때는 [ ] 안에 크기를 명시하지 않는다.
초기화 할때는 new int [ ] 생략이 가능하다. (선언과 동시에 초기화 가능하다.)
**선언따로 초기화 따로 진행할 시 new int [ ] 생략할 수 없다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package ex0729;
public class ArraySet_Ex1 {
public static void main(String[] args) {
// 1차원 배열의 초기화
// 초기화할때는 []안에 크기를 명시하지 않는다.
int[]a=new int[] {2,4,6,8,10};
//초기화 할때 new int[] 생략 가능
// int [] a ={2,4,6,8,10};
int tot=0;
for(int n:a) {
tot+=n;
System.out.print(n+" ");
}
System.out.println("합:"+tot);
}
}
/*
2 4 6 8 10 합:30
*/
|
cs |
1) 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
package ex0729;
public class Array_Ex4 {
public static void main(String[] args) {
int []a = new int[3];
a[0]=10; a[1]=20; a[2]=30;
System.out.println("\na배열..");
for(int n : a) {
System.out.print(n + " ");
}
System.out.println();
// 배열은 reference 참조형 이다.
// 하나의 배열을 두 레퍼런스 변수 a,b가 공유함
int[] b =a;
b[1]=200; b[2]=300;
System.out.println("\na배열..");
for(int n : a) {
System.out.print(n + " ");
}
System.out.println("\nb배열..");
for(int n : b) {
System.out.print(n+ " ");
}
System.out.println();
}
}
|
cs |
2) 예제
난수 1~10사이의 수를 100번 출력하고 각 숫자별 몇번 출력되엇는지 세는 프로그램
**배열명.length 하면 길이값을 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
package ex0729;
public class Array_Quiz2 {
public static void main(String[] args) {
int n;
int[] cnt = new int[10];
for (int i = 1; i <= 100; i++) {
n = (int) (Math.random() * 10) + 1;
cnt[n - 1]++;
System.out.printf("%5d", n);
if (i % 10 == 0) {
System.out.println();
}
}
System.out.println();
for (int i = 0; i < cnt.length; i++) {
System.out.println((i + 1) + ":" + cnt[i]);
}
}
}
/* 출력값
5 6 6 6 10 8 2 4 6 3
1 5 3 9 2 3 2 3 10 1
8 4 1 1 10 5 10 9 4 6
6 2 1 9 9 7 10 6 10 2
2 10 5 7 7 6 3 3 1 6
8 5 2 4 6 4 3 4 6 5
1 4 4 6 5 2 5 10 8 7
6 8 10 3 8 1 2 4 10 6
9 8 6 5 2 3 9 7 6 1
10 3 8 9 7 6 7 10 10 4
1:9
2:10
3:10
4:10
5:9
6:17
7:7
8:8
9:7
10:13
*/
|
cs |
3) 예제
배열을 활용하여 입력한 년월일을 요일로 변환하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
package ex0729;
import java.util.Scanner;
public class Array_Quiz4 {
//
public static void main(String[] args) {
// 년 월 일을 입력 받아 요일 구하기
// 1년 1월 1일 = 월요일
// 366 (2월 29일) 년도가 4의 배수이고 100의 배수가 아니거나 400의 배수이면
// 365(2월 28일)
Scanner sc = new Scanner(System.in);
// 1월=> days[0],..... 12=> days[11]
int[] days = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
String[] weeks = new String[] { "일", "월", "화", "수", "목", "금", "토" };
int y, m, d;
int tot;
String w;
do {
System.out.print("년도?");
y = sc.nextInt();
} while (y < 100);
do {
System.out.print("월?");
m = sc.nextInt();
} while (m < 1 || m > 12);
// y년도 m월의 2월은 몇일까지인가?
// 윤년 계산을 통해 구분하기
days[1] = y % 4 == 0 && y % 100 != 0 || y % 400 == 0 ? 29 : 28;
do {
System.out.print("일");
d = sc.nextInt();
} while (d < 1 || d > days[m - 1]);
// 1년 1월 1일에서 ~y.m.d 일까지의 전체 날수
// 전체 날수 = 2019*365 + 2019/4 - 2019/100 + 2019/400;
// 전체 날수 = 1월~6월 + 29일
tot = (y - 1) * 365 + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400;
for (int i = 0; i < m - 1; i++) {
tot += days[i];
}
tot += d;
w = weeks[tot % 7];
System.out.printf("%d년 %d월 %d일은 %s요일입니다\n", y, m, d, w);
sc.close();
}
}
|
cs |
'Language > JAVA' 카테고리의 다른 글
[TIL] 2차원 배열 (0) | 2020.07.30 |
---|---|
[TIL] 배열 (2) (0) | 2020.07.30 |
[TIL] break 문, continue 문 (0) | 2020.07.28 |
[TIL] for문 예제 (0) | 2020.07.28 |
[TIL] for문 (0) | 2020.07.27 |
댓글