Super Coding Addict
Ch06. 배열(1) 본문
< 배열이란 ? >
* 배열이란?
- 자료구조의 일종으로 가장 많이 쓰는 자료구조
- 동일한 자료형의 순차적 자료 구조
- 배열 선언
: int[] arr = new int[10]; --> fixed length
: int arr[] = new int[10];
- 배열은 물리적인 위치와 논리적 위치가 동일
(cf. 링크드 리스트 - 두 위치가 다름, 크기 미리 정해놓지 않음)
- 인덱스 [0] 부터 시작!
ex) 길이(length)가 5라면, 인덱스는 0부터 4까지!
- 연속된 자료구조 --> 중간에 하나를 지우게되면, 뒤에서 땡겨와야 한다...! 안그럼 지워진 자리가 끝이라고 인식함
- 첨자연산 유리 ( ex- arr[0], arr[1] )
- 예제
package array;
public class ArrayTest {
public static void main(String[] args) {
//int[] arr = new int[] {1,2,3}; //초기화할때는 [] 안에 개수 쓰지 않음
/*
int[] arr = {1,2,3};도 가능
그러나,
int[] arr; 이렇게 선언 뒤에
arr = {1,2,3}은 불가!
이 때는 arr = new int[]{1,2,3}으로 써줘야함
*/
int[] arr = new int[10];
int total = 0;
for(int i=0, num=1; i<arr.length; i++, num++) {
//System.out.println(arr[i]);
arr[i] = num;
}
for(int i=0; i<arr.length; i++) {
//System.out.println(arr[i]);
total += arr[i];
}
System.out.println(total);
double[] dArr = new double[5];
int count = 0;
dArr[0] = 1.1; count++;
dArr[1] = 2.1; count++;
dArr[2] = 3.1; count++;
//나머지 [3],[4]에는 0.0으로 초기화되어 있음
double mtotal = 1;
for(int i=0; i<count; i++) { //유효한 값의 범위만 가져오기 위해 count변수 활용
mtotal *= dArr[i];
}
System.out.println(mtotal);
}
}
- 배열 문제
: 문자 배열을 생성하고 출력해보기
: 대문자를 A-Z까지 배열에 저장하고 이를 다시 출력하는 프로그램 만들어보기
package array;
public class CharArrayTest {
public static void main(String[] args) {
char[] alphabets = new char[26];
char ch = 'A';
for(int i=0; i<alphabets.length; i++) {
alphabets[i] = ch++;
}
for(int i=0; i<alphabets.length; i++) {
System.out.println(alphabets[i] + "," + (int)alphabets[i]);
}
}
}
< 객체 배열 >
* 기본 자료형 배열과 참조 자료형 배열 (객체 배열)
--> 이처럼 참조자료형 배열에는 초기화 시에 값이 null이 들어가있는데, 나중에는 객체의 주소를 담게 된다!!
- 예제 : 참조자료형 배열
[ Book 클래스 ]
package array;
public class Book {
private String title;
private String author;
public Book() {} //디폴트 생성자
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public void showBookInfo() {
System.out.println(title + ", " + author);
}
}
[ BookArrayTest 클래스 ]
package array;
public class BookArrayTest {
public static void main(String[] args) {
Book[] library = new Book[5]; //책이 5권 생긴게 아니라, 배열이 생긴 것임
library[0] = new Book("태백산맥1", "조정래");
library[1] = new Book("태백산맥2", "조정래");
library[2] = new Book("태백산맥3", "조정래");
library[3] = new Book("태백산맥4", "조정래");
library[4] = new Book("태백산맥5", "조정래");
for(int i=0; i<library.length; i++) {
System.out.println(library[i]); //address 출력된다.
library[i].showBookInfo();
}
}
}
/*
결과:
array.Book@6a5fc7f7
태백산맥1, 조정래
array.Book@3b6eb2ec
태백산맥2, 조정래
array.Book@1e643faf
태백산맥3, 조정래
array.Book@6e8dacdf
태백산맥4, 조정래
array.Book@7a79be86
태백산맥5, 조정래
*/
- 예제 : 기본자료형 복사하기
[ArrayCopy 클래스 ]
package array;
public class ArrayCopy {
public static void main(String[] args) {
int[] arr1 = {10, 20, 30, 40, 50};
int[] arr2 = {1, 2, 3, 4, 5};
System.arraycopy(arr1, 0, arr2, 1, 3); //System클래스의 static메서드
//arr1의 0부터 -> arr2의 1부터 -> 3개 copy
//{10,20,30} -> {2,3,4}
for(int i=0; i<arr2.length; i++) {
System.out.println(arr2[i]);
}
}
}
--> System 클래스의 arraycopy라는 static 메서드를 사용해서 array를 copy!!!
- 예제 : 참조자료형 복사하기
[ ObjectCopy 클래스 ]
package array;
public class ObjectCopy {
public static void main(String[] args) {
Book[] library = new Book[5]; //책이 5권 생긴게 아니라, 배열이 생긴 것임
Book[] copyLibrary = new Book[5];
library[0] = new Book("태백산맥1", "조정래");
library[1] = new Book("태백산맥2", "조정래");
library[2] = new Book("태백산맥3", "조정래");
library[3] = new Book("태백산맥4", "조정래");
library[4] = new Book("태백산맥5", "조정래");
System.arraycopy(library, 0, copyLibrary, 0, 5);
/*
for( Book book : copyLibrary ) { //향상된 for문
book.showBookInfo();
}
*/
library[0].setTitle("나목");
library[0].setAuthor("박완서");
for( Book book : library ) {
book.showBookInfo();
}
System.out.println("=====================");
for( Book book : copyLibrary ) { //원본만 바꿨는데도 같이 바뀐다..! [얕은 복사]
book.showBookInfo();
}
}
}
/*
결과 (얕은 복사)
나목, 박완서
태백산맥2, 조정래
태백산맥3, 조정래
태백산맥4, 조정래
태백산맥5, 조정래
=====================
나목, 박완서
태백산맥2, 조정래
태백산맥3, 조정래
태백산맥4, 조정래
태백산맥5, 조정래
*/
* 객체 배열 복사
- 얕은 복사 : 실제로 인스턴스가 새로 생성되고 복사가 되는 게 아니라, 주소만 복사
--> 따라서 두 개의 객체 Array가 똑같은 애들을 가리킴
- 깊은 복사 : 각각 인스턴스 따로 !
--> System.arraycopy를 쓰는 게 아니라, 일일이 객체를 만들어서 값을 대입해줘야 함 (일일이 복사해야함)
--> 원본 값이 변경되어도 copy된 값은 변경X
- 예제 : 깊은 복사하기
package array;
public class ObjectCopy2 {
public static void main(String[] args) {
Book[] library = new Book[5]; //책이 5권 생긴게 아니라, 배열이 생긴 것임
Book[] copyLibrary = new Book[5];
library[0] = new Book("태백산맥1", "조정래");
library[1] = new Book("태백산맥2", "조정래");
library[2] = new Book("태백산맥3", "조정래");
library[3] = new Book("태백산맥4", "조정래");
library[4] = new Book("태백산맥5", "조정래");
copyLibrary[0] = new Book();
copyLibrary[1] = new Book();
copyLibrary[2] = new Book();
copyLibrary[3] = new Book();
copyLibrary[4] = new Book();
for(int i=0; i<library.length; i++) { //깊은 복사
copyLibrary[i].setAuthor(library[i].getAuthor());
copyLibrary[i].setTitle(library[i].getTitle());
}
library[0].setTitle("나목");
library[0].setAuthor("박완서");
for( Book book : library ) {
book.showBookInfo();
}
System.out.println("=====================");
for( Book book : copyLibrary ) { //원본만 바꿨는데도 같이 바뀐다..! [얕은 복사]
book.showBookInfo();
}
}
}
/*
결과:
나목, 박완서
태백산맥2, 조정래
태백산맥3, 조정래
태백산맥4, 조정래
태백산맥5, 조정래
=====================
태백산맥1, 조정래
태백산맥2, 조정래
태백산맥3, 조정래
태백산맥4, 조정래
태백산맥5, 조정래
*/
* 향상된 for문
- 배열 요소의 처음부터 끝까지 모든 요소를 참조할 때 편리한 반복문
for(변수 : 배열){
반복 실행문;
}
'JAVA 문법' 카테고리의 다른 글
Ch07. 상속과 다형성 (1) (0) | 2021.01.22 |
---|---|
Ch06. 배열(2) (0) | 2021.01.20 |
Ch05. 클래스와 객체(3) (0) | 2021.01.19 |
Ch05. 클래스와 객체(2) (0) | 2021.01.19 |
Ch05. 클래스와 객체(1) (0) | 2021.01.18 |