배열 ( Array )
- 같은 자료형의 변수들을 하나의 묶음으로 다루는 것
- 배열은 저장된 값 마다 인덱스 번호가 부여됨. (0부터 시작)
- 배열은 heap 영영에 new 연산자를 이용하여 할당한다.
배열의 사용 이유
만약 배열을 사용하지 않는다면 변수를 여러 개 사용해야한다.
- 연속된 메모리 공간으로 관리할 수 없다. (모든 변수의 이름을 사용자가 관리해야 한다.)
- 반복문을 이용한 연속 처리가 불가능하다.
배열 선언
- 선언은 stack에 배열의 주소를 보관할 수 있는 공간을 만드는 것이다.
자료형[] 배열명;
자료형 배열명[];
선언한 래퍼런스 변수에 배열을 할당하여 대입할 수 있다.
new 연산자는 heap영역에 공간을 할당하고 발생한 주소값을 반환하는 연산자이다.
발생한 주소를 래퍼런스 변수 (참조형변수)에 저장하고 이것을 참조하여 사용하기 때문에
참조자료형(reference type)이라고 한다.
배열 할당
- 배열을 할당할 시에는 반드시 배열의 크기를 지정해 주어야한다.
배열명 = new 자료형[배열크기];
배열 선언과 할당
자료형[] 배열명 = new 자료형[배열크기];
자료형 배열명[] = new 자료형[배열크기];
int[] iarr2 = new int[5];
heap 메모리는 이름으로 접근하는 것이 아닌 주소로 접근하는 영역이다.
stack에 저장된 주소로 heap에 할당된 배열을 찾아갈 수 있다.
System.out.println("iarr: " + iarr); //16진수 주소값 출력
hashCode() : 일반적으로 객체의 주소값을 10진수로 변환하여 생성한 객체의 고유한 정수값을 반환한다.
동일객체인지 비교할 때 사용할 목적으로 쓰여지며, 동등객체를 동일객체 취급하기 위한 용도로 overriding해서 사용한다.
System.out.println( "iarr의 hashcode : " + iarr.hashCode()) ;
한 번 할당된 배열은 지울 수 없다.
다만 래퍼런스 변수를 null로 변경하면, 더 이상 주소가 참조되지 않는 배열은
일정 시간이 지난 후 heap의 old영역으로 이동하여 GC(가비지컬렉터)가 삭제시킨다.
한 번 찾아갈 수 있는 주소값을 잃어버린 배열은 다시 참조 불가능하다.
iarr = null;
배열의 길이를 알 수 있는 기능을 필드로 제공하고 있다.
참고로 String의 문자열 길이는 메소드로 제공하고 있기 때문에 length()로 사용한다.
System.out.println("iarr2의 길이: " + iarr.length);
기본적으로 배열을 선언하고 할당하게 되면 배열의 각 인덱스는 자바에서 지정한 기본값으로 초기화 된 상태가 된다.
heap 영역은 값이 없는 빈 공간이 존재할 수 없다.
값의 형태별 기본값
* 정수: 0
* 실수: 0.0
* 논리: false
* 문자: \u0000
* 참조: null
지정한 기본 값 외의 값으로 초기화를 하고 싶은 경우 블럭을 이용한다.
블럭을 사용하는 경우에는 new를 사용하지 않아도 되며, 값의 개수만큼 자동으로 크기가 설정 된다.
int[] iarr2 = {11, 22, 33, 44, 55 };
/*초기화 값 확인*/
for(int i =0; i <iarr2.length; i++){
System.out.println("iarr2[" + i +"]의 값 : "+ iarr2[i]);
}
문자열도 배열로 사용 가능하다.
String[] sarr = {"apple","banan","grape","orenge"};
for(int i=0; i < sarr.length; i++) {
System.out.println("sarr[" + i +"]의 값 : "+ sarr[i]);
}
예제) 5명의 자바점수를 정수로 입력받아서 합계와 평균을 실수로 구하는 프로그램을 만들어보세요.
/*5명의 자바 점수를 저장할 배열 할당*/
int[] scores = new int[5];
Scanner sc = new Scanner(System.in);
/*반복문을 이용하여 배열 인덱스에 하나씩 접근해서 점수를 입력 받는다.*/
for(int i = 0; i < scores.length; i++) {
System.out.print((i+1)+"번째 학생의 자바 점수를 입력해주세요 : ");
scores[i] =sc.nextInt();
}
/*합계와 평균을 구한다*/
double sum = 0.0;
double avg = 0.0;
/*합계는 모든 인덱스의 값을 sum 변수에 누적해서 담아준다.*/
for(int i =0; i < scores.length; i++) {
sum+= scores[i];
}
/*평균은 합계를 구한 값에서 배열의 길이로 나눈다.*/
avg = sum /scores.length;
System.out.println("sum :" + sum);
System.out.println("avg :" + avg);
}
예제) 랜덤한 카드를 한 장 뽑아서 출력해보자. 먼저 모양과 카드 숫자별로 값을 저장할 두 종류의 배열을 만들자.
String[] shapes = { "SPADE","CLOVER", "HEART", "DIAMOND"};
String[] cardNumber = {"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() * cardNumber.length);
/*index를 이용해서 출력*/
System.out.println("당신이 뽑은 카드는 " + shapes[randomShapeIndex]
+ " " + cardNumber[randomCardNumberIndex]
+ " 카드입니다.");
}
}
'백엔드 과정 > Java' 카테고리의 다른 글
Java 문제풀이 4-2. 주민등록번호 뒷자리 숨기기 (0) | 2021.12.27 |
---|---|
Java 문제풀이 4-1. 문자열을 입력받아 배열에 저장하고 문자 검색하기. (0) | 2021.12.27 |
Java 문제풀이 3-3. 문자열에 문자가 몇개 포함되어 있는지 판별하기 (0) | 2021.12.27 |
Java 문제풀이 3-2. 랜덤숫자 맞추기 게임 (0) | 2021.12.27 |
Java 문제풀이 3-1. 반복문으로 입력값 소수 판별하기 (0) | 2021.12.27 |