Chapter 7 배열과 ArrayList

Ruinak·2021년 5월 22일
0

Java

목록 보기
7/15
post-thumbnail

1. 배열이란?

1-1 자료를 순차적으로 관리하는 구조, 배열

  • 배열은 자료 구조의 가장 기초 내용입니다.
  • 배열을 사용하면 자료형이 같은 자료 여러 개를 한 번에 관리할 수 있습니다.
  • 배열은 자료가 연속으로 나열된 자료 구조입니다.

1-2 배열 선언과 초기화

  • 배열을 사용하려면 먼저 배열을 선언해야합니다.
  • 배열도 변수와 마찬가지로 자료형을 함께 선언합니다.
  • 아래는 배열을 선언하는 문법 형식입니다.
  • 배열을 이루는 각각의 자료를 배열 요소라고 합니다.
  • 배열 요소는 자료형이 모두 같습니다.
  • 저장하려는 자료의 성격에 맞게 자료형을 정하고 선언하려는 배열 요소 개수만큼 [ ] 안에 적습니다.
  • new 예약어는 배열을 새로 만들라는 의미입니다.
  • '배열형'자료란 의미로 변수 앞에 '자료형[ ]'을 사용하는 '자료형[ ] 변수이름= new 자료형[개수];' 선언 방식을 사용합니다.
  • 위 문장은 int형 요소가 10개인 배열을 선언한 것입니다.
  • 위 문장의 메모리 상태를 그림으로 나타내면 아래와 같습니다.
  • 배열을 선언하면 선언한 자료형과 배열 길이에 따라 메모리가 할당됩니다.

배열 초기화하기

  • 자바에서 배열을 선언하면 그와 동시에 각 요소의 값이 초기화됩니다.
  • 배열의 자료형에 따라 정수는 0, 실수는 0.0, 객체 배열은 null로 초기화되며, 배열 선언과 동시에 특정 값으로 초기화할 수도 있습니다.
  • 배열이 초기화 요소의 개수만큼 생성되므로 [ ] 안의 개수는 생략합니다.
  • 아래와 같이 값을 넣어 초기화할 때 [ ]안에 개수를 쓰면 오류가 발생합니다.
  • 선언과 동시에 초기화할 때 다음과 같이 new int[ ] 부분을 생략할 수도 있습니다.
  • int형 요소가 3개인 배열을 생성한다는 의미이므로 new int[ ]를 생략해도 됩니다.
  • 배열의 자료형을 먼저 선언하고 초기화하는 경우에는 new int[ ] 를 생략할 수 없습니다.

1-3 배열 사용하기

  • 선언한 배열의 각 요소에 값을 넣을 때나 배열 요소에 있는 값을 가져올 때는 [ ] 를 사용합니다.
  • 배열의 첫 번째 요소에 값 10을 저장한다면 아래처럼 코드를 작성합니다.

인덱스 연산자 [ ]

  • [ ]는 배열을 처음 선언할 때 사용한 연산자입니다.
  • 배열 이름에 [ ] 를 사용하는 것을 인덱스 연산이라고 합니다.
  • 인덱스 연산자의 기능은 배열 요소가 저장된 메모리 위치를 찾아 주는 역할입니다.
  • 변수 이름으로 저장된 메모리의 위치를 찾는 것처럼, 배열에서 [i] 인덱스 연산을 하면 i번째 요소의 위치를 찾아 해당 위치의 메모리에 값을 넣거나 이미 저장되어 있는 값을 가져와서 사용할 수 있습니다.

배열 순서는 0번부터

  • 배열 길이(처음에 선언한 배열 전체 요소 개수)가 n이라고 하면, 배열 순서는 0번부터 n-1번까지입니다.
  • 0번 요소배열의 첫 번째 요소라고 합니다.

예제 7-1 배열 초기화하고 출력하기

public class ArrayTest {
	public static void main(String[] args) {
		int[] num = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
		
		System.out.print("num : ");
		// 배열의 첫 번째 요소 (num[0])부터 열 번째 요소(num[9])까지 10개 요소 값 출력
		for(int i = 0; i < num.length; i++) {
			System.out.print(num[i] + " ");
		}
	}
}

  • 자바의 배열은 배열 길이를 나타내는 length 속성을 가집니다.
  • 자바에서 배열 길이는 처음에 선언한 배열의 전체 요소 개수를 의미합니다.
  • 전체 길이를 알고 싶은 배열 이름 뒤에 도트 ( . ) 연산자를 붙이고 length 속성을 쓰면 배열 길이를 반환합니다.
  • for문의 조건에서 얼만큼 반복할지 결정해야 하는데, 배열 요소 끝까지 반복하기 위해 배열 전체 길이(length)를 넣습니다.

전체 배열 길이와 유효한 요소 값

  • 전체 배열 길이와 현재 배열에 유효한 값이 저장되어 있는 배열 요소 개수가 같다고 혼동하면 안 됩니다.

예제 7-2 배열 길이만큼 출력하기

public class ArrayTest2 {
	public static void main(String[] args) {
		// double형으로 길이 5인 배열
		double [] data = new double[5];
		
		// 첫 번째 요소에 값 10.0 대입
		data[0] = 10.0;
		// 두 번째 요소에 값 20.0 대입
		data[1] = 20.0;
		// 세 번째 요소에 값 30.0 대입
		data[2] = 30.0;
		
		for(int i = 0; i < data.length; i++) {
			System.out.println(data[i]);
		}
	}
}

  • double형으로 길이가 5인 배열을 선언했습니다.
  • 자바에서 정수 배열과 실수 배열을 별도로 초기화하지 않고 선언하면 배열의 요소 값은 0으로 초기화됩니다.
  • 배열의 네 번째 요소와 다섯 번째 요소에는 값을 저장하지 않았기 때문에 0이 출력되는 것을 알 수 있습니다.
  • 배열의 세 번째 요소까지만 유요한 값이 저장된 것입니다.

예제 7-3 배열의 유효한 요소 값 출력하기

public class ArrayTest3 {
	public static void main(String[] args) {
		double [] data = new double[5];
		// 유효한 값이 저장된 배열 요소 개수를 저장할 변수 
		int size = 0;
		
		// 값을 저장한 후 size 변수 값 증가
		data[0] = 10.0; size++;
		data[1] = 20.0; size++;
		data[2] = 30.0; size++;
		
		// 유효한 값이 저장된 배열 요소 개수만큼 반복문 실행
		for(int i = 0; i < size; i++) {
			System.out.println(data[i]);
		}
	}
}

  • 배열 요소에 순서대로 값을 저장할 때마다 size 변수의 값을 하나씩 증가시킵니다.
  • 유효한 값을 저장하고 있는 배열 요소 개수를 알 수 있습니다.
  • 전체 배열 길이만큼 반복하는게 아니라 유효한 요소 개수만큼 반복합니다.

1-4 문자 저장 배열 만들기

예제 7-3 알파벳 문자와 아스키 코드 값 출력하기

public class CharTest {
	public static void main(String[] args) {
		char[ ] alphabets = new char[26];
		char ch = 'A';
		
		for(int i = 0; i < alphabets.length; i++, ch++) {
			// 아스키 값으로 각 요소에 저장
			alphabets[i] = ch;
		}
		
		for(int i = 0; i < alphabets.length; i++) {
			System.out.println(alphabets[i] + ", " + (int)alphabets[i]);
		}
	}
}

1-5 객체 배열 사용하기

  • 동일한 기본 자료형(int 등) 변수 여러 개를 배열로 사용할 수 있듯이 참조 자료형 변수도 여러 개를 배열로 사용할 수 있습니다.
  • 객체 배열은 int나 char 등 기본 자료형 배열과 사용 방법이 조금 다릅니다.

예제 7-4 객체 배열 만들기(1)

public class Book {
	private String bookName;
	private String author;
	
	// 디폴트 생성자
	public Book() { }
	
	// 책 이름과 저자 이름을 매개변수로 받는 생성자
	public Book(String bookName, String author) {
		super();
		this.bookName = bookName;
		this.author = author;
	}


	String getBookName() {
		return bookName;
	}

	void setBookName(String bookName) {
		this.bookName = bookName;
	}

	String getAuthor() {
		return author;
	}

	void setAuthor(String author) {
		this.author = author;
	}
	
	// 책 정보를 출력해주는 메서드
	public void showBookInfo() {
		System.out.println(bookName + ", " + author);
	}
}
  • Book 클래스는 책 이름과 저자를 멤버 변수로 가지는 클래스입니다.
  • 디폴트 생성자 외에도 책 이름과 저자 이름을 매개변수로 받는 생성자를 하나 더 구현했습니다.
  • 다른 코드에서 이 클래스를 사용할 때 멤버 변수 값을 가져오거나 지정할 수 있도록 get( ), set( ) 메서드도 구현했습니다.
  • 책의 정보를 출력해주는 showBookInfo( ) 메서드까지 구현했습니다.

예제 7-5 객체 배열 만들기(2)

public class BookArray {
	public static void main(String[] args) {
		// Book 클래스형으로 객체 배열 생성
		Book[] library = new Book[5];
		
		for(int i = 0; i < library.length; i++) {
			System.out.println("library[" + i + "] : " + library[i]);
		}
	}
}

  • Book[ ] library= new Book[5];는 각각의 Book 인스턴스 주소 값을 담을 공간 5개를 생성하는 문장입니다.
  • 실행하면 Book 주소 값을 담을 공간이 5개 만들어지고 자동으로 각 공간은 '비어 있다'는 의미의 null 값으로 초기화 됩니다.

예제 7-6 객체 배열 만들기(3)

public class BookArray2 {
	public static void main(String[] args) {
		// Book 클래스형으로 객체 배열 생성
		Book[] library = new Book[5];
		
		// 인스턴스 생성 후 배열에 저장
		library[0] = new Book("참교육", "한가람");
		library[1] = new Book("한림체육관", "혜성");
		library[2] = new Book("테러맨", "고진호");
		library[3] = new Book("부활남", "김재한");
		library[4] = new Book("정글쥬스", "쥬더");
		
		for(int i = 0; i < library.length; i++) {
			library[i].showBookInfo();
		}
		
		System.out.println("=================================");
		
		for(int i = 0; i < library.length; i++) {
			System.out.println("library[" + i + "] : " + library[i]);
		}
	}
}

1-6 배열 복사하기

  • 기존 배열과 자료형 및 배열 크기가 똑같은 배열을 새로 만들거나 배열의 모든 요소에 자료가 꽉 차서 더 큰 배열을 만들어 기존 배열에 저장된 자료를 가져오려 할 때 배열을 복사합니다.
  • 복사하는 방법으로 두 가지가 있습니다.
    1) 기존 배열과 배열 길이가 같거나 더 긴 배열을 만들고 for문을 사용하여 각 요소 값을 반복해서 복사하는 방법( 이 코드는 간단하므로 생략 )
    2) System.arraycopy( ) 메서드를 사용하는 방법
  • System.arraycopy(src, srcPos, dest, destPos, length) 메서드에서 각 매개변수의 의미는 아래와 같습니다.

예제 7-7 System.arraycopy( )로 배열 복사하기

public class ArrayCopy {
	public static void main(String[] args) {
		int[] array1 = {10, 20, 30, 40, 50};
		int[] array2 = {1, 2, 3, 4, 5};
		
		// 복사할 배열 = array1
		// 복사할 첫 위치 = 0	
		// 대상 배열 = array2
		// 붙여 넣을 첫 위치 = 1		
		// 복사할 요소 개수 = 4
		System.arraycopy(array1, 0, array2, 1, 4);
		
		for(int i = 0; i < array2.length; i ++) {
			System.out.println("array2[" + i + "]" + " = " + array2[i]);
		}
	}
}

  • 결과를 보면 첫 번째 요소 값인 1을 제외하고 나머지 요소 값만 변경된 것을 알 수 있습니다.
  • 복사할 대상 배열의 전체 길이가 복사할 요소 개수보다 작다면 오류가 발생합니다.

객체 배열 복사하기

  • 객체 배열도 마찬가지로 복사할 수 있습니다.

예제 7-8 객체 배열 복사하기

public class ObjectCopy1 {
	public static void main(String[] args) {
		Book[] bookArray1 = new Book[3];
		Book[] bookArray2 = new Book[3];
		
		bookArray1[0] = new Book("전지적 독자 시점", "싱숑");
		bookArray1[1] = new Book("화산귀환", "비가");
		bookArray1[2] = new Book("나노마신", "한중월야");
		System.arraycopy(bookArray1, 0, bookArray2, 0, 3);
		
		for(int i = 0; i < bookArray2.length; i ++) {
			System.out.print("bookArray2[" + i + "] = ");
			bookArray2[i].showBookInfo();
		}
	}
}

  • 코드 출력 결과를 통해 bookArray1 배열에서 bookArray2 배열로 요소 값이 잘 복사된 것을 알 수 있습니다..
  • 그런데 왜 bookArray2 배열의 인스턴스를 따로 만들지 않았는데 각 요소 값이 출력되고 있습니다.
  • 객체 배열을 사용하려면 꼭 인스턴스를 생성해서 넣어야 한다고 했었는데...이건 why?

얕은 복사

예제 7-9 객체 배열의 얕은 복사

public class ObjectCopy2 {
	public static void main(String[] args) {
		Book[] bookArray1 = new Book[3];
		Book[] bookArray2 = new Book[3];
		
		bookArray1[0] = new Book("전지적 독자 시점", "싱숑");
		bookArray1[1] = new Book("화산귀환", "비가");
		bookArray1[2] = new Book("나노마신", "한중월야");
		System.arraycopy(bookArray1, 0, bookArray2, 0, 3);
		
		System.out.println("============== Arraycopy ==============");
		
		for(int i = 0; i < bookArray2.length; i ++) {
			System.out.print("bookArray2[" + i + "] = ");
			bookArray2[i].showBookInfo();
		}
        
		// bookArray1 배열의 첫 번째 요소 값 변경
		bookArray1[0].setBookName("1초");
		bookArray1[0].setAuthor("시니");
		
		System.out.println("============== bookArray1 ==============");
		
		for(int i = 0; i < bookArray1.length; i ++) {
			System.out.print("bookArray1[" + i + "] = ");
			bookArray1[i].showBookInfo();
		}
		
		System.out.println("============== bookArray2 ==============");
		
		for(int i = 0; i < bookArray2.length; i ++) {
			// bookArray2 배열 요소 값도 변경되어 출력
			System.out.print("bookArray2[" + i + "] = ");
			bookArray2[i].showBookInfo();
		}
		
	}
}

  • bookArray1 배열 요소 값을 변경했는데 bookArray2 배열 요소 값도 변경됩니다.
  • 객체 배열의 요소에 저장된 값은 인스턴스 자체가 아니고 인스턴스 주소 값이기 때문입니다.
  • 객체 배열을 복사할 때 인스턴스를 따로 생성하는게 아니라 기존 인스턴스의 주소 값만 복사합니다.
  • 두 배열의 서로 다른 요소가 같은 인스턴스를 가리키고 있으므로 복사되는 배열의 인스턴스 값이 변경되면 두 배열 모두 영향을 받는 것입니다.
  • 이와 같이 주소 값만 복사하는 것을 '얕은 복사(shallow copy)'라고 합니다.

깊은 복사

  • 반복문을 사용하건 System.arraycopy( ) 메서드를 사용하건 객체 배열을 복사하면 항상 인스턴스 주소가 복사됩니다.
  • 인스턴스를 따로 관리하고 싶다면 직접 인스턴스를 만들고 그 값을 복사해야 합니다.
  • 이를 '깊은 복사(deep copy)'라고 함

예제 7-10 객체 배열의 깊은 복사

public class ObjectCopy3 {
	public static void main(String[] args) {
		Book[] bookArray1 = new Book[3];
		Book[] bookArray2 = new Book[3];
		
		bookArray1[0] = new Book("전지적 독자 시점", "싱숑");
		bookArray1[1] = new Book("화산귀환", "비가");
		bookArray1[2] = new Book("나노마신", "한중월야");
		
		// 디폴트 생성자로 bookArray2 배열 인스턴스 생성
		bookArray2[0] = new Book();
		bookArray2[1] = new Book();
		bookArray2[2] = new Book();
		
		System.out.println("============== Arraycopy ==============");
		
		// bookArray1 배열 요소를 새로 생성한 bookArray2 배열 인스턴스에 복사
		for(int i = 0; i < bookArray1.length; i ++) {
			bookArray2[i].setBookName(bookArray1[i].getBookName());
			bookArray2[i].setAuthor(bookArray1[i].getAuthor());
		}
		
		for(int i = 0; i < bookArray2.length; i ++) {
			// bookArray2 배열 요소 값 출력
			System.out.print("bookArray2[" + i + "] = ");
			bookArray2[i].showBookInfo();
		}
		
		// bookArray1 배열의 첫 번째 요소 값 수정
		bookArray1[0].setBookName("1초");
		bookArray1[0].setAuthor("시니");
		
		System.out.println("============== bookArray1 ==============");
		
		for(int i = 0; i < bookArray1.length; i ++) {
			// bookArray1 배열 요소 값 출력
			System.out.print("bookArray1[" + i + "] = ");
			bookArray1[i].showBookInfo();
		}
		
		System.out.println("============== bookArray2 ==============");
		
		for(int i = 0; i < bookArray2.length; i ++) {
			// bookArray1 배열 요소 값과 다른 내용이 출력됨
			System.out.print("bookArray2[" + i + "] = ");
			bookArray2[i].showBookInfo();
		}
		
	}
}

  • 위 예제처럼 깊은 복사를 할 경우 메모리 그림은 아래와 같습니다.
  • 복사할 배열에 인스턴스를 따로 생성한 후 요소 값을 복사합니다.
  • 복사한 배열 요소는 기존 배열 요소와 다른 인스턴스를 가리키므로 기존 배열의 요소 값이 변경되어도 영향을 받지 않는다는 것을 알 수 있습니다.

1-7 향상된 for문(enhanced for loop)과 배열

  • 향상된 for문은 배열의 처음에서 끝까지 모든 요소를 참조할 때 사용하면 편리한 반복문입니다.
  • 향상된 for문의 형식은 아래와 같습니다.
  • 향상된 for문은 배열 요소 값을 순서대로 하나씩 가져와서 변수에 대입합니다.
  • 초기화와 종료 조건이 없기 때문에 모든 배열의 시작 요소부터 끝 요소까지 실행합니다.

예제 7-11 향상된 for문 사용하기

public class EnhancedForLoop {
	public static void main(String[] args) {
		String[] strArray = {"Java", "Android", "HTML", "Spring", "JavaScript"};
		
		// 변수에는 각 요소가 대입
		for(String lang : strArray) {
			System.out.println(lang);
		}
	}
}

  • 향상된 for문을 사용해서 String형 lang 변수에 strArray 배열 요소 값을 순서대로 가져와 대입합니다.
  • lang 변수를 출력하면 strArray 배열에 저장된 값이 순서대로 출력됩니다.

2. 다차원 배열

2-1 다차원 배열이란?

  • 지금까지 배운 배열은 모두 행 하나로 이루어진 '일차원 배열'입니다.
  • 프로그램에서도 평면을 구현하기 위해 이차원 배열을 사용할 수 있습니다.
  • 삼차원 이상의 배열도 가능하며, 주로 공간을 나타내는 프로그램에서 활용합니다.
  • 이차원 이상으로 구현한 배열을 '다차원 배열'이라고 합니다.
  • 다차원 배열은 평면이나 공간 개념을 구현하는데 사용합니다.

2-2 이차원 배열

  • 이차원 배열의 형식은 아래와 같습니다.
  • 배열의 모든 요소를 참조하려면 각 행을 기준으로 열 값을 순회하면 됩니다.
  • 이차원 배열을 초기화하려면 행과 열 개수에 맞추서 중괄호 { } 안에 콤마( , )로 구분해 값을 적습니다.

예제 7-12 이차원 배열 초기화하기

public class TwoDimension1 {
	public static void main(String[] args) {
		// 이차원 배열 선언과 동시에 초기화
		int[][] arr = {{1, 2, 3}, {4, 5, 6}};
		
		for(int i = 0; i < arr.length; i++) {
			for(int j= 0; j < arr[i].length; j++) {
				System.out.println("arr[" + i + "][" + j + "] = " + arr[i][j]);
			}
			// 행 출력 끝난 후 한 줄 띄움
			System.out.println();
		}
	}
}

예제 7-13 이차원 배열의 길이 출력하기

public class TwoDimension2 {
	public static void main(String[] args) {
		// 2행 3열 이차원 배열 선언
		int[][] arr = new int[2][3];
		
		// arr.length은 행 길이
		for(int i = 0; i < arr.length; i++) {
			// arr[i].length는 열 길이
			for(int j= 0; j < arr[i].length; j++) {
				System.out.println("arr[" + i + "][" + j + "] = " + arr[i][j]);
			}
			// 행 출력 끝난 후 한 줄 띄움
			System.out.println();
		}
		System.out.println("행 길이(arr.length) = " + arr.length);
		System.out.println("열 길이(arr[0].length) = " + arr[0].length);
	}
}

  • 위 예제에서는 이차원 배열을 선언만 하고 초기화를 따로 하지 않았기 때문에, 모두 0으로 자동 초기화된 것을 알 수 있습니다.

3. ArrayList 클래스 사용하기

3-1 기존 배열의 단점과 ArrayList

  • 기본 배열은 프로그램에서 사용하려면 항상 배열 길이를 정하고 시작합니다.
  • 배열 길이가 변하는 상황이 생긴다면, 배열을 사용하는 중간에 배열 길이를 변경할 수 없기 때문에 코드를 수정해야합니다.
  • 배열은 중간에 있는 요소를 비워 둘 수 없으므로 배열 요소 위치를 변경해야 합니다.
  • 객체 배열을 더 쉽게 사용할 수 있는 ArrayList 클래스는 객체 배열을 관리할 수 있는 멤버 변수와 메서드를 제공합니다.

3-2 ArrayList 클래스의 주요 메서드

  • 아래 표는 ArrayList 클래스에서 가장 많이 사용하는 메서드입니다.
  • add( ) 메서드를 이용하면 배열 길이와 상관없이 객체를 추가할 수 있습니다.
  • 배열의 길이가 추가될 요소 개수보다 부족하다면 배열을 더 키울수 있도록 구현되어 있습니다.
  • 배열 중간의 어떤 요소 값이 제거되면 그 다음 요소 값을 하나씩 앞으로 이동하는 코드도 이미 구현되어 있습니다.
  • 자바에서 제공하는 라이브러리를 활용하면 좀 더 편리하게 프로그래밍 할 수 있습니다.

3-3 ArrayList 클래스 활용하기

  • ArrayList를 사용하는 기본 형식은 아래와 같습니다.
  • 배열을 선언하는 부분의 < > 안에 사용할 객체의 자료형(E)을 쓰면 됩니다.
  • <E>와 같은 형태를 '제네릭(generic) 자료형'이라고 합니다.
  • 앞에서 살펴본 Book 클래스형을 자료형으로 사용해서 ArrayList 배열을 생성한다면 아래와 같습니다.
  • ArrayList는 java.util 패키지에 구현되어 있는 클래스입니다.
  • ArrayList를 사용하려면 자바 클래스를 선언하기 전에 import java.util.ArrayList; 문장을 반드시 써줘야 합니다.
  • 내 코드에 없는 클래스를 가져와 사용할 때 이 클래스가 어디에 구현되어 있다고 알려주기 위해 코드 맨 위에 선언하는 것을 임포트(import)한다고 합니다.

예제 7-14 ArrayList 클래스 사용하기

public class ArrayListTest {
	public static void main(String[] args) {
		// ArrayList 선언
		ArrayList<Book> library = new ArrayList<Book>();
		
		// add( ) 메서드로 요소 값 추가
		library.add(new Book("전지적 독자 시점", "싱숑"));
		library.add(new Book("화산귀환", "비가"));
		library.add(new Book("나노마신", "한중월야"));
		library.add(new Book("더 복서", "정지훈"));
		library.add(new Book("중증외상센터 : 골든 아워", "한산이가"));
		
		// 배열에 추가된 요소 개수만큼 출력
		for(int i = 0; i < library.size(); i++) {
			Book book = library.get(i);
			book.showBookInfo();
		}
		System.out.println();
		
		System.out.println("========== 향상된 for문 사용 ==========");
		for(Book book : library) {
			book.showBookInfo();
		}
	}
}

  • 기본 배열에서는 [ ] 안에 배열 전체 길이를 미리 지정해야 했지만, ArrayList를 생성할 때는 미리 지정할 필요 없이 add( ) 메서드를 사용해 생성자만 호출하면 됩니다.

4. 배열 응용 프로그램

4-1 Student 클래스 구현하기

예제 7-15 Student 클래스 구현하기

public class Student {
	
	// Student 클래스의 멤버 변수
	int studentID;
	String studentName;
	// ArrayList 선언하기
	ArrayList<Subject> subjectList;
	
	
	// 생성자
	public Student(int studentID, String studentName) {
		this.studentID = studentID;
		this.studentName = studentName;
		// ArrayList 생성하기
		subjectList = new ArrayList<Subject>();
	}
	
	// 학생이 수강하는 과목을 subject 배열에 하나씩 추가하는 메서드
	public void addSubejct(String name, int score) {
		// Subject 생성하기
		Subject subject = new Subject();
		// 과목 이름 추가하기
		subject.setName(name);
		// 점수 추가하기
		subject.setScorePoint(score);
		// 배열에 저장하기
		subjectList.add(subject);
	}
	
	public void showStudentInfo() {
		int total = 0;
		// 배열 요소 값 출력
		for(Subject s : subjectList) {
			// 총점 더하기
			total += s.getScorePoint();
			System.out.println("학생 " + studentName + "의 " + s.getName()
            				+ " 과목 성적은 " + s.getScorePoint() + "점 입니다.");
		}
		System.out.println("학생 " + studentName + "의 총점은 " + total + "점 입니다.");
	}	
}
  • 한 학생이 수강하는 과목은 여러개 있을 수 있으므로, Subject 클래스형으로 ArrayList를 생성합니다.
  • SubjectList는 학생이 수강하는 과목을 저장할 배열입니다.

4-2 Subject 클래스 구현하기

예제 7-16 Subject 클래스 구현하기

public class Subject {
	// Subecjt 클래스의 멤버 변수
	private String name;
	private int scorePoint;
	
	String getName() {
		return name;
	}
	void setName(String name) {
		this.name = name;
	}
	int getScorePoint() {
		return scorePoint;
	}
	void setScorePoint(int scorePoint) {
		this.scorePoint = scorePoint;
	}
}

4-3 테스트 클래스 구현 후 결과 확인하기

예제 7-17 학생 성적 출력하기

public class StudentTest {
	public static void main(String[] args) {
		Student studentLee = new Student(1001, "Lee");
		studentLee.addSubejct("국어", 100);
		studentLee.addSubejct("수학", 50);
		
		Student studentKim = new Student(1001, "Kim");
		studentKim.addSubejct("국어", 70);
		studentKim.addSubejct("수학", 85);
		studentKim.addSubejct("영어", 100);
		
		studentLee.showStudentInfo();
		System.out.println("======================================");
		studentKim.showStudentInfo();
	}
}

profile
Nil Desperandum <절대 절망하지 마라>

0개의 댓글