백엔드 개발 공부 일지
JAVA Basic - 배열 본문
● 배열이란?
자료가 연속으로 나열된 구조
배열을 사용하면 자료형이 같은 자료 여러개를 한 번에 관리가 가능하다.
Python에서도 list, tuple, dict, ndarray등 여러가지 자료형에서 배운 내용과 동일하나 자료형이 같아야 하는것이 JAVA 배열의 특징인듯 하다.
자료형[ ] 배열 이름 = new 자료형[개수];
or
자료형 배열 이름[ ] = new 자료형[개수];
자바에서 배열은 선언하는 동시에 각 요소의 값이 초기화 된다. (정수 : 0, 실수 : 0.0, 객체 : null)
값을 넣고 초기화 하고 싶은 경우 다음과 같이 작성하면 된다. (값을 넣어 초기화시 자료형 개수 넣으면 error 발생)
int [ ] studentIDs = new int[ ] {101, 102,103};
or
int [ ] studentIDs = {101, 102, 103} (주의 : 의미 선언된 배열에서 이와같이 new int[ ]를 생략할 수 없다.)
● 배열사용하기
배열을 사용하기 위해서는 인덱스 연산자가 사용하며 그 예시는 아래와 같다.
(python과 동일하게 배열 순서는 0번 부터이다.)
package array;
public class ArrayTest {
public static void main(String[] args) {
int[ ] num = new int[ ] {1,2,3,4,5,6,7,8,9,10};
for(int i=0; i < num.length; i++) {
System.out.println(num[i]);
}
}
}
1
2
3
4
5
6
7
8
9
10
● 문자 저장 배열
문자 저장 배열은 int가 아닌 char[ ] 로 선언해주면 된다. (간단하므로 생성하는 방법만 표기)
char [ ] alphabets = new char[26];
아스키 코드도 함께 활용되므로 이부분만 신경써주어 사용하면 될듯 하다.
● 객체 배열
객체 배열은 int나 char등 기본 자료형 배열과 사용방법이 조금 다르다.
다음예제를 통해 확인해 보자.
package array;
public class Book {
private String bookName;
private String author;
public Book() {
} // 디폴트 생성자
// 책 이름과 저자 이름을 매개변수로 받는 생성자
public Book(String bookName, String author) {
this.bookName = bookName;
this.author = author;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
// 책 정보를 출력해 주는 메서드
public void showBookInfo() {
System.out.println(bookName + "," + author);
}
}
package array;
public class BookArray {
public static void main(String[] args) {
Book[] library = new Book[3]; // 북 클래스 형으로 객체 배열 생성
library[0] = new Book("태백산맥", "조정래");
library[1] = new Book("데이안", "헤르만 헤세");
library[2] = new Book(); // default 값
for (int i = 0; i < library.length; i++) {
library[i].showBookInfo();
}
for (int i = 0; i < library.length; i++) {
System.out.println(library[i]);
}
}
}
태백산맥,조정래
데이안,헤르만 헤세
null,null
array.Book@506e1b77
array.Book@4fca772d
array.Book@9807454
BookArray의 클래스에서 보이는것과 같이 객체 배열은 다음과 같이 배열을 생성한다.
클래스명[ ] 배열명 = new 클래스명[개수]
이때, 다른 배열과 달리 배열생성을해도 인스턴스가 바로 생성되지는 않는다. 각 배열의 자리에 주소값을 담을 공간만 형성하고 있다. (실제로 배열명[인덱스]를 프린트하게 되면 null값이 나온다.(주소가 없음))
(여기서! 인스턴스가 생성됬다는 말은 반드시 메모리 주소를 가지고 있어야 함을 다시 숙지!!)
각 인덱스에 Book인스턴스를 만들어 저장하면 위의 결과와 같이 인스턴스가 모두 잘 생성되었음을 확인 할 수 있다.
● 배열 복사하기
배열 복사를 왜하는데? ==> 기존 배열고 자료형 및 크기가 똑같은 배열이 필요하거나, 배열의 모든요소가 꽉 차서 더 큰 배열을 만들어 기존 배열에 저장된 자료를 가져오기 위해 사용
배열 복사의 방법은 크게 2가지 방법이 있다.
1) for문 활용 각 요소 값을 반복 복사 : 간단하니 패스
2) System.arraycopy()메서드를 사용
System.arraycopy(src, srcPos, dest, destPos, length) 메서드를 사용하기 위해서 아래의 매개변수의 의미를 정리하자
src : 복사할 배열의 이름
srcPos : 복하살 배열의 첫 번쨰 위치
dest : 복사해서 붙여 넣을 대상 배열 이름
destPos : 복사해서 대상 배열에 붙여 넣기를 시작할 첫 번 째 위치
length : src에서 dest로 자료를 복사할 요소 개수
다음 예시를 통해 배열복사 (System.arraycopy() 메서드 활용) 예시를 확인해 보자
package array;
public class ArrayCopy {
public static void main(String[] args) {
int[] array1 = { 10, 20, 30, 40, 50 };
int[] array2 = { 1, 2, 3, 4, 5 };
System.arraycopy(array1, 0, array2, 1, 4);
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i]);
}
}
}
1
10
20
30
40
위의 예시는 System.arraycopy()를 이용해 array1의 0~3번의 요소를 array2의 1번 부터 복사한 모습이다.
위의 int형 배열과 마찬가지로 문자열 그리고 객체 배열에서도 동일하게 메소드를 사용하여 복사를 수행할 수 있따.
얉은복사? 깊은복사?
복사에는 위와 같이 얉은복사인가 혹인 깊은복사인가로 분류할 수 있다.
(이는 python에서도 동일하게 있는 개념이다. python도 참조형 변수를 쓰기때문에!)
그래서 그게뭔데?
얉은 복사는 복사를 진행할 때 '주소값' 만 복사하는 것을 의미한다.
위의 예제처럼 System.arraycopy() 메서드를 사용하게 되면 얉은 복사가 수행되며 각 배열 인덱스의 주소값을 복사하게된다.
주소값만을 복사하는게 무슨의미냐면 둘은 동일한 메모리주소를 공유하기때문에 둘중 하나가 변경되어도 둘이 동시에 변경되는 경우가 발생된다. (둘은 같은 인스턴스를 가리키고 있다라고 말해도 된다.)
이를 방지하고 싶다면?
복사를 수행하기전에 미리 인스턴스값을 할당해주어야 한다. 이미 메모리 주소가 할당된곳의 복사가 수행될경우에는 주소값을 가져오지 않기 때문에 깊은 복사를 수행할 수 있다.
위의 예제도 보면 array2를 미리 초기화 해줌으로써 복사 전에 메모리주소가 할당되어 있다.
즉, 위 예시는 깊은복사가 수행되었다고 보면된다.
● 다차원 배열
다차원 배열이란?
python에서도 많이 다룬내용이며 이차원 이상으로 구현한 배열을 말한다.
간단하게 어떻게 선언 및 초기화를 하는지 확인만 하자
int[ ][ ] 배열명 = {{값1, 값2,값3}, {값4,값5,값6}}
● ArrayList 클래스 사용하기
왜 ArrayList를 사용하는게 좋을까?
기존 배열은 '무조건' 배열의 크기를 선언할때 작성해주어야 한다. 하지만, 기본적으로 프로그래밍을 할 때 일정한 배열의 크기를 가지지 않는 배열을 다룰 때 많기 때문에 이를 보안할 방법이 필요한데 ArrayList를 사용하면 이를 해결할 수 있다.
ArrayList 클래스를 사용하기전 클래스에서 제공하는 주요 메서드를 확인해 보자
bollen add(E e) : 요소 하나를 배열에 추가합니다. (E는 요소의 자료형을 의미한다)
int size() : 배열의 추가된 요소 전체 개수를 반환한다.
E get(int index) : 배열의 index 위치에 있는 요소값을 반환한다.
E remove(int index): 배열의 index 위치에 있는 요소 값을 제거하고 그 값을 반환한다.
boolean isEmpty() : 배열이 비어있는지 확인한다.
여기서, add메서드를 보면 ArrayList의 장정과 같이 배열의 크기와 상관없이 객체를 추가할 수 있다.
(자리가 없으면 늘려서 추가한다는 의미) (List의 append 함수 마냥 사용할 수 있다는 의미인것 같다)
ArryaList는 다음과 같이 선언한다.
ArrayList<E> 배열이름 = new arrayList<E>( );
<E> : 제너릭 자료형이라고 하며 추후 제너릭장에서 다룰 에정이다.
package array;
import java.util.ArrayList; // ArrayList 클래스 import
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<Book> library = new ArrayList<Book>(); // 북 클래스 형으로 객체 배열 생성
library.add(new Book("태백산맥", "조정래"));
library.add(new Book("데미안", "헤르만헤세"));
library.add(new Book("어린왕자", "생택쥐페리"));
// 크기는 size() 메서드 사용
for (int i = 0; i < library.size(); i++) {
Book book = library.get(i); // get 메서드 사용
book.showBookInfo();
}
System.out.println();
System.out.println("==향상된 for 문 사용 ==");
// for (변수, 배열) {}
for (Book book : library) {
book.showBookInfo();
}
}
}
태백산맥,조정래
데미안,헤르만헤세
어린왕자,생택쥐페리
==향상된 for 문 사용 ==
태백산맥,조정래
데미안,헤르만헤세
어린왕자,생택쥐페리
'Java 입문' 카테고리의 다른 글
JAVA Basic - 인터페이스 (0) | 2022.12.08 |
---|---|
JAVA Basic - 추상 클래스 (0) | 2022.12.08 |
JAVA Basic - 상속 (0) | 2022.12.07 |
JAVA Basic - CLASS와 객체 2 (0) | 2022.11.26 |
JAVA Basic - CLASS와 객체 1 (0) | 2022.11.25 |