JAVA
1. 배열(Array)
변수를 10개 만들어서 데이터를 저장할 수 있지만 한 번에 저장해서 처리하는 효율적인 방법이 배열입니다.
배열이란
배열이란, 같은 자료형의 변수를 지정하여 여러 데이터를 저장할 수 있는 저장 공간을 의미합니다.
이렇게 여러 데이터를 담을 수 있는 구조를 자료 구조(data structure)라고도 합니다.
배열을 사용하면 같은 자료형의 데이터들을 효율적으로 다룰 수 있습니다.
변수는 1개의 데이터만 저장할 수 있지만 배열은 여러 개의 데이터를 저장하고 관리할 수 있습니다.
배열의 선언
배열을 사용하려면 변수와 마찬가지로 배열을 선언해야 합니다. 배열을 선언하는 방법은 다음과 같습니다.
자료형[]변수 이름; | int[] arr; |
자료형 변수 이름[]; | int arr[]; |
<예>
대괄호[]는 배열의 연산자를 의미합니다. 자료형 뒤에 붙이거나 변수명 뒤에 붙이면 해당 자료형은
배열이라는 의미로 선언됩니다. 보편적으로는 자료형 뒤에 붙이는 것이 가독성이 높아 주로 사용됩니다.
null 키워드
배열은 여러 개의 데이터를 저장하기 위한 별도의 공간이 필요합니다. 우리가 배열을 선언만 하고 값을
부여하지 않았을 경우 시스템은 배열 변수를 만들 때 'null'이라는 키워드를 부여합니다. 이때, null의 의미는
"공간이 존재하지 않는다" 또는 "없다"라는 의미를 가집니다.
배열 변수는 생성되었지만, 아직 그 안에 값을 담을 공간들이 생성되지 않았다는 뜻 입니다.
배열의 생성과 선언
배열을 선언한 후에는 배열을 생성해야 합니다. 앞에서 배열을 선언한 것은 배열을 다루는 참조 변수를
위한 공간이 만들어졌을 뿐 값은 저장할 수 있는 공간을 만들려면 배열을 생성해야만 합니다.
프로그래밍에서는 무언가를 기억할 때 메모리를 사용합니다. 배열은 데이터를 저장하기 위한 공간이
필요하므로 메모리에 필요한 만큼 만들도록 선언해야 합니다.
배열을 생성하기 위해서는 다음과 같이 연산자 'new'와 함께 자료형과 길이를 지정합니다.
new int[4]
해당 선언은 "메모리에 배열의 데이터를 저장하기 위한 4개의 공간을 만들어라" 라는 명령이 됩니다.
배열을 사용하기 위해 크기를 지정하고 선언하는 방법은 다음과 같습니다.
int[] arr = new int[크기]; 또는 int arr[] = new int [크기];
자료형 | 배열 연산자 | 변수명 | 신규 생성 | 자료형 | 배열 크기 | |
int [ ] arr = new int [4]; |
자료형을 부여하고 일반 변수와 구별하기 위해 배열의 연산자를 표기합니다. 이어서 변수명을 기입합니다.
우측에는 new연샂나와 함께 배열의 자료형과 크기를 부여하여 선언합니다. 배열을 선언하는 또 다른 방법으로는
다음과 같이 배열에 저장될 값을 미리 부여해 선언하는 방법이 있습니다.
int[] arr = {1, 2, 3, 4, 5};
위와 같이 배열을 선언할 때 값을 지정할 수 있습니다. 5개의 값을 대입했기 때문에, 배열의 크기는 5가 되며
각 순서에 맞게 데이터가 삽입됩니다. 해당 방법은 배열을 최초 선언할 때만 가능합니다.
다음과 같이 배열을 선어한 후 값을 대입하여 지정하면 오류가 발생합니다.
int[] arr; // 배열선언
arr = {1, 2, 3, 4, 5} // 오류
배열을 선언한 후 다시 값을 대입해야 할 경우에는 이미 선언된 배열을 다시 정의하여 값을 대입하면
가능합니다. 이와 같은 방법을 '재정의'라고 합니다.
int [] arr // 배열 선언
arr = new int[] {1, 2, 3, 4, 5} // 배열 재정의
위와 같은 방법들을 통해서 배열을 선언하면 실제 시스템의 메모리에는 선언된 크기와 값 만큼
각각의 독립적인 저장공간이 연속적으로 배치되어 생성됩니다.
메모리에 지정한 크기만큼의 저장 공간을 생성하고 그 저장 공간이 있는 위치 값을 arr변수에 대입합니다.
배열의 변수 그 주소 값을 통해서 배열에 접근하여 데이터를 가져오게 됩니다.
배열 변수를 출력하면 배열이 위치한 주소값이 출력됩니다. 이처럼 직접 값을 변수에 저장하는 것이 아니라,
주소값이 저장되어 해당 주소를 통해 실제 데이터에 접근하는 것을 참조형 변수(reference variable)라고 합니다.
- 일반 변수 : 데이터를 직접 가지는 변수를 말합니다. ex) byte, short, in, double등 기본 데이터 타입을 가지는 변수
- 참조 변수 : 데이터가 위치한 주소값을 가지는 변수로 해당 주소를 통해서 데이터에 접근하여 값을 가져오거나 변경합니다. ex) String, 배열, Collection, 객체(class)
배열의 특징
- 배열 선언 시 크기를 지정합니다
- 배열 선언 후 공간의 크기를 늘리거나 삭제할 수 없습니다
- 지정된 자료형의 값만 저장할 수 있습니다
배열은 선언할 때 그 크기를 지정해 주어야 하며, 한번 크기를 지정하여 생성하면 그 배열의 특정 공간을
삭제하거나 변경할 수 없습니다. 또한 지정된 자료형만 입력할 수 있습니다.
2. 배열의 구조
인덱스(index)
배열을 만든 후에는 값을 넣거나 꺼내야합니다. 배열은 각 공간마다 위치를 알려주는 위치 값이 존재하는데
이 위치를 인덱스(index)라고 부릅니다. 인덱스는 배열의 공간마다 붙여진 번호로 범위 1이 아닌 0부터 시작합니다.
배열의 값을 저장하고 가져오는 방법은 변수와 같습니다. 단지 변수명 대신 인덱스(index)를 사용한다는
점만 다릅니다.
System.out.println(arr[0]); 배열의 index가 0인 위치의 값을 출력
arr[1] = 10; 배열의 index번호가 1번인 위치에 값을 저장
배열의 길이
배열을 생성할 때 대괄호[ ] 안에 배열의 길이를 작성합니다. 배열을 사용하면서 종종 배열의 길이가 필요할 때가
있습니다. 배열은 내부적으로 length라는 변수를 지니는데, 해당 변수는 배열의 길이 값을 가지고 있습니다.
배열의 길이를 알고 싶을 때는 다음과 같이 배열 변수 이름에 점(.) 연산자로 연결하여 사용합니다.
해당 변수는 생성될 때 지정되며 변경할 수 없습니다.
System.out.println("배열의 길이: " + arr.length);
배열의 초기값
배열은 생성과 동시에 데이터 자료형 별로 기본값이 주어집니다.
자료형 | 초기값 |
정수형 | 0 |
실수형 | 0.0 |
문자형 | ' ' |
객체형 | null |
3. Arrays
Arrays 클래스는 배열의 복사, 항목 정렬, 항목 검색 등 배열을 다루기 위한 다양한 메서드를 제공합니다.
배열이 출력
Arrays는 기능을 사용할 때 점(.)을 이용해서 사용할 기능을 호출합니다. 배열 단위로 출력을
도와주는 toString()은 반복문의 도움 없이 배열을 출력할 수 있으며, 배열에 정의된 값들을 문자열 형태(String)로
반환하여 출력합니다.
배열의 정렬
배열 항목을 정렬해 주는 Arrays.sort()는 Comparable에의해 리턴되는 값을 비교하여
오름차순 또는 내림차순으로 배열을 정렬합니다.
배열의 복사
자바에서 배열은 한번 생성하면 그 길이를 변경할 수 없습니다. 따라서 더 많은 데이터를 저장하거나
기존 배열과 똑같은 배열을 새로 만들려면 배열을 복사해야 합니다.
배열을 복사하는 방법은 얕은 복사와 깊은 복사 두가지가 있습니다.
얕은 복사(Shallow Copy) : 복사된 배열이나 원본 배열이 변경될 때 서로 간의 값이 함께 변경됩니다.
깊은 복사(Deep Copy) : 복사된 배열이나 원본 배열이 변경될 때 서로 간의 값은 바뀌지 않습니다.
4. 다차원 배열(multi - dimensional array)
배열은 여러 가지 구조로 사용할 수 있는데 2차원 이상의 배열을 '다차원 배열'이라고 부릅니다.
2차원 배열 선언
2차원 배열이란, 배열의 요소로 1차원 배열을 가지는 배열입니다. 2차원 배열을 선언하는 방법은 1차원 배열과 같습니다.
다만 대괄호[ ]가 하나 더 추가됩니다.
int[][] arr = new int[크기][크기];
2차원 배열은 보통 행렬 구조로 많이 묘사합니다. 실제 수학의 행렬과는 원리가 다르지만, 사용방시이 동일하기 때문에
주로 행렬 구조를 채용하여 표현합니다. 따라서 첫 번째 크기는 행의 개수가 되고, 두 번째 크기는 열의 개수가 됩니다.
2차원 배열은 다양한 방식으로 선언할 수 있는데 열을 지정하지 않고 선언할 수 있습니다.
열의 크기를 지정하지 않고 선언한 뒤, 행의 열을 각각 선언하여 사용할 수 있습니다.
열의 크기는 지정하지 않아도 되지만, 행의 크기는 항상 지정해야 합니다.
5. 향상된 for문
향상된 for문은 JDK 1.5부터 새롭게 추가된 기능으로 배열과 컬렉션의 모든 요소를 참조하기 위한 반복문 입니다.
for문을 실행할 반복 대상이 있으면 자료형은 반복 대상이 지닌 자료형과 같은 타입으로 지정해야 합니다.
반복 대상의 요소를 하나씩 변수에 대입하면서 진행하고, 반복 대상의 길이만큼 꺼내어 반복합니다.
for(int num : score){
실행코드;
}
응용문제
1. 다음 중 배열을 생성하는 방법으로 틀린 것은 무엇일까요 ?
① int[] arr = new int[4];
② int arr[] = new int[4];
③ int arr[] = {1, 2, 3, 4};
④ int[][] arr = new int[][4];
정답 : ④
열만 지정하여 2차원 배열을 생성할 수 없기 때문에
2. 다음 코드의 빈칸을 완성해 주어진 배열에서 짝수만 더하여 합을 구해보세요.
package section06;
public class ArrayExample{
public static void main(String[] args){
int[] arr = {1,2,3,4,5,6,7,8,9,10};
int sum = 0;
for(int i=0; i < arr.length; i++){
if(arr[i]%2 == 0){
sum += arr[i]
}
}
System.out.println("짝수들의 합 : "+ sum);
}
}
3. 철수는 동생과 카드 게임을 했습니다. 카드 게임에 사용된 카드는 중복되는 숫자 없이 총 10장 입니다.함수를 이용해 철수가 게임에 사용했던 카드를 구해보세요. 카드에 적힌 숫자는 1부터 10이며, 카드는 섞여있으므로 순서는 상관없습니다.
public static void main(String[] args) {
// 3. 철수는 동생과 카드게임을 했다
// 카드게임에서 사용된 카드는 중복되는 숫자 없이 총 10장
// 배열과 랜덤함수를 이용해 철수가 게임에 사용했던 카드를 구하기
// 카드에 적힌 숫자는 1부터 10이며, 카드는 섞여있으므로 순서는 상관없음
//반복문을 이용해 정수형 배열에 1~10까지의 중복되지 않는 랜덤한 숫자 담기
//안쪽 반복문으로 10번(10게임)을 반복하며
//철수가 게임에 사용한 숫자 배열에 다시 담기
// ex) [2, 8, 8, 4, 7, 2, 9, 9, 5, 8]
int[] card = new int[10]; //카드게임에서 사용되는 카드 10장
for (int i = 0; i < card.length; i++) {
card[i] = (int) (Math.random()*10)+1; // 1 ~ 10까지의 섞여있는 카드
System.out.println(card[i]);
for (int j = 0; j< card.length; j++) { //10게임
if(card[i] == card[j]) { //card[i]에 철수가 뽑은 카드(card[j])가 있다면
card[i] = card[j]; // card[i]에 card[j] 담기
}
}
}
System.out.println(Arrays.toString(card));
}
4. 마방진은 숫자가 배열되어 있으며, 가로의 합, 세로의 합, 대각선의 합이 모두 동일할게 설계되어 있습니다. 2차원 배열을 이용해 마방진을 구현해 보세요.
조건 : 배열을 5x5로 합니다. 시작 위치는 (0,2)입니다. 마방진에 들어가는 숫자는 1부터 시작합니다.
완성예시
17 | 24 | 1 | 8 | 15 |
23 | 5 | 7 | 14 | 16 |
4 | 6 | 7 | 14 | 16 |
10 | 12 | 19 | 21 | 3 |
11 | 18 | 25 | 2 | 9 |
public static void main(String[] args) {
//4. 마방진
//5x5 행렬, (0, 2) 0:행위치, 2:열위치
// 로직구성
// 1. 배열선언(5x5), 현재 행위치, 열위치, 채워질 값을 넣을 변수 1부터 시작
// 2. 초기 마방진값 설정
// 3. 마방진 채우기(while 채워질 값을 변수 <= 25)
// 4. 행위치--, 열위치++
// 5. 행이 벗어났을 경우
// 6. 열이 벗어났을 경우
// 7. 행과열이 모두 벗어났을 경우
// 8. 현재 위치에 값이 이미 존재할 경우
// 9. 위치이동 후 값을 채움
// 10. 마방진 출력(이중for문)
// 17 24 1 8 15
// 23 5 7 14 16
// 4 6 13 20 22
// 10 12 19 21 3
// 11 18 25 2 9
int[][] mabang = new int[5][5];
int nextRow = 0;
int nextCol = 2;
int count = 1;
//초기 마방진값 설정
mabang[nextRow][nextCol] = count++;
//마방진채우기
while (count <= 25) {
nextRow--;
nextCol++;
//행이 벗어났을 경우
if(nextRow < 0 && nextCol < 5) {
nextRow = 4;
}
//열이 벗어났을 경우
if(nextRow >= 0 && nextCol == 5) {
nextCol = 0;
}
//행과 열 둘 다 벗어났을 경우
if(nextCol > 4 && nextRow < 0) {
nextCol -= 1;
nextRow += 2;
}
//현재 위치에 값이 이미 존재할 경우
if(mabang[nextRow][nextCol] != 0) {
nextCol -= 1;
nextRow += 2;
}
//위치 이동 후 값을 채움
mabang[nextRow][nextCol] = count++;
}
//마방진출력
for (int i = 0; i < mabang.length; i++) {
for(int j = 0; j < mabang[i].length; j++) {
System.out.print(mabang[i][j] + "\t");
}
System.out.println();
}
}
'javaboiii의 JAVA > JAVA 요약정리(멘토씨리즈)' 카테고리의 다른 글
JAVA -8) 메서드(Method) (0) | 2024.07.19 |
---|---|
JAVA -7)클래스(Class) (0) | 2024.07.18 |
JAVA - 5)제어문2 (1) | 2024.07.16 |
JAVA -4) 제어문1 (1) | 2024.07.15 |
JAVA - 3)연산자 (1) | 2024.07.14 |