본문 바로가기

Language/Java 기본

배열의 사용

자료구조에는 스택,큐,리스트,트리,배열 등이 존재.

 

int[] [변수명] = new int[길이];  와 같이 선언

new = 레퍼런스 변수를 선언하는 키워드

 

배열타입 int[] [변수명]으로 작은 공간에 레퍼런스 변수만을 선언.

이것은 이름만 존재하는 공간만 선언 되는 것임.

 

 

 

 

레퍼런스 변수: 참조하는 변수[위의 변수명 array], 배열이 선언될 때 배열이 갖는 주소 값.

 

ex:  Array[0] =3; 에서, 0은 인덱스, 3은 데이터. 

인덱스 = 방번호라고 생각하면 편함

 

 

배열은 저장공간이 두가지 공간으로 나뉘는데

 

작은 공간(stack)은 참조하는 배열 레퍼런스 변수가 큰공간의 배열을 가리키는 것이고

큰 공간(array)은 배열 내 인덱스로 데이터가 존재하는 것이다. [0]

 

여기서 작은공간 -> 큰공간에 이어지는게 레퍼런스 변수로 이어지는데 

이 링크가 끊어지면 자동으로 소멸하게 해주는 것이 가비지 콜렉터이다.

 

 

따라서 배열은 인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료 구조이다.

─ 한 번에 많은 메모리 공간 선언 가능

 

같은 종류의 데이터들이 순차적으로 저장되는 공간이다.

─ 데이터들이 순차적으로 저장됨

─ 반복문을 이용해 처리하기에 적합한 자료구조

 

배열 인덱스는 0부터 시작한다.

 

 

길이를 먼저 주는 방법 [array] 와, 성분을 같이 선언해주는 방법 [array4] 가 있다.

변수 이름만 선언해주고 초기화는 시키지 않았기 때문에, 출력을 할 수 없다. (주소값도 없다)

 

 

『 주의 사항 』

 

○ int[] arr = new int[]; 와 같은 형태는 크기가 지정되어있지 않아 불허용,

○ int[] arr = 10; 는 변수는 배열인데 실제 데이터를 지정

○ int intarray[10]; X 레퍼런스 변수 선언시 배열 크기를 지정할 수 없음.

○ int[] arr = new int1[]; arr[1] = 20; 의 경우에는 배열의 크기와 인덱스의 범위가 불일치

 

이렇게 선언할 경우 같은 데이터를 가리키게 된다.

 

 

public class ex01 {
public static void main(String[] args) {
	

	int[] intArray = new int[5];
	int[] myArray = intArray; // 
	
	intArray[1] = 2;
	System.out.println("1번값 : "+intArray[1]);
	
	myArray[1] = 6;
	System.out.println("1번값 : "+intArray[1]);
	

}
}

다음과 같이 intArray의 주소를 myArray에 복사하였으므로

intArray와 같은 곳을 가리키는 myArray의 인덱스 데이터값을 바꾸면

intArray가 가리키는 곳도 똑같이 변경된다. [ 같은 곳을 가리키므로 ] 

 

 

배열 크기는 배열 레퍼런스 변수를 선언할 때 결정되지 않음 ( int[] array; 는 크기가 없음)

 

배열의 크기는 배열 생성시 결정, 나중에 바꿀 수 없음.

 

배열의 크기는 배열의 length 라는 필드에 저장 됨.

 

import java.util.Random;

public class ex04 {
	public static void main(String[] args) {

		Random ran = new Random();
		int z = 0;
		int zzak = 0;
		int hol = 0;
		int[] i = new int[10];
		int i_hol = 0;

		System.out.printf("Array에 들어있는 홀수는 ");
		for (int j = 0; j < i.length; j++) {

			z = ran.nextInt(10);
			i[j] = z;

			if (z % 2 == 0) {
				zzak = zzak + 1;

			} else if (z % 2 == 1) {
				hol = hol + 1;
				i_hol = z;
			}
			System.out.printf("%d", i_hol);

		}

		System.out.println("이며, \n" + hol + "개 입니다.");

	}
}

 

이 코드는 랜덤한 변수를 받아서 배열에 저장하면서, 홀수 및 짝수의 개수와 그 수를 판별하는 프로그램이다.

j는 배열 i의 인덱스이고, z는 랜덤한 변수를 선언해주게 되며,  그 z를 i[j] 배열의 데이터로 사용하게 하였다.

그리고 z의 수를 판별하는데, 여기서 코드를 줄이게 되면

 

import java.util.Random;

public class ex04 {
	public static void main(String[] args) {

		Random ran = new Random();
		int zzak = 0;
		int hol = 0;
		int[] i = new int[10];
		int i_hol = 0;

		System.out.printf("Array에 들어있는 홀수는 ");
		for (int j = 0; j < i.length; j++) {

			i[j] = ran.nextInt(10);

			if (i[j] % 2 == 0) {
				zzak = zzak + 1;

			} else if (i[j] % 2 == 1) {
				hol = hol + 1;
				i_hol = i[j];
			}
			System.out.printf("%d", i_hol);

		}

		System.out.println("이며, \n" + hol + "개 입니다.");

	}
}

변수 z를 없애 i[j] 가 직접 랜덤 값을 받게 하였다. 하지만 홀수를 구분하는 프로그램에서 짝수를 따로 판단할 필요는

없기 때문에

 

 

import java.util.Random;

public class ex04 {
	public static void main(String[] args) {

		Random ran = new Random();
		int zzak = 0;
		int hol = 0;
		int[] i = new int[10];
		int i_hol = 0;

		System.out.printf("Array에 들어있는 홀수는 ");
		for (int j = 0; j < i.length; j++) {

			i[j] = ran.nextInt(10);

			if (i[j] % 2 == 1) {
				hol = hol + 1;
				i_hol = i[j];
			}

			System.out.printf("%d", i_hol);

		}

		System.out.println("이며, \n" + hol + "개 입니다.");

	}
}

 

 

다음과 같이 짝수에 관련된 if문 또한 제거하였다.

 

 

 

 

import java.util.Random;

public class ex05 {
	public static void main(String[] args) {

		Random ran = new Random();
		int z = 0;
		int[] i = new int[5];

		for (int j = 0; j < i.length; j++) {

			i[j] = ran.nextInt(9);
			System.out.printf("%d", i[j]);

			if (i[j] > z) {

				z = i[j];

			}

		}

		System.out.println("\n 가장 큰 값은 " + z + "입니다.");

	}
}

 

1차원 배열을 선언해, 배열의 순차적으로 랜덤한 정수를 넣고

그 중 가장 큰 값을 찾아 출력하는 프로그램.

 

z에 해당 배열의 값을 저장하여, 그 z보다 크지 않은 경우 if문이 실행되지 않게 함으로서

최종적으로 가장 큰 값 z를 출력하게 하였다. 

 

import java.util.Arrays;
import java.util.Scanner;

public class ex06 {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		int[] i = new int[5];
		int z = 0;
		int c = 0;
		int b = 100;
		int d = 0;

		for (int j = 0; j < i.length; j++) {

			System.out.printf("%d번째 입력>>", j + 1);

			i[j] = sc.nextInt();

			if (i[j] > z) {

				d = d + i[j];
				c = i[j];
				z = i[j];

				// System.out.printf("%d", i[j]);
			}
			if (b > z) {

				d = d + i[j];
				b = z;
				// System.out.printf("%d", i[j]);
			}

		}
		System.out.printf("입력된 점수:%s", Arrays.toString(i)); // 출려갛고 싶은 배열의 변수이름을 넣어 배열을 출력

		System.out.printf("\n최고 점수: %d", c);
		System.out.printf("\n최저 점수: %d", b);
		System.out.printf("\n총합: %d", d);
		System.out.printf("\n평균: %d", d / i.length);

		// 입력 5개, 입력된 점수 출력, 최고점수 및 최저 점수 출력, 총합 평균 출력
		// shift + home = 한줄 전체 선택

	}
}

 

다섯 점수를 입력받고 각각 입력된 점수를 tostring으로 나열하고

나머지 최고 점수, 최저 점수, 총합과 평균을 나타내는 것.

 

 

 

 

 

 

 

'Language > Java 기본' 카테고리의 다른 글

객체 지향프로그래밍 (Object Oriented Programming)  (0) 2021.01.07
메서드  (0) 2021.01.07
do ~ While 문  (0) 2021.01.04
for문의 응용  (0) 2021.01.04
다중 for 문의 사용  (0) 2020.12.31