되자!백엔드개발자
JAVA(자바) - 배열과 for-each문 본문
그동안 반복문이나 조건문 등은 책을 정독해도 다른 언어랑 다를 바가 없어서 블로그 쓴다고 공부가 될 것 같지 않아서 패스했었다. 그러나 배열은 선언방법이나 for-each나 이것저것 추가적인 것이 있어서 따로 정리해본다.
배열(Array)이란?
배열은 인덱스(index)와 인덱스에 대응하는 데이터들로 이루어진 연속적인 자료 구조로서, 같은 종류의 데이터들이 순차적으로 저장된다. 배열을 사용하지 않는 경우는 변수를 일일이 선언해야하고 참조할때도 하나씩 접근해야하기 때문에 불편하다. 반면에 배열을 사용한다면 하나의 선언으로 여러개의 공간을 생성하여 접근도 인덱스로 한번에 할 수 있다.
배열의 선언과 생성
배열은 다음과 같이 생성한다.
int intArray[] = new int[5];
//선언 먼저
double doubleArray[]; //아직 null 값을 저장
doubleArray = new double[10]; // 배열 공간 할당
//다른 방식
char[] charArray = new char[5];
// arr크기를 입력받은 뒤 생성하고 싶을 때
Scanner sc = new Scanner(System.in);
double myList[];
System.out.println("배열의 전체 크기를 입력하시오: ");
int arrLength = sc.nextInt();
myList = new double[arrLength];
- int intArray[]
배열의 선언 문으로 레퍼런스 변수 intArray를 선언하였다. 레퍼런스 변수란 말 그대로 주소값을 저장한는 것이므로 아직 배열 공간이 할당되지 않아서 이 자체가 배열이 아니다. C/C++이나 Python같은 다른 언어들과 달리 []안에 크기를 지정해주면 컴파일 오류가 난다. - intArray = new int[5];
배열 생성. 반드시 new 연산자를 이용하여 배열을 생성하며 [] 안에 생성할 원소 개수를 지정한다. 위의 코드는 정수 5개의 배열 공간을 할당받고 이 배열에 대한 주소값을 intArray에 저장한다는 뜻이다.
C언어와 다르게 배열 크기 칸에 int 변수를 넣을 수 있다.
// arr크기를 입력받은 뒤 생성하고 싶을 때
Scanner sc = new Scanner(System.in);
System.out.println("배열의 전체 크기를 입력하시오: ");
int arrLength = sc.nextInt();
double myList[] = new double[arrLength];
자바에서 배열의 특징
- 레퍼런스 치환과 배열 공유
자바에서는 레퍼런스 변수와 배열 공간이 분리되어 있기 때문에 다수의 레퍼런스 변수로 하나의 배열 공간을 가르키는 배열 공유가 쉽게 이루어진다.
예를 들면 다음과 같은 코드는 레퍼런스 변수 one을 생성하고 two가 one의 레퍼런스, 즉 배열에 대한 주소가 복사된다. 따라서 one이든 two이든 어떤 레퍼런스 변수도 배열에 접근이 가능하다.
int one[] = new int[3];
int two[] = one;
one[2] = 3; //배열의 2번째 칸에는 3이 저장
two[2] = 5; //배열의 2번째 칸에서 3이 사라지고 5가 저장
system.out.print(one[2]); // 5 출력
- 자바에서 배열은 객체로 다룬다
자바는 배열을 객체로 다룬다. 객체는 단원이 배열인 만큼 자세하게는 안 다루지만 다음과 같다고 생각하면 된다.
배열 객체에는 length 필드가 존재하기 떄문에 이를 이용하면 배열의 크기를 다음과 같이 간단하게 알아낼 수 있다.
int arr[] = new int[5];
int size = arr.length; // size는 5
//활용
for(int i = 0; i < arr.length; i++){
...
}
- 메소드(함수)에서 배열 리턴
이때는 배열 전체가 아니라 배열에 대한 레퍼런스만 리턴된다. 그렇기에 리턴 타입을 선언할 때 배열의 크기는 지정하지 않는다. 또한 리턴된 배열 타입과 리턴 받는 레퍼런스 변수의 타입이 동일해야만 한다.
//배열 리턴 함수
int[] makeArray(){
int temp[] = {1, 2, 3};
return temp; //배열 주소 리턴
}
int[] mainArr; //배열 레퍼런스 변수 선언
mainArr = makeArray();
배열과 for-each문
for-each문은 배열이나 나열(enum)을 크기만큼 루프를 돌면서 각 원소를 순차적으로 접근하기 쉽도록 for문을 변형한 것이다. for문과 while문과 다르게 내가 따로 작동 조건이나 반복 횟수를 정해주지 않아도 되서 편리하다.
//for-each문 형식
for(변수 : 배열 레퍼런스) {
...
}
//for-each문 활용예시1
int n[] = {1, 2, 3, 4, 5};
int sum = 0;
for(int i : n){
sum += i;
}
System.out.println("합은 " + sum);
여기까지만 봐도 이해 안된다면 for-each을 for문으로 바꾼 형태를 보면 이해가 쉽다.
//for-each를 for문으로 변형
for(int j = 0; j < n.length; j++){
int i = n[j];
sum += i;
}
for-each를 썼을 때가 조건문도 안쓰고 변수도 덜 써서 훨신 간결한 것을 확인할 수 있다.
enum타입(열거형)에서도 사용하는데 나한텐 좀 생소해서... 이번에 찾아보니 enum은 실제로도 잘 쓰는 것 같아서 따로 공부하고 글을 팔 예정이다. 활용은 이렇게 하더라.
public class foreachEx {
enum Week {월, 화, 수, 목, 금, 토, 일};
public static void main(String args[]) {
for(Week day : Week.values())
System.out.print(day + " ");
System.out.println();
}
}
'개발공부 > JAVA' 카테고리의 다른 글
JAVA(자바) - Class와 객체/생성자/this.와 this()/객체배열 (0) | 2022.07.24 |
---|---|
JAVA(자바) - 객체지향과 절차지향 (0) | 2022.07.24 |
JAVA(자바) 키 입력 Scanner (0) | 2022.07.14 |
Java(자바) 좋은 이름을 붙이는 관습 (0) | 2022.07.13 |
JAVA(자바)의 구조와 특징 (0) | 2022.07.09 |