java

java 배열1

#풀닢 2022. 12. 28. 14:12

배열 ?

같은 자료형의 변수들을 하나의 묶음으로 다루는 것

배열은 저장된 값 마다 인덱스 번호가 부여가 됨 0부터 시작

arr 1 2 3 4

      0 1 2 3

 

동일한 자료형의 묶음이다. 즉 연속 된 메모리 공간에 값을 저장할 때 묶음으로 사용되는 것

배열은 heap영역new 연산자를 이용하여 할당함.

어떨 때 배열을 사용하는가?

만약 배열을 사용하지 않는다면

int a = 0;

int b = 3;

이렇게 여러개 따로 사용해서 연속 된 메모리 공간으로 관리할 수 없음

String c = 9;

 

즉 모든 변수의 이름은 사용자가 관리해야 함또한 반복문을 이용한 연속적인 처리가 불가능

그래서 위처럼 3개의 변수가 있으면 위의 변수의 이름을 모두 알아야 하는 비효율적인 것이 있음

 

그리고 여러개의 자료형을 묶지 못 함.

배열을 이용해 보기

자료형 [] 배열명; <이나 그러나 앞쪽에 [] 붙이는 걸 선호>

자료형 배열명[];

 

자료형 [] 배열명; = new 자료형[번호]

int[] arr // 배열의 선언 = new int[5]; //배열의 할당

하나의 이름으로 관리되는 연속적인 메모리 공간, 그리고 공간마다 찾아갈 수 있는 [인덱스 번호];

 

	int [] iarr;
	char carr[];

배열 할당

배열명 = new 자료형[배열크기];

 

Stack

arr 0x100

주소값을 가지고 있음
Heap

1 2 3

arr[0] arr[1] arr[2]
static



 

인덱스를 이용한 초기화

arr [0] =1; 배열명에 원하는 위치 인덱스로 찍으면 그 공간 접근 가능

arr[1] = 2;

 

		iarr = new int[5];
		carr = new char[10];

배열을 할당할 때는 반드시 배열의 크기를 지정해 주어야 한다.

iarr = new int[];

 

선언과 할당 동시에 가능

		int[] iarr2= new int[5];
		char carr2[] = new char[10];

		System.out.println("iarr : " + iarr);
		System.out.println("carr : " + carr);

iarr : [I@4361bd48

carr : [C@762efe5d

위에 처럼 콘솔로 찍으면 배열이 원활하게 출력이 안되고 즉 주소값이 출력이 됨.

 

for문 이용한 초기화

	for(int I = 0; I <arr.length(배열의 길이만큼); I++){
	arr[i]= i;
}

 

length 배열의 길이

배열의 길이를 알수 있는 기능을 필드로 제공함

여기서 length()하지 않는 이유는 ()은 왜 안되냐면 메소드이고 아래는 필드라는 거라서 () 붙이지 않음

		System.out.println("iarr2의 길이 : "+ iarr2.length);
		System.out.println("carr2의 길이 : "+ carr2.length);

Scanner를 사용한 배열 길이 입력하기

Scanner sc = new Scanner(System.in);
		System.out.print("새로 할당할 배열의 길이를 입력하세요 : ");
		int size = sc.nextInt(); //10이라고 쓰면 10개의 배열,

100개면 100개의 배열 //입력한 사이즈의 길이 만큼을 배열로 할당 가능

		double[] darr = new double[size];
		
		System.out.println("darr의 hashcode : " + darr.hashCode()); -> 해시코드 배열해줌
		System.out.println("darr의 길이 : " + darr.length);

darrhashcode : 1577213552

darr의 길이 : 30

 

이렇게 프린트가 됨

 

위의 코드의 배열의 길이를 10으로 입력-> heap10를 연속적으로 할당한 공간

한번 지정한 배열의 크기는 변경하지 못함. 할당한 것 위에 그 주소 값을 레퍼런스 변수에 덮어 쓴 것임

 

 

배열의 저장구조는 참조 변수로 Heap영역에 할당. 래퍼런스(참조) 변수

배열 공간의 주소를 이용해 인덱스를 참조하는 방식으로 값 처리

 

arr[0] 번째 하고 싶어요 하면 아래 Heap(에 저장됨)1이 초기화 됨

 

선언과 동시에 초기화 할 경우

int[] arr = <new int생략 가능 [] > {1,2,3,4,5};

String fruit[] = {“사과”,“포도”,“참외”};

 

*지정 된 기본 값 외의 값으로 초기화 하고 싶은 경우 {}블럭을 이용한다.

이때 new 연산자를 사용하지 않아도 되며, 값의 개수만큼 자동으로 크기가 설정 된다

배열 선언,할당,초기화 한번에 바로 가능

		int[] iarr2 = {11,22,33,44,55};
		int[] iarr3 = new int [] {66,77,88,99};
		
		for(int i = 0; i <iarr2.length; i++) {
			System.out.println(iarr2[i]);
		}
		for(int i = 0; i <iarr3.length; i++) {
			System.out.println(iarr3[i]);
		}
	}

출력

더보기

11

22

33

44

55

66

77

88

99 이렇게 출력이 됨

문자열로도 배열을 사용 가능하다.

String[] sarr = new String[5];
		
		for(int i = 0; i < sarr.length; i++) {
			System.out.println(sarr[i]);
		}

프린트 하면 null5개 생성됨 아무것도 받지 않고 있어서

문자열이 5칸만 생성 되어 있고 안의 내용물은 없어서 그렇다고 보면 됨.

String[] sarr2 = {"apple" ,"banana" ,"grape","orage"};
		
		for(int i =0; i< sarr2.length; i++) {
			System.out.print(sarr2[i]);
		}
	}

applebananagrapeorage 이렇게 주르륵 배열이 됨 띄어쓰기 하려면 %n이나 이런 걸 해주어야겠죵

 

랜덤한 카드를 뽑으려고 할 때

1.랜덤한 카드를 한장 뽑아서 출력하는 프로그램를 만든다고 설계
2. 모양과 카드 숫자별로 값을 저장할 두 종류의 배열을 만든다
3.배열 인덱스 범위의 난수 생성 한다.

public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String[] shapes= {"SPADE" , "CLOVER" , "HEART" , "DIAMOND" };
		String[] cardNumbers = { "2" , "3" , "4" , "5","6","7","8","9","10","JACK","QUEEN","KING","ACE"};
		
		
		int randomShapeIndex = (int)(Math.random() * shapes.length);
		int randomCardNumberIndex= (int) (Math.random()* cardNumbers.length);
		
		System.out.println("당신이 뽑은 카드는 " +shapes[randomShapeIndex] + ""
					+ cardNumbers[randomCardNumberIndex] +"카드입니다");

 

SMALL