thumb

 

 

배열과 다차원 배열 & ArrayList

 

배열(Array)

 

 동일한 자료형을 가진 다수의 값으로 연속된 메모리 공간을 의미한다. 다수의 값을 한 번에 관리할 수 있어 효율적이다.

 

- 배열 선언과 동시에 초기화할 수 있음

- 배열 초기화 시 배열의 개수는 명시하지 않음

- 초기화 값 없이 선언한 경우 정수는 0, 실수는 0.0, 객체 배열은 null로 초기화됨.

 

 

▶ 배열 선언하기

 

선언방법①

 

자료형[ ] 배열이름 = new 자료형[개수]

 

int[] arr = new int[10];

선언방법②

 

자료형 배열이름[] = new 자료형[개수]

 

int arr[] = new int[10];

 

▶ 배열 초기화

 

배열 초기화 방법

 

자료형 배열이름[] = new 자료형[]  {초기화 값}

| |

자료형 배열이름[] = {초기화 값}

 

int arr[] = new int[] {0, 1, 2);
int arr[] = {0, 1, 2};

 

▶ 배열의 사용

 

[]  :  인덱스 혹은 첨자 연산자

 

  • - 배열의 위치를 지정하여 자료를 가져옴
  • - 모든 배열의 순서는 0부터 시작
  • - n개의 배열은 0부터 n-1 가지 자료가 존재( arr[0]~ [n-1] )
  •  

arr1
arr2

 

1. 직접 데이터를 초기화하여 사용할 수 있다.

 

2. 배열의 개수를 직접 지정하여 선언 후 사용할 수 있다.

 

 

★ 예제 1

 

문자 자료형 char를 사용하여 문자 자료형 배열을 만들고 알파벳 A부터 Z까지 저장한 후 배열의 0번째부터 n-1번째 까지 출력한다.

 

array.class

 

1. 알파벳 개수가 26개이므로 문자 자료형 배열 alphabets의 길이는 26개로 선언

2. 기준이 될 'A' 문자열이 들어있는 문자 자료형 aph 선언

3. 26번만 반복하는 반복문에서 aph++ 문자열 증감까지 실행

4. 값을 배열에 넣고 배열의 길이만큼 출력

 

 

객체 배열 사용하기

 

자료형 배열처럼 객체 또한 배열과 같은 형식으로 다수의 객체를 만들어 관리할 수 있다. 

 

 

- 객체는 배열만 생성한 경우 요소는 null 값으로 초기화됨.

 

- 각 요소를 초기화할 때에는 new를 사용해서 값을 초기화

ph[0] = new Phone("이꾸생 ", 01077777777);

 

이 처럼 3개의 객체를 생성했다. ph[0] 자리에만 값을 초기화 후 ph 객체 배열 전체의 주소 값을 출력했다. 결과는 값을 초기화해준 객체 배열에만 주소가 할당 됐으며 나머지는 null로 할당되어있다.

 

 

▶ 배열 복사 하기

 

기존의 배열과 같은 배열을 만들거나 배열이 꽉 찬 경우 더 큰 배열을 만들고 기존 배열 자료를 복사할 수 있다. 자바에서 배열은 기본 자료형 변수처럼 복사하게 된다면 배열의 참조만 복사된다. 즉 가리키는 주소값만 공유된다는 의미로 원본 값이 변경되면 복사된 값도 변경된다. 이것을 얕은 복사(shallow copy)라고 부른다.

 

 

System.arraycopy 함수 사용법(얕은 복사)

 

System.arraycopy(src, srcPos, dest, destPos, length);

 

  • src : 복사할 배열 이름
  • srcPos : 복사할 배열의 첫 번째 위치
  • dest : 복사해서 붙여 넣을 배열의 이름
  • destPos : 복사해서 대상 배열에 붙여 넣기할 첫 번째 위치
  • length : src에서 dest로 자료를 복사할 요소 개수
package arrayStudy;

public class Array {

	public static void main(String[] args) {
		char[] allAlphabets = new char[52]; //모든 알파벳
		char[] Alphabets = new char[26]; //알파벳 대문
		char[] alphabets = new char[26];//알파벳 소문
		char Aph = 'A';
		char aph = 'a';

		for(int i = 0; i < alphabets.length ; i++, aph++, Aph++) { 
			Alphabets[i] = Aph; 
			alphabets[i] = aph;			
		}				
		
		System.arraycopy(alphabets, 0, allAlphabets, 0, 26); 
		System.arraycopy(Alphabets, 0, allAlphabets, 26, 26);
		
		for(int j = 0 ; j < allAlphabets.length ; j++) {
		System.out.print(allAlphabets[j] + " ");
		}
	}
}

 

결과

 

▶ 객체 배열 복사 하기

 

shallow data-origin-height=
객체 배열 복사

 

arraycopy()를 사용해서 객체를 복사했을 경우 값이 복사된것이 아닌 주소가 공유된 것이므로 값을 변경했을때 ob1과 ob2의 출력 값은 똑같아진다.  

 

 

package arrayStudy;

public class ObjectCopy {

	public static void main(String[] args) {

		Object[] ob1 = new Object[3]; //1. 객체 선언
		Object[] ob2 = new Object[3];
		
		ob2[0]  = new Object(); //2. 빈 인스턴스를 생성
		ob2[1] = new Object();  
		ob2[2] = new Object();  
		
        for(int i=0 ; i<ob1.length ; i++) { //3. ob1객체 초기화
			ob1[i] = new Object("오브젝트" + (i+1), i);
		}
        
		for(int i=0 ; i< ob1.length ; i++) {//4. ob1을 ob2객체에 복사
			ob2[i].setName(ob1[i].getName());
			ob2[i].setNum(ob1[i].getNum());
		}
		
		ob2[2].setName("이꾸생");            //5. 특정 값만 변경

		for(int j=0; j<ob1.length ; j++) { //6. 출력
			ob1[j].ShowObjectInfo();
		}	
		System.out.println("");
		for(int k=0; k<ob2.length ; k++) { //6. 출력
			ob2[k].ShowObjectInfo();
		}
	}
}

deep
결과

값을 변경해도 얕은 복사처럼 둘다 값이 바뀌지 않는다.

 

 

향상된 for문 (Enhanced for loop)

String[] strArray = {"JAVA", "Study", "이꾸생"};

for(String s : strArray){
	System.out.println(s);
}

 

 

다차원 배열

 

2차원 이상의 배열로 평면의 공간을 구현 할 때 많이 사용되며, 지도나 게임 등에서도 자주 사용된다.

 

 

▶︎ 다차원 배열 선언방법

 

자료형[][] 배열이름 = new 자료형[행 개수][열 개수]

 

int[][] arr = new int[2][3];
array

 

 

▶︎ 다차원 배열 선언과 초기화

 

자료형[][] 배열이름 = {{1행 데이터・・},{2행 데이터・・}}

 

int[][] arr = {{1, 2, 3}, {4, 5, 6}};
2array

 

twodimensionalarray
Tow Demensional Array

 

ArrayList 클래스

 

기존에 있던 배열은 고정된 길이를 정하여 선언하기 때문에 사용 중 부족한 경우 다른 배열로 복사하는 코드를 직접 구현해야된다. 중간에 요소가 삭제되거나 삽입되는 경우도 나머지 요소에 대한 조정하는 코드를 구현 해야 한다.

 

ArrayList 클래스는 자바에서 제공하는 객체 배열이 구현된 클래스로 여러 메서드와 속성 등을 사용하여 객체 배열을 편리하게 관리할 수 있는 가장 많이 사용하는 객체 배열 클래스

 

 

▶ ArrayList 클래스 사용하기

 

ArrayList<E> 배열이름 = new ArrayList<E>();

 

사용할 객체를 'E' 위치에 넣고 ArrayList 메서드를 활용하여 추가하거나 참조 할 수 있음

 

메서드 설명
boolean add(E e) 요소 하나를 배열에 추가(E는 요소의 자료형을 의미)
int size() 배열에 추가된 요소 전체 개수를 반환(배열 길이)
E get(int index) 배열의 index 위치에 있는 요소 값을 반환
E remove(int index) 배열의 index 위치에 있는 요소 값을 제거하고 그 값을 반환
boolean isEmpty() 배열이 비어 있는지 확인

 

 

arraylistClass
배열 생성부터 출력까지

 

▶ 배열 응용 프로그램

 

예제 시나리오 : 1001학번 이꾸생과 1002학번 김꾸생이 있다. 이꾸생 학생은 3과목을 수강하며 자바 프로그래밍 100점, Spring 99점, HTML/CSS 98점이다. 김꾸생 학생은 자바 프로그래밍 98점, Spring 97점이다. Student 클래스와 Subject 클래스를 생성한 후 두 학생의 과목 성적과 총점, 평균을 각각 출력한다.

 

package arrayStudy;

import java.util.ArrayList;

public class Student {
	
	private int studentID;
	private String studentName; 
	private ArrayList<Subject> subjectList;
	
	public Student(int studentID, String studentName) {
		this.studentID = studentID;
		this.studentName = studentName;
		
		subjectList = new ArrayList<Subject>();
	}
	
	public void addSubject(String name, int score) {
		Subject sbj = new Subject();
		sbj.setName(name);
		sbj.setScorePoint(score);
		subjectList.add(sbj);
	}
	
	public void showStudentInfo() {
		int avg = 0;
		int total = 0;
		for( Subject s : subjectList ) {
			total+= s.getScorePoint();
			avg+= s.getScorePoint();
			System.out.println("학생 " + studentName + "의 총점은 " + s.getName() + " 과목 성적은 " 
			+ s.getScorePoint() + "점 입니다." );
		}	
		System.out.println("총점 : " + total + "점, 평균 : " + avg/subjectList.size() + "점");
	}
}

 

package arrayStudy;

public class Subject {

	private String name;
	private int scorePoint;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getScorePoint() {
		return scorePoint;
	}
	public void setScorePoint(int scorePoint) {
		this.scorePoint = scorePoint;
	}	
}

 

package arrayStudy;

public class StudentTest {

	public static void main(String[] args) {
		
		Student stdLee = new Student(1001, "이꾸생");
		
		stdLee.addSubject("자바 프로그래밍", 100);
		stdLee.addSubject("Spring", 99);
		stdLee.addSubject("HTML/CSS", 98);
		
		stdLee.showStudentInfo();
		System.out.println("");
		System.out.println("=========================================");
		System.out.println("");
		Student stdKim = new Student(1002, "꾸생");
		
		stdKim.addSubject("자바 프로그래밍", 98);
		stdKim.addSubject("Spring", 97);
		
		stdKim.showStudentInfo();
	}
}

 

arrayexresult
자바 배열 응용프로그램 결과