[Java] Array

SeongWon Oh·2021년 8월 15일
0

Java

목록 보기
13/39
post-thumbnail

배열 (Array)

  • Java의 배열은 C의 배열과 같게 동일한 자료형의 데이터를 순차적으로 넣는 구조이다.

  • 배열은 물리적 위치와 논리적 위치가 동일하며 위치의 시작은 0부터 시작한다.

  • 자바에서는 객체 배열을 구현한 ArrayList를 많이 활용한다.


배열 선언 및 초기화

  • 배열 선언하기
    • 배열을 선언하면 int형은 0, double형은 0.0으로 초기화된다.
    • 아래의 두가지 방법으로 []의 위치를 둘 수 있다.
int[] arr1 = new int[10];
int arr2[] = new int[10];
  • 배열 초기화하기
// 방법1
int[] numbers = new int[] {10, 20, 30};  //개수 생략해야 함

// 방법2
int[] numbers = {10, 20, 30};            // new int[]  생략 가능 

// 방법3
int[] ids; 
ids = new int[] {10, 20, 30};            // 선언후 배열을 생성하는 경우는 new int[] 생략할 수 없음

👨🏻‍💻 Example Code

package ch20;

public class ArrayTest {
	public static void main(String[] args) {
		// int[] arr = new int[] {1,2,3,4,5,6,7,8,9,10};
		int[] arr = new int[10];
		// 배열은 생성과 동시에 초기화가된다. 
		// int는 0, double은 0.0, 객체는 null로 초기화됨
		int total = 0;
		
		for(int i=0, num=1; i<arr.length; i++) {
			arr[i] = num++;
		}
		
		for (int num : arr) { 
        	// for는 배열의 n개 요소를 0 부터 n-1까지 순차적으로 순회할 때 간단하게 사용할 수 있다.
        	//arr의 있는게 하나씩 num으로 해서 돌아감
			total += num;
		}
		
		System.out.println(total);
	}
}



객체 배열

  • 기본 자료형(int, char, double등)의 배열은 선언과 동시에 배열 크기만큼의 메모리가 할당되지만, 객체 배열은 객체의 주소가 들어갈 4/8byte의 메모리 공간만 할당되고 각 객체는 따로 생성하여 저장해야한다.
  • 객체 배열을 생성하였을때 초기값은 null이 들어가있다.

👨🏻‍💻 Example Code

Book.java

package ch21;

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 showInfo() {
		System.out.println(title + ", " + author);
	}
}

BookTest.java

package ch21;

public class BookTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Book[] library = new Book[5];
		
		for(int i=0; i<library.length;i++) {
			library[i] = new Book("태백산맥"+i, "조정래");
		}
		
		for(Book book: library) {
			System.out.println("\n"+ book);
			book.showInfo();
		}
	}

}

객체 배열 복사

얕은 복사

  • 자바에서 제공하는 배열 복사 메서드 System.arrayCopy(src, srcPos, dest, destPos, length)를 사용하여 하는 복사.

  • 객체의 주소값만 복사를 하여 두개의 배열이 하나의 객체를 가르키게 한다.

👨🏻‍💻 Example Code

package ch21;
/*
 * 주소값만 복사를 하여 같은 주소를 가리키게하는 얕은 복사
 * */
public class ObjectCopyTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Book[] library = new Book[5];
		Book[] copyLibrary = new Book[5];
		
		for(int i=0; i<library.length;i++) {
			library[i] = new Book("태백산맥"+i, "조정래");
		}
		
		// System.arrayCopy(src, srcPos, dest, destPos, length)
		System.arraycopy(library, 0, copyLibrary, 0, 5);
		// 얕은 카피로 주소만 복사된다.
		// 깊은 복사를 하려면 10~12번째줄처럼 따로 인스턴스를 만들고 값만 따로 복사를 해줘야한다.
		
		System.out.println("==Library==");
		for(Book book: library) {
			System.out.println(book);
			book.showInfo();
		}
		
		System.out.println("\n== Copy Library==");
		for(Book book: copyLibrary) {
			System.out.println(book);
			book.showInfo();
		}
	}

}

깊은 복사

  • 얕은 복사와 다르게 새로운 인스턴스를 생성하고 그 인스턴스에 복사하고자 하는 인스턴스의 값들을 복사하여 넣어준다.

👨🏻‍💻 Example Code

package ch21;
/*
 * 주소값까지 다르게 새로운 인스턴스를 생성하는 깊은 복사
 * */
public class ObjectCopyTest2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Book[] library = new Book[5];
		Book[] copyLibrary = new Book[5];
		
		for(int i=0; i<library.length;i++) {
			library[i] = new Book("태백산맥"+i, "조정래");
		}
		
		for(int i=0; i<copyLibrary.length;i++) {
			copyLibrary[i] = new Book();
		}
		
		
		for (int i=0; i<copyLibrary.length; i++) {
			copyLibrary[i].setTitle(library[i].getTitle());
			copyLibrary[i].setAuthor(library[i].getAuthor());
		}
		
		System.out.println("==Library==");
		for(Book book: library) {
			System.out.println(book);
			book.showInfo();
		}
		
		System.out.println("\n== Copy Library==");
		for(Book book: copyLibrary) {
			System.out.println(book);
			book.showInfo();
		}
	}

}



Reference

  • [Fast Campas] 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글