반응형
package array;
public class Ex {
public static void main(String[] args) {
/*
* 배열(Array)
* - 같은 타입 데이터 여러개를 하나의 묶음(변수)으로 다루는 메모리 공간
*
* [ 특징 ]
* 1. 같은 타입 데이터만 저장 가능
* 2. 여러 변수에 해당하는 메모리 공간이 연속된 공간에 차례대로 생성됨
* => 한 번 생성된 배열은 크기 변경 불가능
* 3. 기본 데이터타입과 참조 데이터타입 모두 배열로 사용 가능
* 4. 배열은 선언, 생성, 초기화의 3단계 과정을 거쳐서 사용
* 5. 배열 생성 시 각 공간에 해당하는 인덱스(번호)가 자동으로 부여됨
* => 0부터 시작하며, 배열크기-1 까지 부여됨
* 6. 배열이 생성될 경우 배열의 데이터 저장 공간은
* 배열의 데이터타입에 해당하는 기본값으로 자동으로 초기화
* (byte, short, int = 0, long = 0L, float = 0.0f, double = 0.0,
* char = '\u0000' 또는 0, boolean = false, String = null)
* 7. 배열의 이름(변수명)을 사용하여 배열에 접근 가능(인덱스 필요)
* 8. 배열의 크기는 배열명.lengh 속성을 통해 알아낼 수 있음
*
* < 배열 선언 기본 문법 >
* 데이터타입[] 변수명;
* => 변수 선언과 유사하나, 데이터타입 뒤에 [] 기호를 붙여 배열 표시
* => 배열 공간이 생성되기 전이므로, 아직 데이터 저장은 불가
* => 선언된 배열의 변수는 참조형 변수로 취급됨
* (주의! int 는 기본형이지만, int[] 은 참조형)
*
* < 배열 생성 기본 문법 >
* 변수명 = new 데이터타입[배열크기];
* => new 키워드를 사용하여 배열 공간을 생성하는데
* 데이터타입 뒤의 대괄호 안에 생성할 배열의 크기를 명시
* => 생성되는 배열의 위치(주소값)를 선언된 배열 타입 변수에 저장
* => 이제, 실제 메모리 공간이 생성되었으므로 데이터 저장이 가능
* => 생성된 배열에는 자동으로 인덱스 번호가 부여됨
* (인덱스번호는 0 ~ 배열크기-1 까지 자동으로 부여됨)
*
* < 배열 선언 및 생성을 하나의 문장으로 결합 >
* 데이터타입[] 변수명 = new 데이터타입[배열크기];
*
* < 배열 접근 기본 문법 >
* 변수명[인덱스]
* => 변수명에 해당하는 주소(배열 공간)에 접근한 뒤
* 인덱스에 해당하는 데이터 저장 공간에 접근
* => 배열에 데이터 초기화(저장) 시
* 변수명[인덱스] = 데이터;
*
* < 반복문을 사용한 배열의 모든 인덱스 접근 기본 공식 >
* for(int i = 0; i < 배열명.length; i++) {
* // 배열명[i] 형태로 접근
* }
*/
// 학생 점수 5개를 별도의 변수에 저장하고 관리하는 경우
// int score1 = 90, score2 = 60, score3 = 80, score4 = 100, score5 = 50;
// int scoreTotal = score1 + score2 + score3 + score4 + score5;
// ======================================================
// 학생 점수 5개(정수)를 저장할 배열(score) 선언 및 생성, 초기화
// 1. 배열 선언 : 데이터타입[] 배열명;
// int[] score; // int형 정수 여러개를 저장할 배열 score 를 선언
// => 아직 데이터를 저장할 수 있는 메모리 공간은 생성되기 전
// score = 90; // 오류 발생! 배열 이름으로 사용되는 변수에 데이터 저장 불가!
// 2. 배열 생성 : 배열명 = new 데이터타입[배열크기];
// score = new int[5];
// 연속적인 int형 배열 공간 5개를 생성하고,
// 해당 공간의 메모리 주소를 int[] 타입 변수 score 에 저장
// => 이 때, 5개의 메모리 공간에는 각각의 인덱스 번호가 자동으로 부여됨
// (인덱스 번호는 0 ~ 4 까지 부여됨)
// 배열 선언 및 생성을 하나의 문장으로 결합
int[] score = new int[5];
// 배열에 접근하여 각 배열 공간의 데이터 출력
// => 배열명이 score 이므로 score[인덱스] 형식으로 접근
// System.out.println(score); // 배열명 그대로 출력 시 주소값 출력(데이터 X)
System.out.println(score[0]); // score 배열의 0번 인덱스 데이터 값 출력
System.out.println(score[1]); // score 배열의 1번 인덱스 데이터 값 출력
System.out.println(score[2]); // score 배열의 2번 인덱스 데이터 값 출력
System.out.println(score[3]); // score 배열의 3번 인덱스 데이터 값 출력
System.out.println(score[4]); // score 배열의 4번 인덱스 데이터 값 출력
// => 이 때, 배열은 자동으로 기본값으로 초기화 되므로 0 출력됨
/*
* 주의! 생성된 배열의 인덱스 범위를 벗어나는 배열 접근 시 오류 발생!
* => 단, 문법적으로 오류가 아니기 때문에 코드 상에서는 알 수 없고
* 프로그램 실행 시점에서 오류가 발견됨
*/
// System.out.println(score[5]); // 실행 시 오류 발생!
// Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
// at array.Ex.main(Ex.java:82)
// => ArrayIndexOutOfBoundsException: 5 => 5번 인덱스가 범위를 벗어남
// => array.Ex.main(Ex.java:82) => Ex.java 클래스의 82번 라인이 오류
System.out.println("------------------");
// 배열에 데이터 저장(초기화) => 90, 100, 80, 70, 50
score[0] = 90;
score[1] = 100;
score[2] = 80;
score[3] = 70;
score[4] = 50;
// score[10] = 100; // 존재하지 않는 인덱스 접근. 실행 시 오류 발생!
// System.out.println(score[0]); // score 배열의 0번 인덱스 데이터 값 출력
// System.out.println(score[1]); // score 배열의 1번 인덱스 데이터 값 출력
// System.out.println(score[2]); // score 배열의 2번 인덱스 데이터 값 출력
// System.out.println(score[3]); // score 배열의 3번 인덱스 데이터 값 출력
// System.out.println(score[4]); // score 배열의 4번 인덱스 데이터 값 출력
// for문을 사용하여 배열 인덱스 범위(0 ~ 4)까지 반복하면서
// 출력문을 통해 배열 인덱스에 차례대로 접근하여 데이터 출력
// for(int i = 0; i < 5; i++) { // for(int i = 0; i <= 4; i++) 동일
// // => 0 ~ 4 까지 1씩 증가하는 제어변수 i를 인덱스 번호로 활용 가능
// System.out.println(score[i]); // score[0] ~ score[4] 까지 대응
// }
// => 배열의 모든 인덱스에 접근 시 조건식에 배열 크기 직접 지정할 경우
// 배열 크기가 변경되면 조건식 코드도 변경되어야 한다!
// 배열명.length 속성을 사용하여 배열의 크기(길이)를 알아낼 수 있다!
System.out.println("배열 score 의 크기 : " + score.length);
// => 배열의 크기값을 반복문의 조건식에 활용하면
// 배열 크기가 변경되어도 동적으로 대응 가능
// 배열 전체 접근 기본 공식을 사용하여 배열 데이터 모두 출력
for(int i = 0; i < score.length; i++) { // 배열크기-1 까지 접근 가능
// System.out.println(score[i]);
System.out.println(i + "번 인덱스 : " + score[i]);
}
System.out.println("=====================================");
// 배열 선언 시 [] 기호 위치에 따른 차이점
int[] arr1, arr2; // arr1, arr2 모두 int[] 타입 변수로 선언됨
int arr3, arr4[]; // arr3 는 int, arr4 는 int[] 타입 변수로 선언됨
// => 따라서, 자바에서 추천하는 문법(데이터타입 뒤 [] 명시) 사용 권장
}
}
/*
90
100
80
70
50
=========================
배열 score의 크기 : 5
=========================
0번 인덱스: 90
1번 인덱스: 100
2번 인덱스: 80
3번 인덱스: 70
4번 인덱스: 50
=========================
*/
package array;
public class Ex2 {
public static void main(String[] args) {
/*
* < 배열 선언, 생성, 초기화를 한꺼번에 수행하는 문법 >
* 데이터타입[] 변수명 = {데이터1, 데이터2, ..., 데이터n};
* => 배열 생성 문법을 별도로 명시하지 않고
* 중괄호를 사용하여 초기화할 데이터를 리터럴 형태로 전달하면
* 해당 데이터 갯수만큼 배열 공간이 자동으로 생성됨
* => n개 만큼의 공간을 생성하면서 인덱스번호가 0 ~ n-1 까지 부여되고
* 자동으로 기본값으로 초기화됨
*/
// int[] arr = new int[5];
// arr[0] = 1;
// arr[1] = 2;
// arr[2] = 3;
// arr[3] = 4;
// arr[4] = 5;
// 위의 문장들을 하나로 결합하여 리터럴로 즉시 초기화까지 수행
int[] arr = {1, 2, 3, 4, 5};
// => 주의! 5개의 리터럴 지정 시 5개 데이터 저장 공간만 생성되므로
// 추가적인 데이터 저장은 불가능하게 된다!
// 배열 arr 의 모든 요소 출력
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println("------------------------------");
// int형 배열 arr2 를 먼저 선언한 후
// 별도로 정수리터럴 1, 2, 3, 4, 5 로 한꺼번에 초기화하는 경우
int[] arr2;
// arr2 = new int[5]; // 배열 생성 문장 사용 시
// arr2 = {1, 2, 3, 4, 5}; // 오류 발생! 별도로 초기화 시 사용 불가능
// => new 키워드를 사용하는 방법과 결합하여 문법을 지정해야함
arr2 = new int[]{1, 2, 3, 4, 5};
// => 주의! 배열 크기는 지정하지 않도록 한다!
System.out.println("------------------------------");
// String 타입 문자열 데이터 3개("Java", "JSP", "Android")를 저장하는
// 배열 strArr 을 생성하고 리터럴로 즉시 초기화까지 수행 후 출력
String[] strArr = {"Java", "JSP", "Android"};
for(int i = 0; i < strArr.length; i++) {
System.out.println(strArr[i]);
}
System.out.println("=============================");
int[] a = {1, 2, 3};
int[] b = {4, 5, 6};
int[] c = {7, 8, 9};
a = b; // b 의 주소값을 a 에 저장
// 기존에 a가 가리키던(참조하던) 1, 2, 3 저장 공간을 버리고
// b 가 가리키는 4, 5, 6 저장 공간의 주소값을 전달받아 참조하게 됨
// 이 때, 기존 1, 2, 3 저장 공간은 더 이상 참조되지 않으므로
// 불필요한 메모리 공간이 되어 Garbage Collector 에 의한 정리 대상이 됨
// => 즉, 더 이상 필요없는 메모리 공간은 자동으로 정리됨
b = c; // c 의 주소값을 b 에 저장
// 기존에 b가 참조하던 4, 5, 6 저장 공간을 버리고
// c 가 가리키는 7, 8, 9 저장 공간의 주소값을 전달받아 참조
// 이 때, 기존 4, 5, 6 저장 공간은 여전히 a에 의해 참조되고 있으므로
// Garbage Collector 에 의한 정리 대상이 아니다!
}
}
/*
1
2
3
4
5
------------------------------------
Java
JSP
Android
------------------------------------
*/
package array;
public class Ex3 {
public static void main(String[] args) {
/*
* 배열 내의 데이터에 대한 연산 누적
* 0. 연산을 누적할 변수 선언 및 초기화
* 1. 배열 생성 및 데이터 저장
* 2. for문을 사용하여 배열 내의 모든 인덱스에 차례대로 접근
* => 배열의 인덱스 번호를 제어변수로 지정하여
* 해당 배열 내의 데이터를 누적 변수에 누적
* 3. for문 종료 후 누적 변수 값 사용
*/
// 0. 합계를 누적할 누적변수(int형 변수 total) 선언 및 초기화
int total = 0;
// 1. 정수형 데이터 1 ~ 10까지를 저장하는 배열 arr 생성
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 2. for문을 사용하여 배열 내의 모든 인덱스에 차례대로 접근
for(int i = 0; i < arr.length; i++) {
// System.out.println(arr[i]); // 배열 내의 모든 데이터 출력
// 배열 내의 모든 데이터를 차례대로 total 변수에 누적
total += arr[i]; // 배열 arr 의 i번 인덱스 데이터를 total 에 누적
}
// 3. 누적 변수(합계) 출력
System.out.println(total);
System.out.println("===============================");
int oddTotal = 0; // 홀수의 합을 누적할 변수
int evenTotal = 0; // 짝수의 합을 누적할 변수
// 배열 내의 모든 인덱스에 차례대로 접근
// => 이 때, 각 인덱스 데이터가 홀수, 짝수일 때 각각의 변수에 누적
for(int i = 0; i < arr.length; i++) {
if(arr[i] % 2 == 0) { // 배열 데이터 arr[i] 가 짝수일 때
// 짝수 합을 저장하는 evenTotal 에 배열 데이터를 누적
evenTotal += arr[i];
} else { // 배열 데이터 arr[i] 가 홀수일 때
// 홀수 합을 저장하는 oddTotal 에 배열 데이터를 누적
oddTotal += arr[i];
}
}
System.out.println("배열 내의 홀수의 합 = " + oddTotal); // 25
System.out.println("배열 내의 짝수의 합 = " + evenTotal); // 30
System.out.println("=====================================");
// 배열 내의 정수 중 최대값을 max 에 저장 후 출력
int max = 0;
int[] array = {1, 5, 3, 8, 7};
for(int i = 0; i < array.length; i++) {
// System.out.println(array[i]);
// max 에 저장된 값과 배열(array)의 i번에 저장된 값을 비교하여
// max 값보다 배열 데이터가(array[i]) 더 클 경우
// 배열 데이터(array[i])를 max 변수에 저장
if(array[i] > max) { // if(max < array[i]) {}
System.out.println(array[i] + " 가(이) " + max + "보다 크다!");
max = array[i];
System.out.println("======> max = " + max);
} else {
System.out.println(array[i] + " 가(이) " + max + "보다 크지 않다!");
}
}
System.out.println("max = " + max);
System.out.println("==============================");
// 주의! 최대값 등의 비교 시 비교 대상을 변수에 직접 저장할 경우
// 조건에 만족하지 않은 데이터가 있을 수 있다!
// 따라서, 배열 내의 데이터를 비교해야하는 경우
// 비교 대상 값으로 배열 내의 데이터를 갖고 시작하는 것이 좋다!
// ex) 음수끼리의 최대값을 계산하는데 초기값으로 0을 설정하는 경우
// 모든 데이터가 0보다 크지 않으므로 최대값 계산이 불가능하게 됨
// => 따라서, 0 대신 배열의 첫번째 데이터를 초기값으로 갖고 비교
int[] array2 = {-9, -5, -3, -8, -7};
// array2 배열의 0번 인덱스 데이터를 최대값으로 저장
int max2 = array2[0];
// 주의! 0번 데이터를 이미 최대값으로 저장했기 때문에
// 0번 인덱스를 제외한 나머지값만 비교하면 됨(1번부터 반복)
for(int i = 1; i < array2.length; i++) {
System.out.println(array2[i] + " vs " + max2);
if(array2[i] > max2) {
max2 = array2[i];
}
}
System.out.println("max2 = " + max2);
}
}
/*
55
=============================
배열 내의 홀수의 합: 25
배열 내의 짝수의 합: 30
=============================
1 가(이) 0보다 크다!
======> max = 1
5 가(이) 1보다 크다!
======> max = 5
3 가(이) 5보다 크지 않다!
8 가(이) 5보다 크다!
======> max = 8
7 가(이) 8보다 크지 않다!
max = 8
=============================
-5 vs -9
-3 vs -5
-8 vs -3
-7 vs -3
max2 = -3
*/
package array;
public class Ex4 {
public static void main(String[] args) {
/*
* 2차원 배열
* - 1차원 배열 여러개의 묶음을 관리하는 배열
* - 행과 열로 이루어진 테이블(표) 구조와 유사한 구조의 배열
* => 행과 열의 인덱스는 1차원 배열과 동일(0부터 시작)
*
* < 2차원 배열 선언 및 생성 기본 문법 >
* 데이터타입[][] 변수명 = new 데이터타입[행크기][열크기];
*
* < 2차원 배열 접근 기본 문법 >
* 변수명[행인덱스][열인덱스];
*
* < 2차원 배열 선언, 생성, 초기화를 한꺼번에 수행하는 문법 >
* 데이터타입[][] 변수명 = {
* {값1, 값2, ..., 값n}, // 0행(0열, 1열, ..., n열)
* {값1, 값2, ..., 값n}, // 1행(0열, 1열, ..., n열)
* ....생략....
* {값1, 값2, ..., 값n}, // m행(0열, 1열, ..., n열)
* };
*/
// int형 2차원 배열 arr 생성(3행 2열 크기)
// int[][] arr;
// arr = new int[3][2];
// 위의 두 문장을 한 문장으로 결합(선언 및 생성 동시에 수행)
int[][] arr = new int[3][2];
/*
* 0열 1열
* -----------------------
* 0행 | 1(0,0) | 2(0,1) |
* -----------------------
* 1행 | 3(1,0) | 4(1,1) |
* -----------------------
* 2행 | 5(2,0) | 6(2,1) |
* -----------------------
*/
arr[0][0] = 1; arr[0][1] = 2;
arr[1][0] = 3; arr[1][1] = 4;
arr[2][0] = 5; arr[2][1] = 6;
System.out.println(arr[0][0]);
System.out.println(arr[0][1]);
System.out.println(arr[1][0]);
System.out.println(arr[1][1]);
System.out.println(arr[2][0]);
System.out.println(arr[2][1]);
System.out.println("-----------------------");
/*
* 0열 1열
* -----------------------
* 0행 | 1(0,0) | 2(0,1) |
* -----------------------
* 1행 | 3(1,0) | 4(1,1) |
* -----------------------
* 2행 | 5(2,0) | 6(2,1) |
* -----------------------
*/
int[][] arr2 = {
// 전체 블록 내의 중괄호(블록) 갯수 = 행의 갯수
// 내부 중괄호(블록) 내의 데이터 갯수 = 열의 갯수
{1, 2}, // 0행(0열, 1열)
{3, 4}, // 1행(0열, 1열)
{5, 6} // 2행(0열, 1열)
};
System.out.println("==============================");
/*
* 이름을 저장하는 배열 names 생성하고 다음과 같이 초기화
* --------------------------------------------------------
* 0행 : 홍길동 이순신 강감찬
* 1행 : 김태희 전지현 송혜교
* 2행 : 유재석 정우성 조인성
* --------------------------------------------------------
*/
String[][] names = {
{"홍길동", "이순신", "강감찬"},
{"김태희", "전지현", "송혜교"},
{"유재석", "정우성", "조인성"}
};
}
}
package array;
public class Test {
public static void main(String[] args) {
// int형 배열 공간 5개를 생성(arr)하고 임의의 정수 5개로 초기화 후 출력
// int[] arr;
// arr = new int[5];
int[] arr = new int[5];
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
// arr[4] = 50; // 초기화하지 않을 경우 4번 인덱스는 0으로 자동 초기화됨
for(int i = 0; i < arr.length; i++) {
System.out.println(i + "번 인덱스 데이터 : " + arr[i]);
}
/*
0번 인덱스 데이터 : 10
1번 인덱스 데이터 : 20
2번 인덱스 데이터 : 30
3번 인덱스 데이터 : 40
4번 인덱스 데이터 : 0
*/
System.out.println("====================================");
// boolean 타입 배열 3개 생성하고
// 임의의 boolean 타입 데이터 초기화 후 출력
boolean[] arr2 = new boolean[3];
arr2[0] = true;
// 1번, 2번 인덱스 초기화하지 않을 경우 기본값 false 로 자동 초기화 됨
for(int i = 0; i < arr2.length; i++) {
System.out.println(i + "번 인덱스 데이터 : " + arr2[i]);
}
/*
0번 인덱스 데이터 : true
1번 인덱스 데이터 : false
2번 인덱스 데이터 : false
*/
System.out.println("====================================");
// String 타입 배열 3개 생성하고
// 0번 "홍길동", 1번 "이순신" 문자열로 초기화 후 출력
String[] arr3 = new String[3];
arr3[0] = "홍길동";
arr3[1] = "이순신";
for(int i = 0; i < arr3.length; i++) {
System.out.println(i + "번 인덱스 데이터 : " + arr3[i]);
}
/*
0번 인덱스 데이터 : 홍길동
1번 인덱스 데이터 : 이순신
2번 인덱스 데이터 : null
*/
System.out.println("===============================");
// double 타입 데이터 5개를 저장하는 배열 arr4 생성 후
// 임의의 4개의 실수로 초기화 후 전체 데이터 차례대로 출력
// double[] arr4;
// arr4 = new double[5];
double[] arr4 = new double[5];
arr4[0] = 1.1;
arr4[1] = 2.2;
arr4[2] = 3.3;
arr4[3] = 4.4;
for(int i = 0; i < arr4.length; i++) {
System.out.println(arr4[i]);
/*1.1
2.2
3.3
4.4
0.0
*/
}
}
}
배열문제 JAVA0416-Test4 다시 풀어보기
package array;
public class Test4 {
public static void main(String[] args) {
int[][] array = {
{95,86},
{83,92,96},
{78,83,93,87,88}
};
//누적값 저장할 변수 선언
int sum = 0;
double avg = 0.0;
int count = 0;
for(int i =0; i <array.length; i++) { //행크기 반복(3번)
for(int j=0; j <array[i].length; j++) { //열크기 반복(10번)
sum += array[i][j]; //데이터값 sum에 누적
count++; //안쪽 for문이 10번 반복할 동안 증감
}
}
avg = (double)sum/ count; // 881.0 / 10 = 88.1
System.out.println("sum : " +sum);
System.out.println("avg : " + avg);
System.out.println("===================================");
/*
* 거스름돈을 몇 개의 동전으로 지불할 수 있는지를 계산하는 문제이다.
* 변수 money 의 금액을 동전으로 바꾸었을 때
* 각각 몇 개의 동전이 필요한지 계산해서 출력하라.
* 단, 가능한 한 적은 수의 동전으로 거슬러 주어야한다
* [Hint] 나눗셈 연산자와 나머지 연산자를 사용해야 한다.
*
* [ 출력 예시 ]
* money = 2680
* 500원 = 5
* 100원 = 1
* 50원 = 1
* 10원 = 3
*/
int[] coinUnit = {500, 100, 50, 10};
int money = 2680;
System.out.println(money);
for(int i = 0; i <coinUnit.length; i++) {
/*
* 거스름돈(money)을 각 동전으로 나누었을 때 몫 = 필요 동전 수
* 거스름돈(money)을 각 동전으로 나눈 나머지 = 남은 거스름돈
*/
System.out.println(coinUnit[i] + "원 : " + money/coinUnit[i]);
money%= coinUnit[i]; //**데이터값 0자리부터 나눠서 남은 값을 차레대로 나눈 나머지
}
System.out.println("남은 거스름돈 : " + money);
}
}
반응형
'JAVA' 카테고리의 다른 글
[Java] 객체지향(Method) (0) | 2021.10.28 |
---|---|
[Java] 배열 테스트 문제 (0) | 2021.10.28 |
[Java] 반복문 (0) | 2021.10.26 |
[Java] 다중 else if 문, 중첩 if문, switch문 (0) | 2021.10.26 |
[Java] 조건문(if문, else if문) (0) | 2021.10.26 |