- 같은 자료형의 변수를 하나의 묶음으로 다루는 것 (자료 구조)
- 묶여진 변수들은 하나의 배열명으로 불려지고, 구분은 index를 이용함 (index는 0부터 시작하는 정수)
메모리에 값을 저장할 수 있는 공간을 할당
: 메모리에 배열을 참조하는 변수 공간을 할당(값 직접 저장X, 배열의 주소를 저장)
자료형[] 배열명; 자료형 배열명[];
실제 값을 저장할 수 있는 배열을 메모리에 생성
자료형[ ] 배열명 = new 자료형[배열크기]; 자료형 배열명[ ] = new 자료형[배열크기] ;
1-1. 변수 선언
int num;
// Stack 영역에 int 자료형을 저장할 수 있는 공간 4byte를 생성(할당)하고
// 그 공간에 num이라는 이름을 부여
1-2. 변수 대입
num = 10;
// 생성된 num이라는 변수 공간에 10을 대입
1-3. 변수 사용
System.out.println("num에 저장된 값 : " + num);
// num이 작성된 자리에 num에 저장된 값을 읽어 와서 출력
2-1. 배열 선언
int[] arr;
// Stack 영역에 int[] (int 배열) 자료형 공간을 8byte 할당하고
// 그 공간에 arr이라는 이름을 부여
// *** 해당 변수는 참조형으로 주소 값(8byte)만을 저장할 수 있음
2-2. 배열 할당
arr = new int[3];
// new : "new 연산자"라고 하며
// Heap 메모리 영역에 새로운 공간(배열, 객체)을 할당
// int[3] : int 자료형 변수 3개를 하나의 묶음으로 나타내는 배열
// new int[3] : heap 영역에 int 3칸짜리 int[]을 생성(할당)
// ** 생성된 int[]에는 시작 주소가 지정된다!! **
// arr = new int[3];
// (int[]) (int[]) -> 같은 자료형 == 연산 가능
// heap 영역에 생성된 int[]의 시작 주소를
// stack 영역에 생성된 arr 변수에 대입
// -> arr 변수가 int[]을 참조하게 됨!
// (그래서 arr을 참조형이라고 함)
2-3. 배열 요소 값 대입
// arr은 int[] 참조형 변수이지만
// arr[0]은 int 자료형 변수이기 때문에 정수 값을 대입할 수 있다.
arr[0] = 10;
arr[1] = 50;
arr[2] = 1000;
2-4. 배열 요소 값 읽어 오기
System.out.println(arr[0]); // arr이 참조하고 있는 배열의 0번 인덱스 값을 얻어 옴
System.out.println(arr[1]); // arr이 참조하고 있는 배열의 1번 인덱스 값을 얻어 옴
System.out.println(arr[2]); // arr이 참조하고 있는 배열의 2번 인덱스 값을 얻어 옴
- 비어 있다 : stack 영역에 선언된 변수에 값이 대입되지 않음
- null : 참조형 변수가 선언되었으나 아무 곳도 참조하지 않음 (빈 칸 아님!)
- 0 : int 자료형 0 (확실히 존재하는 값)
- "" : String 자료형이지만 내용 없음(빈 문자열)
int[] arr = new int[4];
// 1) stack 영역에 int[] 자료형 참조형 변수 arr 선언
// 2) heap 영역에 int 자료형 4개를 묶음으로 다루는 int[] 할당
// 3) 생성된 int[]의 주소를 arr에 대입하여
// 참조하는 형태를 만든다.
// 배열 길이(몇 칸인가) : 배열명.length
System.out.println("배열의 길이 : " + arr.length);
arr[0] = 100;
arr[1] = 200;
arr[2] = 500;
arr[3] = 1000;
// 배열과 for문
// i == index
for(int i = 0; i < arr.length; i++) {
// 0 이상 arr 배열 길이 미만의 정수
System.out.printf("arr[%d]에 저장된 값 : %d\n", i, arr[i]);
}
1번 키 입력 : 170.5
2번 키 입력 : 165.7
3번 키 입력 : 184.3
4번 키 입력 : 190.2
5번 키 입력 : 174.4
입력 받은 키 : 170.5 165.7 184.3 190.2 174.4
평균 : 177.02cm
Scanner sc = new Scanner(System.in);
double[] height = new double[5];
// double[] 자료형 참조 변수 height를 stack 영역에 생성하고
// heap 영역에 새로 생성된 double 5칸 짜리 double[]의 시작 주소를 height에 대입
for(int i = 0; i < height.length; i++) {
System.out.print((i + 1) + "번 키 입력 : ");
height[i] = sc.nextDouble();
// 각 인덱스에 입력받은 값을 대입(초기화)
}
System.out.println(); // 줄바꿈
// 평균 = 합계 / 합계에 더해진 값의 수
double sum = 0;
System.out.print("입력받은 키 : ");
for(int i = 0; i < height.length; i++) {
System.out.print(height[i] + " ");
sum += height[i]; // 배열에 저장된 값을 sum에 누적
}
System.out.printf("\n평균 : %.2f\n", sum / height.length);
입력 받을 인원 수 : 4
1번 점수 입력 : 100
2번 점수 입력 : 80
3번 점수 입력 : 50
4번 점수 입력 : 60
합계 : 290
평균 : 72.50
최고점 : 100
최저점 : 50
Scanner sc = new Scanner(System.in);
System.out.printf("입력 받을 인원 수 : ");
int input = sc.nextInt();
// 배열 선언 및 할당
// 할당할 배열의 크기는 입력 받은 크기(input)만큼
int[] score = new int[input];
int sum = 0; // 합계 저장용 변수
for(int i = 0; i < score.length; i++) {
System.out.print((i + 1) + "번 점수 입력 : ");
score[i] = sc.nextInt();
sum += score[i]; // 점수를 입력받자마자 sum에 누적
}
// 최고 / 최저점 구하기
int max = score[0];
int min = score[0];
// 아래 for문을 이용해서 score 배열에 있는 모든 값과 max, min을 비교
// 이때,
// score[i] 값이 max보다 크면 max에 대입
// score[i] 값이 min보다 작으면 min에 대입
for(int i = 0; i <score.length; i ++) {
if(score[i] > max) { // 최고점 비교
max = score[i];
} else if(score[i] < min) { // 최저점 비교
min = score[i];
}
}
System.out.println("합계 : " + sum);
System.out.printf("평균 : %.2f\n", (double)sum / score.length);
System.out.println("최고점 : " + max);
System.out.println("최저점 : " + min);
char[] arr = new char[5];
// char[] arr이 참조하는 배열 요소에 A, B, C, D, E 대입하기
for(int i = 0; i < arr.length; i++) {
arr[i] = (char)('A' + i); // 'A' 다음 문자에 대응되는 번호
// A == 65
// B == 66
// C == 67
}
// ** Arrays 클래스
// -> Java에서 제공하는 배열과 관련된 기능을 모아둔 클래스
int[] arr2 = new int[4];
System.out.println(arr2); // [I@27808f31
// Arrays.toString(배열형) : 모든 요소 값을 출력
System.out.println( Arrays.toString(arr2) );
System.out.println( Arrays.toString(arr) );
// 배열 선언과 동시에 (할당 및) 초기화
char[] arr3 = {'A', 'B', 'C', 'D', 'E'};
// char[] 참조 변수 arr3를 선언하고
// heap 영역에 char 5칸짜리 char[]을 생성하고
// 각각 'A', 'B', 'C', 'D', 'E'로 초기화 후 주소를 arr3에 대입
// {} (중괄호)는 배열의 리터럴 표기법
System.out.println("arr3 길이 : " + arr3.length);
System.out.println(Arrays.toString(arr3));
}
String[] arr = {"김밥", "서브웨이", "햄버거", "백반", "국밥", "파스타"};
// 0 ~ (배열 길이 -1)사이의 난수 발생
System.out.println("오늘의 점심 메뉴 : " + arr[ (int)(Math.random() * 6) ]);
// 0.0 <= x < 1.0
// 0.0 <= x * 6 < 6.0
// 0 <= (int)(x * 6) < 6
// -> 0 1 2 3 4 5
배열을 이용한 검색
입력받은 정수가 배열에 있는지 없는지 확인
만약 있다면 몇 번 인덱스에 존재하는지도 출력
int[] arr = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
Scanner sc = new Scanner(System.in);
System.out.print("정수 입력 : ");
int input = sc.nextInt();
// 신호를 나타내기 위한 변수
// flag == false : 일치하는 값이 존재하지 않음
// flag == true : 일치하는 값이 존재
boolean flag = false; // 검사 전에는 없다고 가정
// arr 배열 요소 순차 접근(반복 접근)
for(int i = 0; i < arr.length; i++) {
// arr[i]에 저장된 값과 input이 같을 경우
if(arr[i] == input) {
System.out.println(i + "번째 인덱스에 존재");
flag = true; // 일치하는 값이 있으므로 true로 변경
}
}
// flag 상태를 검사
if(!flag) {
System.out.println("존재하지 않음");
}
[예제 1]
입력받은 값과 일치하는 값이 있으면 인덱스 번호 출력
없으면 "존재하지 않음"
String[] arr = {"사과", "딸기", "바나나", "키위", "멜론", "아보카도"};
Scanner sc = new Scanner(System.in);
System.out.print("과일 입력 : ");
String input = sc.next();
boolean flag = false;
for(int i = 0; i <arr.length; i++) {
if(arr[i].equals(input)) { // String 비교 시 equals() 사용
System.out.println(i + "번 인덱스에 존재");
flag = true;
}
}
if(!flag) { // flag가 false인 경우
System.out.println("존재하지 않음");
}
[예제 2]
1. 문자열을 입력받아 한 글자씩 잘라내어 char 배열에 순서대로 저장
2. 문자 하나를 입력받아 일치하는 문자가 char 배열에 맞게 존재하는지 확인
3. 단, 일치하는 문자가 없을 경우 "존재하지 않습니다." 출력
[사용해야 되는 기술, 기능]
1) 배열 검색
2) String.length() : 문자열의 길이
ex) "Hello".length() -> 5
3) String.charAt(index) : 문자열에서 특정 index에 위치한 문자 하나를 얻어 옴
ex) "Hello".charAt(1) -> 'e'
01234 (인덱스 번호)
4) count (숫자 세기)
Scanner sc = new Scanner(System.in);
System.out.print("문자열 입력 : ");
String input = sc.nextLine(); // 한 줄(띄어쓰기 포함) 입력 받기
// 1. 문자열을 입력받아 한 글자씩 잘라내어 char 배열에 순서대로 저장
char[] arr = new char[input.length()];
for(int i = 0; i < arr.length; i++) {
arr[i] = input.charAt(i);
// arr[i]에 입력받은 문자열 중 i번째 문자를 대입
}
// 중간 확인
// System.out.println(arr);
// System.out.println(Arrays.toString(arr));
// 2. 문자 하나를 입력받아 일치하는 문자가 char 배열에 맞게 존재하는지 확인
System.out.print("검색할 문자 입력 : ");
char ch = sc.nextLine().charAt(0);
// nextChar()는 없으므로 nextLine()의 첫 번째 문자 얻기
// String.charAt(0); : 문자열 제일 앞 문자 얻어 오기
int count = 0; // 같은 글자 개수를 세기 위한 변수
for(int i = 0; i < arr.length; i++) {
if(arr[i] == ch) {
// arr[i] 값과 검색할 문자 ch가 같은 경우
// -> 카운트
count++;
}
}
// 결과 출력
if(count != 0) {
System.out.println(count + "개 있음");
} else{
// 3. 단, 일치하는 문자가 없을 경우 "존재하지 않습니다." 출력
System.out.println("존재하지 않습니다.");
}