배열이란?
같은 종류의 데이터들이 순차적으로 저장되는 것
변수를 많이 만들면 코드 또한 길고 지저분 해진다. 쉽고 간단하게 해결하기 위하여 배열을 사용한다.
1. 배열 사례
그림과 같이 배열을 사용하면 다음 코드로 간단하게 10개의 정수 공간을 가진 배열을 생성할 수 있다.
int i[] = new int[10]; //10개의 정수 공간 배열을 생성. 배열 이름은 i
배열을 사용하는 가장 큰 이유 중 하나는 반복문의 활용에 있다. 배열을 사용하면 다음과 같이 for문으로 10개의 정수 합을 간단히 구할 수 있다.
for(sum=0, n=0; n<10; n++)
sum += i[n];
2. 배열 선언 및 생성
1. 배열에 대한 레퍼런스 변수 선언
int intArray[]; //' int(숫자 형태로)의 이름을 intArray로 할거야' 하고 선언하는 것
// int = 배열 타입 / intArray = 배열에 대한 레퍼런스 변수 / [] = 배열선언
2. 배열생성- 배열의 저장 공간 할당
intArray = new int[5]; // intArray의 이름으로 int(숫자)형태의 5개 공간이 필요하대.
// intArray = 배열에 대한 레퍼런스 변수 / new = 배열 생성 / int = 타입 / [5] = 원소개수
- 배열선언 만으로는 배열 공간이 할당되지 않으므로 꼭 배열 공간 할당을 받아야한다.
- 배열을 선언할 때 []에 크기를 지정하면 안된다.
int a[5]; //컴파일 오류. 배열의 크기를 지정할 수 없음.
// 변수를 선언하면서 '5칸 줘' 라고 하는건데, heap에 아직 공간을 할당 받지 못해서 안됨.
// new를 통해서 공간을 할당 받아야 사용할 수 있음.
- 배열의 선언과 생성을 동시에도 가능하다.
int intArray[] = new int[5];
//=> intArray의 이름을 가진 숫자형태로 5개의 공간이 필요하다.
3. 배열 초기화
배열 선언문에서 { }에 원소를 나열하면 초기화된 배열을 만들 수 있다. 생성되는 배열의 원소 개수는 { }에 나열된 값으로 개수가 정해지므로 [ ] 에 크기를 주어서는 안된다.
int intArray[] = {4, 3, 2, 1, 0};
intArray 배열의 크기는 자동으로 5(0부터 시작해서 4까지)가 된다.
double doubleArray[] = {0.01, 0.02, 0.03, 0.04};
doubleArray 배열의 크기는 자동으로 4(0부터 시작해서 3까지)가 된다.
4. 배열 인덱스와 배열 원소 접근
배열 인덱스는 정수만 가능하다. 인덱스는 0부터 시작하며 마지막 원소의 인덱스는 (배열크기 -1)이다. (0부터 시작했기 때문에)
int intArray[] = new int[5]; // 원소가 5개인 배열 생성. 인덱스는 0~4까지 가능
intArray[0] = 5; // 원소 0에 5 저장
intArray[3] = 6; // 원소 3에 6 저장
int n = intArray[3]; // 원소 3의 값을 읽어 n에 저장. n은 6이 됨
5. 레퍼런스 치환과 배열 공유
레퍼런스 변수와 배열 공간이 분리되어 있어 다수의 래퍼런스 변수가 하나의 배열 공간을 가리키는 배열 공유가 쉽게 이루어진다.
int intArray[] = new int[5];
int myArray[] = intArray; // 래퍼런스 치환. myArray는 intArray와 동일한 배열 참조
int myArray[] = intArray; 를 보면 래퍼런스 변수 myArray를 생성하고 intArray의 값을 myArray에 치환하는 코드이다. 이 치환으로 intArray 배열이 복사되는 것이 아니라 배열의 주소만 복사된다. 그 결과 myArray는 intArray와 동일한 래퍼런스 값을 가지게 되어 myArray는 intArray의 배열을 공유하게 되고, myArray로 intArray의 배열 원소를 마음 대로 접근할 수 있다.
위 그림은 intArray가 참조하는 배열을 myArray도 참조하고 있음을 볼 수 있다.
intArray[1] = 2;
myArray[1] = 6;
위 그림을 보면 intArray와 myArray가 같은 배열을 참조하기 있기 때문에, myArray[1]=6;에 의해 먼저 기록된 값 2가 6으로 변경되는 것을 보여준다.
6. String을 이용한 참조변수, 문자열 비교 (레퍼런스 치환과 배열 공유)
String str1 = "빅데이터";
String str2 = "빅데이터";
if(str1 == str2) {
System.out.println("str1과 str2 참조변수가 같음");
} else {
System.out.println("str1과 str2 참조변수가 다름");
}
if(str1.equals(str2)) {
System.out.println("str1과 str2 문자열이 같음");
}
String str3 = new String("UI개발");
String str4 = new String("UI개발");
//str3 = str4; 혹은 str4 =str3; 을 사용하면 참조변수가 같음 이라고 출력할 수 있음.
if(str3 == str4) { //==을 사용하면 3번이 가르키는 곳과 4번이 가르키는 곳이 같니? 문자열을 비교하는것이 아니고 위치를 묻는것
// 여기서는 heap에서 저장된 위치가 다르기 때문에 다르다고 출력됨.
System.out.println("str3과 str4 참조변수가 같음");
} else {
System.out.println("str3과 str4 참조변수가 다름");
}
if(str3.equals(str4)) {
System.out.println("str3과 str4 문자열이 같음");
}
7. 양수 5개를 입력받아 배열에 저장하고 제일 큰 수를 출력하는 프로그램을 작성하라
import java.util.Scanner;
public class p1130b {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int intArray[] = new int[5];
int max=0;
System.out.println("양수 5개를 입력하세요.");
for(int i=0; i<5; i++) {
intArray[i] = sc.nextInt();
if(intArray[i] > max )
max = intArray[i];
}
System.out.print("가장 큰 수는 "+ max + "입니다.");
sc.close();
}
}
8. 배열의 크기, length 필드
배열이 생성되면 객체가 생성된다. 이 객체는 배열의 저장 공간과 함께 배열의 크기 값을 가진 length필드가 존재한다.
length필드를 이용하면 배열의 크기를 다음과 같이 간단하게 알아낼 수 있다.
int intArray[];
intArray = new int[5];
int size = intArray.length;
// size는 5
<배열은 객체로 관리되며 배열의 크기를 가진 멤버는 length필드>
배열 객체에 length 필드가 있기 때문에 배열의 크기를 따로 관리할 필요가 없어서 배열의 크기 만큼 반복할때 length 필드는 매우 유용하다.
for(int i =0 ; i<intArray.length ; i++) //intArray 배열 크기(5)만큼 반복한다.
System.out.println(intArray[i]);
9. 7번의 양수 5개를 입력받아 배열에 저장하고 제일 큰 수를 출력하는 프로그램을 배열의 l ength 필드를 이용하여 작성하라
import java.util.Scanner;
public class p1130d {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int intArray[] = new int[5];
int max = 0;
System.out.println("양수 5개를 입력하세요.");
for(int i=0 ; i<intArray.length; i++) {
// i<5 = 배열의 길이, i가 5를 초과하면 안된다는 뜻 i<intArray.length대신 i<5 로 쓸수 있다. (i<배열.배열의길이)
intArray[i] = sc.nextInt();
if(intArray[i] > max) {
max = intArray[i];
}
}
System.out.print("가장 큰수는 "+max+"입니다.");
sc.close();
}
}
10. 배열의 length 필드를 이용하여 배열 크기만큼 정수를 입력받고 평균을 구하는 프로그램 작성
import java.util.Scanner;
public class ppp {
public static void main(String[] args) {
int intArray[] = new int[5]; // 배열의 선언과 생성
int sum = 0 ;
Scanner scanner = new Scanner(System.in);
System.out.print(intArray.length + "개의 정수를 입력하세요>>");
for(int i = 0 ; i<intArray.length; i++)
intArray[i] = scanner.nextInt(); //키보드에서 입력받은 정수 저장
for(int i=0; i<intArray.length;i++)
sum += intArray[i]; // 배열에 저장된 정수 값 더하기
System.out.print("평균은" +(double)sum/intArray.length);
scanner.close();
}
}
11. 배열과 for-each문
기존의 for문을 변형하여, 배열이나 나열(enumeration)의 크기만큼 루프를 돌면서 각 원소를 순차적으로 접근하는데 유용하게 만든 for문을 for-each문 이라고 부른다.
12. 배열 n에 들어있는 모든 정수를 더하는 코드를 for-each 문으로 작성하기
int [] n = { 1,2,3,4,5 };
int sum = 0;
for(int k: n) {
sum += k;
}
System.out.println("합은 "+ sum);
13. 문자열 배열 에 들어있는 모든 문자열을 for-each 문으로 출력하는 코드 작성하기
String names [] = { "사과","배","바나나","체리","딸기","포도" };
for(String s: names) {
System.out.print(s +" ");
}
14. 배열 뿐만 아니라 나열 타입(enum)에 대해서도 for-each 문이 사용된다.
enum Week { 월, 화, 수, 목, 금, 토, 일}
public static void main(String[] args) {
for (Week day : Week.values())
System.out.print(day + "요일 ");
}
enum 타입을 선언할때는 main 메소드 위에 선언해준다.
15. for-each 문을 활용하는 사례
enum Week {월, 화, 수, 목, 금, 토, 일} // 전역변수로 만들어줌. enum=열거형
public static void main(String[] args) {
int[] n = {1,2,3,4,5}; //초기 값을 주는 방법. index안주고 사용할 수 있음.
String names[] = {
"사과","배","바나나","체리","딸기","포도" } ;
int sum=0;
// 아래 for-each에서 k는 n[0], n[1],...,n[4]로 반복됨
for (int k : n) { //n의 값을 k에다가 차례대로 넣어줌. n은 참조변수
System.out.print(k+" ");
sum += k;
}System.out.println("합은 " + sum);
// 아래 for-each에서 s는 names[0], names[1],...,names[5]로 반복됨
for(String s : names) {
System.out.print(s + " ");
}
System.out.println();
// 아래 래 for-each에서 day는 월, 화, 수, 목, 금, 토, 일 값으로 반복됨
for (Week day : Week.values()) // main 메소드 위에 enum으로 전역변수 만들어주었음.
System.out.print(day + "요일 ");
System.out.println();
}
'프로그래밍 공부 > java' 카테고리의 다른 글
[JAVA] 키보드 / 마우스 조작 클래스 Robot (0) | 2022.12.04 |
---|---|
[JAVA] Factorial 구하기 (for문 / 재귀적 방법) (0) | 2022.12.04 |
[Java] 이것이 자바다 4장 확인 문제 6 : Scanner의 nextLine()을 사용하여 코드 작성하기 (0) | 2022.11.30 |
[Java] 이것이 자바다 4장 확인 문제 5 : for문을 이용해서 다음과 같이 *을 출력하는 코드 작성해보세요. (0) | 2022.11.30 |
[Java] 이것이 자바다 4장 확인 문제 4 : 중첩 for문을 이용하여 방정식의 x,y 구하기 (0) | 2022.11.30 |