Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Super Coding Addict

Ch06. 배열(1) 본문

JAVA 문법

Ch06. 배열(1)

밍응애 2021. 1. 19. 20:11

< 배열이란 ? >

* 배열이란?

- 자료구조의 일종으로 가장 많이 쓰는 자료구조

- 동일한 자료형의 순차적 자료 구조

- 배열 선언

: 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(변수 : 배열){
	반복 실행문;
}

 

 

www.fastcampus.co.kr/dev_online_jvweb

'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