버글버글

Java 수업 기록 (8) 배열(Array) 본문

java/java 수업 기록

Java 수업 기록 (8) 배열(Array)

Bugle 2022. 7. 28. 00:00
반응형

- ARRAY -

▶ 배열(Array)

1. 데이터를 연속된 공간에 나열하고 각 데이터에 인덱스(index)를 부여한 자료 구조

2. 같은 타입의 데이터만 저장할 수 있다.

3. 배열의 길이는 늘리거나 줄일 수 없다.

배열 h e l l o
인덱스 0 1 2 3 4

 

 

▶ 1차원배열(one dimension) 

1. 여러 개의 변수를 하나의 이름으로 관리하는 자료 구조

2. 배열의 구성요소

 1) 인덱스 : 각 변수의 위치 정보. 0으로 시작

 2) 배열명 : 모든 변수를 관리하는 하나의 이름

3. 각 변수는 배열명에 대괄호[] (브라켓:bracket)와 인덱스를 붙여서 구분

 

* 배열 선언 및 생성 (변수는 선언만 하면 사용이 가능, 배열은 선언을 한 뒤, 생성도 해야 함)
1. 배열 선언

int[] arr;
int arr[];

// 같은 내용임

java에서는 첫번째 방식을 추천 한다.

2. 배열 생성 (몇 개의 변수를 관리 할 것인지)

arr = new int[3];

// 길이가 3줄짜리 배열을 만들겠다.

3. 배열 선언 및 생성

int[] arr = new int[3];

* 3.은 1.과 2. 를 한번에 실행하는 코드이다.

 

*배열 요소

1. 배열로 관리되는 각각의 변수
2. 모든 배열 요소의 호출

arr[0]						// 1번째 요소
arr[1]						// 2번째 요소
arr[2]						// 3번째 요소

3. 배열 요소는 자동으로 초기화가 된다 (어떤 값을 가진다.)

   - 값이 없음을 의미하는 0, 0.0, false, null 값을 가진다.

   - 값이 없다라는것은 거짓이다.

 

* 배열의 장점

 - 변수 3개가 있는 상황 가정

 - 아래의 상황만 이해하면 배열은 다 이해한것이다..

// 일반 변수 예시
int a, b, c;
System.out.println(a);
System.out.println(b);
System.out.println(c);
// 배열 예시
int[] arr = new int[3];
for(int i = 0; i < 3; i++) {
System.out.println(arr[i]);

예시) 

int[] arr = new int[3];
		
for(int i = 0; i < 3; i++) {
	System.out.println(arr[i]);
}

// i를 (index)변수 이름으로 우선사용 후 >  j > k
// 선언만 하고 초기값 지정을 안했기 때문에 사실상 오류가 나야하는 코드지만
// 배열은 자동으로 초기화가 되기 때문에 값이 있다고 본다.

 

예시 2) 학생 3명의 점수라고 가정

arr[0] = 100;
arr[1] = 50;
arr[2] = 80;
for(int i =0; i < 3; i++) {
	System.out.println(arr[i]);

- 학생 3명의 평균은?

int total = 0;
for(int i = 0; i < 3; i++) {
	total += arr[i];
// 캐스팅 1번 방법
double average = (double)total / 3;
System.out.println("평균 : " + average + "점");
		
// 캐스팅 2번 방법
double average2 = total / 3.0;
System.out.println("평균 : " + average2 + "점");

int[] arr = new int[3];

- 3에 관련된건 종속되어있는 것임.

- 배열의 길이라는 의미의 arr.length를 쓴다.

arr[0] = 100;
arr[1] = 50;
arr[2] = 80;
for(int i =0; i < arr.length; i++) {
	System.out.println(arr[i]);
}

		
int total = 0;
for(int i = 0; i < arr.length; i++) {
	total += arr[i];
}

double average = (double)total / arr.length;
		
System.out.println("평균 : " + average + "점");

* 사실 배열은 나중에 가면 사용을 안하기는 한다. . . 실무에서 많이 출현하진 않는다.

 - 배열을 대체 할 수 있는 수단은 많다.

 

* 배열의 초기화

// int[] arr = new int[5];			// 배열을 생성한것이지 초기화 한것은 아니다.
// int[] arr = new int[] {10, 20, 30, 40, 50}; // 이런식으로 초기화 하지만, 아래처럼 사용된다.
int[] arr = {10, 20, 30, 40, 50};
int[] arr = {10, 20, 30, 40, 50};

int max = 0;
int min = 100;			// 최소값의 초기값은 0 을 주면 안된다. 0과 비교를 하기 때문에
		
for(int i = 0; i < arr.length; i++) {
	if(max < arr[i]) {
		max = arr[i];
	}
	if(min > arr[i]) {
		min = arr[i];
	}
}
		
System.out.println("최대 : " + max);
System.out.println("최소 : " + min);

 


int max = arr[0];
int min = arr[0];
		
for(int i = 1; i < arr.length; i++) {
	if(max < arr[i]) {
		max = arr[i];
	}
	if(min > arr[i]) {
		min = arr[i];
	}
}
		
System.out.println("최대 : " + max);
System.out.println("최소 : " + min);

* 기본 알고리즘

 

* 배열의 데이터타입

int[] : 참조 타입(Reference Type)

 

* 배열의 길이 늘리기

1. 배열의 길이는 변경할 수 없다.

2. 늘어난 길이의 새로운 배열을 만들고, 
    기존 배열의 값을 모두 새로운 배열로 옮기고,
   기존 배열의 참조값을 새로운 배열의 참조값으로 수정한다.

int[] arr = {1, 2, 3, 4, 5};
		
// 늘어난 길이의 새로운 배열을 만들고, 
int[] temp = new int[1000];
		
// 기존 배열의 값을 모두 새로운 배열로 옮기고,
System.arraycopy(arr, 0, temp, 0, arr.length);		
// arr 0번을 temp 0번으로 옮기는게 시작이다. 언제까지? arr.length 까지
		
// 기존 배열의 참조값을 새로운 배열의 참조값으로 수정한다.
arr = temp;
		
// 이제 arr 배열의 길이는 1000이다.
System.out.println(arr.length);
// arr을 출력하는 방법
System.out.println(Arrays.toString(arr));

 

* Advenced_for(발전된 for문) 

예시) 일반 for문

public static void main(String[] args) {
String[] friends = {"라이언", "프로도", "어피치"};

// 일반 for문
for(int i = 0; i < friends.length; i++) {
// 배열 for에서 이 값을 고정 값이라고 봐도 된다.
	System.out.println((i +1) + "번째 친구 - " + friends[i]);
}
// 각 배열이름 = friends / 배열의 인덱스 [i]
}

예시) 향상된 for문

public static void main(String[] args) {
String[] friends = {"라이언", "프로도", "어피치"};

for(String friend : friends) {
	System.out.println(friend);
}
// friends 배열의 모든 요소를 하나씩 String friend로 옮긴다.
}

 

 

▶ 2차원배열(twe dimension)  

1. 1차원배열을 여러 개 관리하는 자료 구조

2. 1차원배열들의 길이는 서로 다를 수 있음

 

* 2차원 배열의 선언 및 생성

1. 1차원배열의 선언

public static void main(String[] args) {
int[][] arr;
}

2. 2차원배열의 생성

public static void main(String[] args) {
// 1번째 예시
arr = new int[3][2];	
// 의미 : 3행 2열의 구조 (김밥 3줄, 각 2개씩)


// 2번째 예시
arr = new int[3][]; 
// 의미 : 3행 n열의 구조 (김밥 3줄, 모두 다르게 조각)
arr[0] = new int[5]; // 의미 : 1번째 1차원 배열(1번째 김밥은 5개 조각)
arr[1] = new int[3]; // 의미 : 2번쨰 1차원 배열(2번째 김밥은 3개 조각)
arr[2] = new int[8]; // 의미 : 3번쨰 1차원 배열(3번째 김밥은 8개 조각)
}

* 2차원 배열의 요소

1. 인덱스를 2개를 사용

    몇 번째 1차원배열인가? 해당 배열의 몇 번째 요소인가?

2. 2차원배열이 관리하는 1차원배열

public static void main(String[] args) {
arr[0]
arr[1]
arr[2]
}

3. 각각의 1차원배열이 관리하는 배열 요소

public static void main(String[] args) {
arr[0][0], arr[0][1]
arr[1][0], arr[1][1]
arr[2][0], arr[2][1]
}

 

예시) 3행 2열 2차원 배열

public static void main(String[] args) {
int[][] arr1 = new int[3][2];
		
for(int i = 0; i < arr1.length; i++) {
	for(int j = 0; j < arr1[i].length; j++) {
		System.out.print(arr1[i][j] + "\t");
	}
	System.out.println();
    }
}

예시) 3행 n열 2차원 배열

public static void main(String[] args) {
int[][] arr2 = new int[3][];
arr2[0] = new int[5]; // 1번째 1차원배열의 길이는 5
arr2[1] = new int[4]; // 2번째 1차원배열의 길이는 4
arr2[2] = new int[8]; // 3번째 1차원배열의 길이는 8
		
for(int i = 0; i < arr2.length; i++) {
	for(int j = 0; j < arr2[i].length; j++) {
		System.out.print(arr2[i][j] + "\t");
	}
	System.out.println();
	}
}

* Advenced_for(발전된 for문) 

예시) 일반 for문

public static void main(String[] args) {
	for(int i = 0; i < timeTable.length; i++) {
	for(int j = 0; j < timeTable[i].length; j++) {
		System.out.print(timeTable[i][j] + " ");
	}
	System.out.println();
	}
}

예시) 향상된 for문

 

public static void main(String[] args) {
	for(String[]weekName : timeTable) {
		for(String course : weekName) {
			System.out.print(course + " ");
		}
		System.out.println();
}
반응형