본문 바로가기

프로그래밍 공부/java

[JAVA] 배열 선언 및 생성

반응형

배열이란? 

같은 종류의 데이터들이 순차적으로 저장되는 것

변수를 많이 만들면 코드 또한 길고 지저분 해진다. 쉽고 간단하게 해결하기 위하여 배열을 사용한다. 

 

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();
		
	}

 

 

반응형