● 배열(array)이란?
: 인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료 구조로 배열을 이용하면 한 번에 많은 메모리 공간 할당 가능하도록 하는 것을 의미합니다. 그래서 Data의 효율적인 처리할 수 있도록 해줍니다.
● 배열의 특징
- 같은 타입의 데이터들이 순차적으로 저장
- 인덱스를 이용하여 원소 데이터 접근
- 반복문을 이용하여 처리하기에 적합
- 0부터 카운터 시작
- 하나의 이름으로 많은 양의 data를 관리
● 배열의 형식
1) 기본형
package Array;
public class Array {
public static void main(String[] args) {
int[] age = new int[3]
age[0] = 20;
age[1] = 21;
age[2] = 22;
for(int i =0 ; i < 3 ;i++) {
System.out.println("나이 : " + age[i]);
}
결과값 : 20 , 21 , 22
}
}
2) count 값을 넣지 않은 배열
package Array;
public class Array {
public static void main(String[] args) {
int[] age = new int[] {20,21,22,23,24,25,26};
count 값을 넣지 않아야 error 나지 않습니다.
초기 값을 넣으면 그 값보다 작은 수를 넣으면
남은 공간에 무엇이 들어와야 하는지 모르기 때문에 java가 오류가 생깁니다.
for(int i =0 ; i < age.length ;i++) {
System.out.println("나이 : " + age[i]);
}
결과값: 20, 21, 22, 23, 24, 25, 26
age.length 의 age의 길이를 담기 때문에 code 문제 없이 수행합니다.
이렇게 처리하게 되면 age의 값이 변동해도 for 반복문은 문제 없이 수행합니다.
}
}
3) new 참조형[] 생략 하는 배열 (+ 매서드 활용)
package Array;
public class Array {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5}; // new int[] 생략하고 초기화가 가능하다.
int num = 10;
int [] result ; // 참조 변수 선언으로 stack 영역에 4byte 할당해준다.
result = addAllArray(arr , num); // arr = a , num = n
for(int i = 0; i < result.length; i++) {
System.out.println("result : " + result[i]); 결과값 11, 12, 13, 14, 15
}
for(int i = 0; i < arr.length; i++) {
System.out.println("arr : " + arr[i]); 결과값 11, 12, 13, 14, 15
}
}
public static int[] addAllArray(int[] a, int n) {
// 매개변수 + 지역변수 - int[] arr 과 같은 주소값을 가집니다.
// 참조변수 일 때, 주소값을 전달 받도록 해서 사용합니다.
for(int i = 0; i < a.length;i++) {
a[i] += n;
System.out.println(a[i]);
}
return a; // 결과값 11, 12, 13, 14, 15
}
}
4) String 사용 배열(+참조자료형 활용)
package Array;
public class Array {
public static void main(String[] args) {
String[] strArr = new String[3]; // 12byte 할당.
System.out.println(strArr[0]);
null 출력 : 선언이 되어서 메모리가 할당 되어 있지만 아무값도 입력되지 않아서 null이 출력합니다.
strArr[0] = "홍길동";
strArr[1] = "이순신";
strArr[2] = "세종대왕";
for(int i = 0; i< strArr.length ; i ++){
System.out.println(strArr[i]);
}
문자열이 저장되어 있는 주소값을 저장하려는 것입니다. 메모리 어딘가에 있는 문자열을 각각의 시장 주소값을 저장하기 위해서 new를 선언하여 strArr으로 주소값을 저장시키는 것입니다.
● 배열 2가지 관점
1. 기본자료형
- 반드시 동일한 자료형으로 배열이 가능합니다.
- 하나의 변수안에 같은 자료형으로 순서에 맞게 입력하여 관리합니다.
- 변수의 이름으로 메모리에 접근하고 순서(번호)로 접근합니다.
- 하나의 이름으로 많은 양의 data를 관리합니다.
int[] younghee = new int[5];
younghee[0] = 90; // 국어
younghee[1] = 95; // 영어
younghee[2] = 85; // 수학
younghee[3] = 95; // 사회
younghee[4] = 90; // 과학
데이터 처리에 반복문을 이용
for(int i = 0 ; i < 5; i++) {
ystem.out.println(younghee[i]);
}
반복분을 이용해 결과값을 가져오는데 아주 유용합니다.
결과값 = 90, 95, 85, 95, 90
2. 참조자료형
package 배열.Apple;
public class Applemain {
public static void main(String[] args) {
// new Mart[3];
// 만약 : class Mart 총 할당 된 메모리량이 50byte라면
// Heap 안에 50byte 씩 3개가 할당 되어지는 것이 아닙니다!!
Mart eMart = new Mart("이마트" , 100 , 500);
Mart homeplus = new Mart("홈플러스" , 200 , 1000);
Mart walmart = new Mart("월마트" , 300, 2000);
Mart[] mart = new Mart[3]; //4byte씩 3개가 할당 된다(주소값만을 넣어주는 것이다)
mart[0] = new Mart("이마트" , 100 , 500); // 실질적으로 할당된 주소값을 저장
mart[1] = new Mart("홈플러스" , 200 , 1000);
mart[2] = new Mart("월마트" , 300, 2000);
mart[0]. displayMart(); // 이마트
mart[1]. displayMart(); // 홈플러스
mart[2]. displayMart(); // 월마트
위와 같이 참자료형 자체를 배열로 사용하려고 할 때 우리가 주의해야 할 사항이 있습니다.
그것은!! 선언한 참조자료형 자체 모두가 저장이 되어서 할당 되는 것이 아니라는 사실입니다.
그렇다면 어떻게 배열로 사용할 수 있을까요? 그것은 참조자료형의 주소값을 저장함으로 그 저장되어있는 것을 불러올 수 있게 만드는 것입니다.
만약에 mart.매개변수(); 를 불러오면 error 가 나타납니다. 왜냐하면 mart 배열 안에 class Mart 자체를 넣은 것이 아니라 new Mart("이마트" , 100 , 500);의 이름값만 가지고 있는 것이기 때문입니다.
= 자료형의 배열 선언은 하나의 이름으로 heap 영역에서 각각의 인스턴스에 접근하도록 하는 것이므로 참조 자료형의 이름(주소값)을 하나로 관리하겠다는 의미로 이해하시면 됩니다.
● 2차원 배열
package Array;
public class Array {
public static void main(String[] args) {
int[][] arr = new int[3][4]; // 대괄호를 2
4byte 가 12개 할당 받은 것이다 = 48byte , arr 의 이름으로 다 관리한다.
// int [3][4] / 3행 4열
arr[0][0] = 0;
arr[0][1] = 1;
arr[0][2] = 2;
arr[0][3] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
arr[1][3] = 7;
arr[2][0] = 8;
arr[2][1] = 9;
arr[2][2] = 10;
arr[2][3] = 11;
for(int i = 0; i< 3;i++) { // 행의 개념
for(int j=0; j<4; j++) { // 열의 개념
System.out.println("[" + i +"]"+"["+j+"]"+ " = " + arr[i][j]);
}
}
new int[i][j]; 변경 되어도 error 나지 않도록 하는 방법
2차원 -> 행 : length / 열 : arr[num].length
for(int i = 0; i< arr.length ;i++) { // 행의 개념
for(int j=0; j<arr[i].length; j++) { // 열의 개념
System.out.println("[" + i +"]"+"["+j+"]"+ " = " + arr[i][j]);
}
}
}
}
주의 해야할 점!!
for(int i = 0; i< arr.length ;i++) { // 행의 개념
for(int j=0; j<arr[i].length; j++) { // 열의 개념
for(int j=0; j System.out.println("[" + i +"]"+"["+j+"]"+ " = " + arr[i][j]);
위의 코드에서 for(int j=0; j<arr[i].length; j++) 대괄호 안에 i 가 들어가야 하는 이유!?
package exam12;
public class RaggedArray {
public static void main(String[] args) {
int[][] ar = {
{0 ,1},
{4, 5, 6},
{8, 9, 10, 11}
};
for(int i = 0; i< ar.length ;i++) { // 행의 개념
for(int j=0; j<ar[i].length; j++) { // 열의 개념
System.out.println("[" + i +"]"+"["+j+"]"+ " = " + ar[i][j]);
}
}
}
}
arr[i].length 괄호 안에 i 가 들어가야 하는 이유는 열의 개수가 항상 동일한 것이 아니기 때문입니다.
● 행과 열의 분리선언
: 기능은 지원 되지만 많이 사용하지 않습니다. 가급적이면 처음부터 초기화 시키는 것이 좋습니다.
int[][] a = new int[3][]; // ragged array
a[0] = new int[2];
a[1] = new int[3];
a[2] = new int[4];
● for - each 문
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
int sum = 0;
for(int e :arr) {
System.out.println("e = " + e);
sum += e;
}
주의!!!
(;) 세미콜론이 아닌 (:) 콜론 하나만 사용해야 합니다. 배열의 전체를 참조할 필요가 있는 경우에 유용되는 반복문입니다.
for (int e :arr){ } arr의 숫자 하나씩 e에 담아주면서 반복합니다.
혼돈하지 말아야 할 것!
for(int e :arr) {
e++;
System.out.print(e + " " ); // 한줄에 다 출력되게 만들 때 = print 사용.
}
- e라는 별도의 저장공간을 할당 받아서 수행하는 것이기 때문에 arr 의 값은 변경 없습니다.
'빅데이터 > JAVA' 카테고리의 다른 글
[JAVA] 상속(inheritance) (0) | 2020.05.05 |
---|---|
[JAVA] 콘솔 출력 (0) | 2020.05.04 |
[JAVA] String (0) | 2020.05.02 |
[JAVA] Scanner (0) | 2020.04.30 |
[JAVA] System.out.println() , 자바의 메모리 모델 (0) | 2020.04.30 |