java 배열1
배열 ?
같은 자료형의 변수들을 하나의 묶음으로 다루는 것
배열은 저장된 값 마다 인덱스 번호가 부여가 됨 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);
darr의 hashcode : 1577213552
darr의 길이 : 30
이렇게 프린트가 됨
위의 코드의 배열의 길이를 10으로 입력-> heap에 10개를 연속적으로 할당한 공간
한번 지정한 배열의 크기는 변경하지 못함. 할당한 것 위에 그 주소 값을 레퍼런스 변수에 덮어 쓴 것임
배열의 저장구조는 참조 변수로 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]);
}
프린트 하면 null이 5개 생성됨 아무것도 받지 않고 있어서
문자열이 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] +"카드입니다");