* 배열(Array)
- 인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료구조
- 배열을 이용하면 한 번에 많은 메모리 할당 가능
- 같은 타입의 데이터들이 순차적으로 저장
- 배열 인덱스는 0부터 시작
(1) 장점
- 나란히 변수 선언가능
- 순차적으로 접근 가능(반복문 활용에 용이)
(2) 단점
- 선언한 갯수에서 추가하거나 삭제가 불가능하다.
- 수정하려면 새로 선언이 필요하다.
package Day11;
public class ArrayTest {
public static void main(String[] args) {
// 배열
// 같은 타입의 변수들로 이루어진 집합
// 같은 자료형으로 여러개의 공간을 형성
// 자료형[] 배열명 = new 자료형[길이]
// int i = 1;
// int i1 = 2;
// int i3 = 3;
// int i4 = 4;
// int i5 = 5;
int[] arr1 = new int[5]; // 뒤의 [] 안에 길이를 명시적으로 선언해줘야 한다.
String[] arr2 = new String[10];
boolean[] arr3 = new boolean[5];
char[] arr4 = new char[5];
// 인덱스는 배열의 길이 -1.
// 0부터 시작하기 때문
// 배열의 위치 == 인덱스 == 0부터 시작
// System.out.println(arr1); // 단순한 출력으로는 배열안의 요소를 확인할 수 없다.
// System.out.println(arr1[0]);
// System.out.println(arr1[1]);
// System.out.println(arr1[2]);
// System.out.println(arr1[3]);
// System.out.println(arr1[4]);
// 배열명.length > 배열의 길이를 정수로 반환
// System.out.println(arr1.length); // 배열의 길이
// for (int i =0; i<arr1.length; i++) {
// System.out.println("arr1["+i+"] : " + arr1[i]);
// } // 숫자류에 대해서는 아무값을 넣지 않으면 기본적으로 0의 값이 들어간다.
// for (int i =0; i<arr2.length; i++) {
// System.out.println("arr2["+i+"] : " + arr2[i]);
// } // String에 대해서는 기본값이 null이 들어간다.
// null : 공백을 의미하며, 공집합을 뜻한다. 즉, 아무값도 없다는 의미.
// int ii = 0;
// String str = "";
// System.out.println(str + 10);
// for (int i = 0; i < arr3.length; i++ ) {
// System.out.println("arr3[" + i + "] : " + arr3[i]);
// } // boolean에 대한 기본값은 false
// for (int i = 0; i < arr4.length; i++ ) {
// System.out.println("arr4[" + i + "] : " + arr4[i]);
// } // char형의 기본값은 공백이며, 이에 해당하는 정수는 0이다.
// System.out.println((int)arr4[0]);
System.out.println(arr4[0] + 10);
// 데이터 저장
// 배열명 [인덱스] = 값;
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
arr1[3] = 40;
arr1[4] = 50;
// for (int i =0; i<arr1.length; i++) {
// System.out.println(arr1[i]);
//}
}}
public class ArrayTest2 {
public static void main(String[] args) {
int[] a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
int[] b = a;
b[0] = 10;
// 주소 참조 조심..!!
// for(int i = 0; i < b.length; i++) {
// System.out.println("a["+ i + "] : " + a[i]);
// System.out.println("b["+ i + "] : " + b[i]);
// } // 배열은 힙에 저장되며 같은 배열을 바라보고 있기 때문에 값 변경 시, 서로간 영향을 받는다.
// 배열 선언시 선언과 동시에 초기화하는 법
// 1 2 3 4 5
// int[] arr = new int[5];
int[] arr = new int[] {1, 2, 3, 4, 5};
int[] arr2 = new int[] {10, 20, 30, 40, 50};
int[] arr3 = {100, 200, 300};
int[] arr4 = arr3;
arr4[0] = 555;
// System.out.println(arr3[0]);
// System.out.println(arr2[0] + arr2[4]);
// System.out.println(arr3[0]);
// Dto 클래스를 담는 길이 5의 배열을 선언 후
// 각 Dto 클래스의 value 값을 저장하시오
// 1, 2, 3, 4, 5
// 첫번째 문제점
// 같은 패키지에 있는 Class를 가져올 때는 바로 선언이 가능하나
// 다른 패키지에 있는 Class를 가져올 때는, 어느 경로에 있는지 import문이 필요하다.
// 해결법 : 상단에 import문 작성(자동완성 이용)
Dto[] dtos = new Dto[5];
// 클래스의 초기값도 null
// System.out.println(dtos[0]);
Dto dto = new Dto();
dtos[0] = dto;
dtos[1] = dto;
dtos[2] = dto;
dtos[3] = dto;
dtos[4] = dto;
// 두번째 문제점
// 기존 Dto value의 접근제어자는 default였다.
// 즉, 다른 패키지의 class에서 접근이 불가능한 변수였기에,
// 해결법 : 접근제어자를 public으로 변경 후 접근 가능하게 만들었다.
dtos[0].value = 1;
dtos[1].value = 2;
dtos[2].value = 3;
dtos[3].value = 4;
dtos[4].value = 5;
// 세번째 문제점
// dto 객체를 하나만 선언한 뒤, 배열에 삽입했기 때문에, 배열 안의 dto는 모두 같은 객체를 바라본다.
// 즉, value 값을 변경할 때마다, 값이 덮어씌워져 결국 마지막 값만 출력된다.
for(int i = 0 ; i < dtos.length; i++) {
System.out.println(i + "번째 dto 값 : " + dto.value);
}
//세번째 문제점 해결법
dtos[0] = new Dto();
dtos[1] = new Dto();
dtos[2] = new Dto();
dtos[3] = new Dto();
dtos[4] = new Dto();
dtos[0].value = 1;
dtos[1].value = 2;
dtos[2].value = 3;
dtos[3].value = 4;
dtos[4].value = 5;
for(int i = 0 ; i < dtos.length; i++) {
System.out.println(i + "번째 dtos 값 : " + dtos[i].value);
}
// 한번에 초기화
Dto[] dtos2 = {new Dto(), new Dto(), new Dto(), new Dto(), new Dto()};
// for(int i = 0; i < dtos.length; i++) {
// Dto tempDto = dtos2[i]; // 배열 안에 선언한 Dto 객체를 가져온다. 타입이 Dto!!
// tempDto.value = i + 1; // 꺼내온 클래스의 값을 변경하기
// }
// Dto tempDto;
//
// for(int i = 0; i < dtos.length; i++) {
// tempDto = dtos2[i]; // 배열 안에 선언한 Dto 객체를 가져온다. 타입이 Dto!!
// tempDto.value = i + 1; // 꺼내온 클래스의 값을 변경하기
// }
}
}
* 향상된 for문
- 기존 for문과 비교해 배열 반복문에 최적화된 for문
for (배열 요소 받을 변수 : 배열) {
실행할 코드
}
- 자동으로 변수에 배열 요소들이 "순차적"으로 대입된다.
- 인덱스를 활용할 수 없다는 단점이 있다.
package Day11;
public class ForTest {
public static void main(String[] args) {
String[] strArr = {"하나", "둘", "셋", "넷", "다섯"};
// for (int i = 0; i < strArr.length; i++) {
// System.out.println(strArr[i]);
// }
// 향상된 for문
// 우측의 배열을 "차례대로" 좌측에 선언된 변수에 대입한다.
// for(String str : strArr) {
// System.out.println(str);
// }
//
// 배열의 짝수의 요소만 출력하기
// for (int i = 1; i < strArr.length; i+=2)
// System.out.println(strArr[i]);
// }
int i = 0;
// 과제해결
for (String str : strArr) {
if ((i+1) % 2 == 0) {
System.out.println(str);
}
i += 1;
} // 헷갈립니다.
}}
package Day11;
public class ArrayTest3 {
public static void main(String[] args) {
// 2차원 배열
// 자료형 [] [] 배열명 = new 자료형 [행][열];
char[][] ch = new char[3][3];
char [][] ch2 = {
{'*', ' ', ' '},
{'*', '*', ' '},
{'*', '*', '*'}
};
// i = 행 / j = 열
for (int i = 0; i < ch2.length; i++) { // 행
// ch2[] == {'*', ' ', ' '}
for (int j = 0; j <ch2[0].length; j++) { // 열
// ch2[행][열]
System.out.println(ch2[i][j]);
}
System.out.println();
}
}
}
// 2중 포문 그려오기
// *
// **
// ***
'JAVA' 카테고리의 다른 글
[1226] 웹개발반1 (html) (0) | 2022.12.26 |
---|---|
Java2 Day01 (0) | 2022.09.24 |
[08] JAVA_DAY08 (0) | 2022.08.09 |
[10] JAVA_DAY10 (0) | 2022.08.08 |
if, for문 복습 (0) | 2022.08.08 |