8-1. 배열 시작
Array1.java
package array;
public class Array1 {
public static void main(String[] args) {
int student1 = 90;
int student2 = 80;
int student3 = 70;
int student4 = 60;
int student5 = 50;
System.out.println("학생1 점수: " + student1);
System.out.println("학생2 점수: " + student2);
System.out.println("학생3 점수: " + student3);
System.out.println("학생4 점수: " + student4);
System.out.println("학생5 점수: " + student5);
}
}
- 배열은 같은 타입의 변수를 반복해서 선언하고, 반복해서 사용하는 문제를 해결할 때 사용
8-2. 배열의 선언과 생성
배열: 같은 타입의 변수를 사용하기 편하게 하나로 묶어둔 것.
Array1Ref1.java
package array;
public class Array1Ref1 {
public static void main(String[] args) {
int[] students; // 배열 변수 선언
students = new int[5]; // 배열 생성
// 변수 값 대입
students[0] = 90;
students[1] = 80;
students[2] = 70;
students[3] = 60;
students[4] = 50;
// 변수 값 사용
System.out.println("학생1 점수: " + students[0]);
System.out.println("학생2 점수: " + students[1]);
System.out.println("학생3 점수: " + students[2]);
System.out.println("학생4 점수: " + students[3]);
System.out.println("학생5 점수: " + students[4]);
}
}
1. 배열 변수 선언
- 타입[ ] 변수명;
- 배열 변수에 10, 20과 같은 값 뿐만 아니라 배열을 담을 수 있다.
2. 배열 생성
- 자바는 배열을 생성할 때 내부값을 자동으로 초기화한다.
- 생성시 new 입력
- 숫자는 0 , boolean 은 false , String 은 null (없다는 뜻이다.)로 초기화
3. 배열 참조값 보관 (메모리 주소)
- 배열을 생성하면 배열의 크기만큼 메모리를 확보
new int[5]일 때, 4byte * 5 => 20byte 확보 - 배열 생성 후 자바는 메모리 어딘가에 있는 이 배열에 접근할 수 있는 참조값(주소)( x001 )을 반환
- 앞서 선언한 배열 변수인 int[] students 에 생성된 배열의 참조값( x001 )을 보관
변수명에는 배열의 위치만 들어가 있고 그 위치로 가야지 배열이 있다.
ex) students = x001
// 참조값 확인
System.out.println(students);
- [I => 인트형 배열
- @의 뒷부분 => 메모리 주소(참조값)를 16진수로 표현
8-3. 배열 사용
인덱스 index
- 배열은 변수와 사용법이 비슷한데 차이점이 => [ ] 사이에 숫자번호를 넣어 사용
- 배열의 위치를 나타내는 숫자 => 인덱스
- 배열은 0부터 시작
때문에, new int[5] 일때, 사용 가능한 인덱스의 범위는 0 ~ (n-1) 이다. => 0, 1, 2, 3, 4 - students[5]를 사용하면 오류(예외) 발생한다.
배열에 값 대입
- students[0] = 90; // 1. 배열에 값을 대입
- x001[0] = 90; // 2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에 접근, 값 대입
배열에 값 읽기
- 대입과 동일한 순서
기본형 vs 참조형 (자바 변수의 데이터 타입을 크게 분류)
기본형 Primitive Type
사용하는 값을 직접 넣을 수 있음
int , long , double , boolean 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입
참조형 Reference Type
배열 변수와 같이 메모리의 참조값을 넣을 수 있음
int[ ] students와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입
=> 객체나 클래스를 담을 수 있는 변수들도 모두 참조형
- 기본형은 선언과 동시에 크기가 정적으로 정해진다. => 크기를 동적으로 바꿀 수 없다.
- 배열과 같은 참조형은 크기를 동적으로 할당할 수 있다. => 동적 메모리 할당
8-4. 배열 리펙토링
리펙토링(Refactoring) :
기존 코드 기능은 유지하면서 내부 구조를 개선하여 가독성을 높이고, 유지보수를 용이하게 하는 과정
중복을 제거하고, 복잡성을 줄이며, 이해하기 쉬운 코드로 만드는 과정
Array1Ref2.java
package array;
public class Array1Ref2 {
public static void main(String[] args) {
int[] students; // 배열 변수 선언
students = new int[5]; // 배열 생성
// 변수 값 대입
students[0] = 90;
students[1] = 80;
students[2] = 70;
students[3] = 60;
students[4] = 50;
// 변수 값 사용
for (int i = 0; i < students.length; i++) {
System.out.println("학생" + (i + 1) + " 점수: " + students[i]);
}
}
}
- students.length => 배열의 길이
Array1Ref3.java - 초기화
package array;
public class Array1Ref3 {
public static void main(String[] args) {
int[] students; // 배열 변수 선언
students = new int[]{90, 80, 70, 60, 50}; // 배열 생성과 초기화
// 변수 값 사용
for (int i = 0; i < students.length; i++) {
System.out.println("학생" + (i + 1) + " 점수: " + students[i]);
}
}
}
Array1Ref4.java - 간단한 배열 생성
package array;
public class Array1Ref4 {
public static void main(String[] args) {
// 배열 생성 간략 버전, 배열 선언과 함께 사용시 new int[] 생략 가능
int[] students = {90, 80, 70, 60, 50};
for (int i = 0; i < students.length; i++) {
System.out.println("학생" + (i + 1) + " 점수: " + students[i]);
}
}
}
- int[ ] students = {90, 80, 70, 60, 50}; 는 되지만,
- int[ ] students;
students = {90, 80, 70, 60, 50}; 는 안된다. - 학생의 점수를 추가해도 {90, 80, 70, 60, 50} 의 내용만 변경하고 나머지 코드는 변경하지 않아도 된다
8-5. 2차원 배열 - 시작
- 2차원 배열은 행(row)과 열(column)로 구성된다.
- arr[행][열]
- 선언 => int[ ][ ] arr = new int[2][3]
- 사용 => arr[1][2]
ArrayDi0.java
package array;
public class ArrayDi0 {
public static void main(String[] args) {
// 2x3 2차원 배열 만들기
int[][] arr = new int[2][3]; // 행2, 열3
arr[0][0] = 1; //0행, 0열
arr[0][1] = 2; //0행, 1열
arr[0][2] = 3; //0행, 2열
arr[1][0] = 4; //1행, 0열
arr[1][1] = 5; //1행, 1열
arr[1][2] = 6; //1행, 2열
// 0행 출력
System.out.print(arr[0][0] + " "); //0열 출력
System.out.print(arr[0][1] + " "); //1열 출력
System.out.print(arr[0][2] + " "); //2열 출력
System.out.println(); // 한 행이 끝나면 라인을 변경
// 1행 출력
System.out.print(arr[1][0] + " "); //0열 출력
System.out.print(arr[1][1] + " "); //1열 출력
System.out.print(arr[1][2] + " "); //2열 출력
System.out.println(); // 한 행이 끝나면 라인을 변경
}
}
8-6. 2차원 배열 - 리펙토링1
ArrayDi1.java - 구조 개선 (행 출력)
package array;
public class ArrayDi1 {
public static void main(String[] args) {
// 2x3 2차원 배열 만들기
int[][] arr = new int[2][3]; // [row][column]
arr[0][0] = 1; //0행, 0열
arr[0][1] = 2; //0행, 1열
arr[0][2] = 3; //0행, 2열
arr[1][0] = 4; //1행, 0열
arr[1][1] = 5; //1행, 1열
arr[1][2] = 6; //1행, 2열
for (int row = 0; row < 2; row++) {
System.out.print(arr[row][0] + " "); //0열 출력
System.out.print(arr[row][1] + " "); //1열 출력
System.out.print(arr[row][2] + " "); //2열 출력
System.out.println(); // 한 행이 끝나면 라인을 변경
}
}
}
ArrayDi2.java - 구조 개선 (열 출력)
package array;
public class ArrayDi2 {
public static void main(String[] args) {
// 2x3 2차원 배열 만들기
int[][] arr = new int[2][3]; // [row][column]
arr[0][0] = 1; //0행, 0열
arr[0][1] = 2; //0행, 1열
arr[0][2] = 3; //0행, 2열
arr[1][0] = 4; //1행, 0열
arr[1][1] = 5; //1행, 1열
arr[1][2] = 6; //1행, 2열
for (int row = 0; row < 2; row++) {
for (int column = 0; column < 3; column++) {
System.out.print(arr[row][column] + " ");
}
System.out.println(); // 한 행이 끝나면 라인을 변경
}
}
}
8-7. 2차원 배열 - 리펙토링2
ArrayDi3.java - 구조 개선 (초기화, 배열의 길이)
package array;
public class ArrayDi3 {
public static void main(String[] args) {
// 2x3 2차원 배열 만들기
int[][] arr = {
{1, 2, 3},
{4, 5, 6}
};
for (int row = 0; row < arr.length; row++) {
for (int column = 0; column < arr[row].length; column++) {
System.out.print(arr[row][column] + " ");
}
System.out.println(); // 한 행이 끝나면 라인을 변경
}
}
}
- 행 길이 => arr.length
- 열 길이 => arr[row].length
ArrayDi4.java - 구조 개선 (값 입력)
package array;
public class ArrayDi4 {
public static void main(String[] args) {
// 선언, 생성: 2차원 배열 만들기
int[][] arr = new int[10][10];
// 입력: 순서대로 1씩 증가하는 값을 입력
int i = 1;
for (int row = 0; row < arr.length; row++) {
for (int column = 0; column < arr[row].length; column++) {
arr[row][column] = i++;
}
}
// 출력: 2차원 배열의 길이 활용 출력
for (int row = 0; row < arr.length; row++) {
for (int column = 0; column < arr[row].length; column++) {
System.out.print(arr[row][column] + " ");
}
System.out.println(); // 한 행이 끝나면 라인을 변경
}
}
}
8-8. 향상된 for문
향상된 for문(Enhanced For Loop)
각각의 요소를 탐색한다는 의미로 for-each문 이라고도 함
배열을 사용할 때 기존 for문 보다 더 편리하게 사용
for (변수 : 배열 또는 컬렉션) {
// 배열 또는 컬렉션의 요소를 순회하면서 수행할 작업
// iter(향상된 for문 단축키)
}
EnhancedFor1.java
package array;
public class EnhancedFor1 {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
// 일반 for문
for (int i = 0; i < numbers.length; i++) {
int number = numbers[i];
System.out.println(number);
}
// 향상된 for문, for-each문
for (int number : numbers) { // 단축키 => iter
System.out.println(number);
}
// for-each문을 사용할 수 없는 경우, 증가하는 index 값이 필요할 때
for (int i = 0; i < numbers.length; i++) {
System.out.println("number" + i + "번의 결과는: " + numbers[i]);
}
}
}
- 인덱스 값이 필요할 경우, 향상된 for문 (for-each문) 을 사용할 수 없다.
8-9. 문제와 풀이1
ArrayEx1Ref.java
package array.ex;
public class ArrayEx1Ref {
public static void main(String[] args) {
int[] students = {90, 80, 70, 60, 50};
int total = 0;
for (int i = 0; i < students.length; i++) {
total += students[i];
}
double average = (double) total / students.length;
System.out.println("점수 총합: " + total);
System.out.println("점수 평균: " + average);
}
}
- 평균을 계산할 때, total을 double로 형변환 해줘야 한다.
ArrayEx2.java
package array.ex;
import java.util.Scanner;
public class ArrayEx2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] numbers = new int[5];
System.out.println("5개의 정수를 입력하세요:");
for (int i = 0; i < numbers.length; i++) {
numbers[i] = scanner.nextInt();
}
System.out.println("출력");
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i]);
if (i < numbers.length - 1) {
System.out.print(", ");
}
}
}
}
ArrayEx3.java
package array.ex;
import java.util.Scanner;
public class ArrayEx3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] numbers = new int[5];
System.out.println("5개의 정수를 입력하세요:");
for (int i = 0; i < numbers.length; i++) {
numbers[i] = scanner.nextInt();
}
System.out.println("입력한 정수를 역순으로 출력");
for (int i = numbers.length-1; i >= 0; i--) {
System.out.print(numbers[i]);
if (i > 0) {
System.out.print(", ");
}
}
}
}
ArrayEx4.java
package array.ex;
import java.util.Scanner;
public class ArrayEx4 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] numbers = new int[5];
int total = 0;
System.out.println("5개의 정수를 입력하세요:");
for (int i = 0; i < numbers.length; i++) {
numbers[i] = scanner.nextInt();
total += numbers[i];
}
double average = (double) total / numbers.length;
System.out.println("입력한 정수의 합계: " + total);
System.out.println("입력한 정수의 평균: " + average);
}
}
ArrayEx5.java
package array.ex;
import java.util.Scanner;
public class ArrayEx5 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] numbers;
int total = 0;
double average;
System.out.print("입력받을 숫자의 개수를 입력하세요: ");
int count = scanner.nextInt();
numbers = new int[count];
System.out.println(count + "개의 정수를 입력하세요:");
for (int i = 0; i < numbers.length; i++) {
numbers[i] = scanner.nextInt();
total += numbers[i];
}
average = (double) total / numbers.length;
System.out.println("입력한 정수의 합계: " + total);
System.out.println("입력한 정수의 평균: " + average);
}
}
8-10. 문제와 풀이2
ArrayEx6.java
package array.ex;
import java.util.Scanner;
public class ArrayEx6 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("입력받을 숫자의 개수를 입력하세요: ");
int count = scanner.nextInt();
int[] numbers = new int[count];
System.out.println(count + "개의 정수를 입력하세요:");
for (int i = 0; i < numbers.length; i++) {
numbers[i] = scanner.nextInt();
}
int min = numbers[0];
int max = numbers[0];
// minNumber = maxNumber = numbers[0]; 강의자료
for (int i = 0; i < numbers.length; i++) {
if (min > numbers[i]){
min = numbers[i];
} else if (max < numbers[i]) {
max = numbers[i];
}
}
System.out.println("가장 작은 정수: " + min);
System.out.println("가장 큰 정수: " + max);
}
}
ArrayEx7.java
package array.ex;
import java.util.Scanner;
public class ArrayEx7 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[][] scores = new int[4][3];
for (int row = 0; row < scores.length; row++) {
System.out.println((row+1)+"번 학생의 성적을 입력하세요:");
for (int column = 0; column < scores[row].length; column++) {
if (column == 0) {
System.out.print("국어 점수: ");
scores[row][column] = scanner.nextInt();
}
if (column == 1) {
System.out.print("영어 점수: ");
scores[row][column] = scanner.nextInt();
}
if (column == 2) {
System.out.print("수학 점수: ");
scores[row][column] = scanner.nextInt();
}
}
}
for (int row = 0; row < scores.length; row++) {
int total = 0;
double average;
for (int column = 0; column < scores[row].length; column++) {
total += scores[row][column];
}
average = (double) total / scores[row].length;
System.out.println((row + 1) + "번 학생의 총점: " + total + ", 평균: " + average);
}
}
}
강의풀이 => 과목명을 배열로 만들어서 돌림
public class ArrayEx7 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[][] scores = new int[4][3];
String[] subjects = {"국어", "영어", "수학"};
for(int i=0; i<4; i++){
System.out.println((i+1) + "번 학생의 성적을 입력하세요:");
for(int j=0; j<3; j++){
System.out.print(subjects[j] + " 점수:");
scores[i][j] = scanner.nextInt();
}
}
for(int i=0; i<4; i++){
int total = 0;
for(int j=0; j<3; j++){
total += scores[i][j];
}
double average = total / 3.0;
System.out.println((i+1) + "번 학생의 총점: " + total + ", 평균: " +
average);
}
}
}
ArrayEx8.java
package array.ex;
import java.util.Scanner;
public class ArrayEx8 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("학생 수를 입력하세요: ");
int count = scanner.nextInt();
int[][] scores = new int[count][3];
String[] subject = {"국어", "영어", "수학"};
for (int row = 0; row < scores.length; row++) {
System.out.println((row+1)+"번 학생의 성적을 입력하세요:");
for (int column = 0; column < scores[row].length; column++) {
System.out.print(subject[column] + " 점수: ");
scores[row][column] = scanner.nextInt();
}
}
for (int row = 0; row < scores.length; row++) {
int total = 0;
for (int column = 0; column < scores[row].length; column++) {
total += scores[row][column];
}
double average = (double) total / scores[row].length;
System.out.println((row + 1) + "번 학생의 총점: " + total + ", 평균: " + average);
}
}
}
8-11. 문제와 풀이3
ProductAdminEx.java
package array.ex;
import java.util.Scanner;
public class ProductAdminEx {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int maxProduct = 10; // 제약조건: 상품은 최대 10개
String[] productNames = new String[maxProduct];
int[] productPrices = new int[maxProduct];
int productCount = 0; // 등록된 상품 개수 저장 변수
while (true) {
System.out.print("1. 상품 등록 | 2. 상품 목록 | 3. 종료\n메뉴를 선택하세요: ");
int i = scanner.nextInt();
scanner.nextLine(); // 숫자 입력 후 줄바꿈 처리
if (i == 1) {
if (productCount < maxProduct) {
System.out.print("상품 이름을 입력하세요: ");
productNames[productCount] = scanner.nextLine();
System.out.print("상품 가격을 입력하세요: ");
productPrices[productCount] = scanner.nextInt();
productCount++;
} else {
System.out.println("더 이상 상품을 등록할 수 없습니다.");
}
}
if (i == 2) {
if (productCount == 0) {
System.out.println("등록된 상품이 없습니다.");
} else {
for (int j = 0; j < productCount; j++) {
System.out.println("상품명: "+productNames[j]+", 가격: "+productPrices[j]);
}
}
}
if (i == 3) {
System.out.println("프로그램을 종료합니다.");
break;
}
}
}
}
- scanner.nextLine(); // 숫자 입력 후 줄바꿈 처리