220606_인터넷 강의_객체 배열

창고·2022년 10월 20일
0

티스토리에 저장했던 글을 옮겼습니다.
https://mrcocoball.tistory.com/73

1. 배열 (Array)

  • 동일한 자료형의 순차적 자료 구조
  • 물리적 위치(메모리)와 논리적 위치가 동일
  • 자바에서는 배열의 길이를 선언하고 생성 (파이썬과 다름)
  • 배열의 순서는 0부터 시작
  • 인덱스 연산자[]를 이용, 빠른 참조
  • 객체 배열을 구현한 ArrayList를 많이 활용
  • 기본 자료형 배열과 객체 배열의 사용법 차이가 있음

2. 객체 배열 사용하기

  • 기본 자료형 배열은 선언과 동시에 배열의 크기만큼의 메모리가 할당되나 객체 배열의 경우 요소가 되는 객체의 주소가 들어갈 (4바이트, 8바이트) 메모리만 할당되고(null) 각 요소 객체는 생성하여 저장 필요
  • 예제
public class Book {
	
	// field
	
	private String title;
	private String author;
	
	
	// constructor
	
	public Book() {}
	public Book(String title, String author) {
		this.title = title;
		this.author = author;
	}
	
	
	// getter and setter (Resources -> Generate -> getter and setter)
	
	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;
	}
	
	
	// method
	
	public void showInfo() {
		
		System.out.println(title + "," + author);
	}
public class BookTest {

	public static void main(String[] args) {
		
		Book[] library = new Book[5];
		// 기본 자료형 배열과 달리 객체 배열의 경우 생성 시 메모리만 할당 되고 각 요소의 초기값은 null
		
		//객체 생성하여 직접 넣기
		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 (Book book : library) {
			System.out.println(book);
			book.showInfo();
		}
	
	}

}

3. 객체 배열 복사하기

  • System.arrayCopy(src, srcPos, dest, destPos, length)
  • 얕은 복사 : '객체 주소만 복사'되어 한 쪽 배열의 요소를 수정하면 같이 수정됨.
    즉, 두 배열이 같은 객체를 가리킴 (주소가 똑같음) 이 경우, 원본 객체가 변경되면 복사된 객체도 같이 변경됨
public class ObjectCopyTest {

	public static void main(String[] args) {
		
		Book[] library = new Book[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); // System.arraycopy 로 복사
		
		System.out.println("== library ==");
		for (Book book : library) {
			System.out.println(book);
			book.showInfo();
		}
		
		System.out.println("== copyLibrary ==");
		for (Book book : copyLibrary) {
			System.out.println(book); // 출력 시 복사된 객체들의 주소가 library의 객체 주소와 똑같음
			book.showInfo();
		}
		
		library[0].setTitle("나목");
		library[0].setAuthor("박완서");

		System.out.println("======library=========");
		for( Book book : library) {
			book.showInfo();
		}
		
		System.out.println("======copy library=========");
		for( Book book : copyLibrary) {
			book.showInfo();
		}

	
	}

}

  • 복사한 후 원본을 수정하였는데 복사된 배열도 같이 수정됨
  • 깊은 복사 : 배열을 새로 만들고 객체의 값을 복사, 직접 생성하여 집어넣음으로서 서로 다른 객체를 가리키도록 함
public class ObjectCopyTest2 {

	public static void main(String[] args) {
		Book[] library = new Book[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();
		
		// System.arraycopy 메서드가 아닌 직접 반복문으로 요소에 객체 넣기
		for(int i = 0; i<library.length; i++) {
			copyLibrary[i].setAuthor(library[i].getAuthor()); // library 요소 내 객체의 값을 복사, 직접 주입하여 생성
			copyLibrary[i].setTitle(library[i].getTitle()); // library 요소 내 객체의 값을 복사, 직접 주입하여 생성
		}
		
		System.out.println("== library ==");
		for (Book book : library) {
			System.out.println(book);
			book.showInfo();
		}
		
		System.out.println("== copyLibrary ==");
		for (Book book : copyLibrary) {
			System.out.println(book); // 출력 시 복사된 객체들의 주소가 library의 객체 주소와 다름
			book.showInfo();
		}
		
		library[0].setTitle("나목");
		library[0].setAuthor("박완서");

		System.out.println("======library=========");
		for( Book book : library) {
			book.showInfo();
		}
		
		System.out.println("======copy library=========");
		for( Book book : copyLibrary) {
			book.showInfo();
		}


	}

}

4. 다차원 배열

  • 이차원 이상으로 구현된 배열
  • 평면 (이차원 배열) 이나 공간 (삼차원 배열) 활용한 프로그램 구현
  • 평면 쪽 많이 사용하게 됨

5. 객체 배열을 구현한 클래스 ArrayList

  • java.util 패키지에서 제공
  • ArrayList<클래스명> 변수명 = new ArrayList<>(); 로 선언 하여 생성
  • 주요 메서드
    ㄱ. boolean add(E e) : 요소 하나를 배열에 추가, E는 요소의 자료형을 의미
    ㄴ. int size() : 배열에 추가된 요소 전체 개수를 반환
    ㄷ. E get(int index) : 배열의 index 위치에 있는 요소 값을 반환
    ㄹ. E remove(int index) : 배열의 index 위치에 있는 요소 값을 제거하고 그 값을 반환
    ㅁ. boolean isEmpty() : 배열이 비어 있는지 확인
  • 예제
public class ArrayListTest {

	public static void main(String[] args) {
		
		ArrayList<Book> library = new ArrayList<Book>(); // 최근에는 new ArrayList<>(); 로 해도 되긴 함
		
		library.add(new Book("리코의 벽쿵일기1", "리코")); // add로 추가, 이 때 객체 배열은 객체 생성자로 생성하여 추가
		library.add(new Book("리코의 벽쿵일기2", "리코"));
		library.add(new Book("리코의 벽쿵일기3", "리코"));
		library.add(new Book("리코의 벽쿵일기4", "리코"));
		library.add(new Book("리코의 벽쿵일기5", "리코"));
		
		for (int i = 0; i<library.size(); i++) { // length 대신 size()
			library.get(i).showInfo(); // i번째의 요소를 get 해서 showInfo()
		}
		
		// 상세 기능 잘 모를 때 ArrayList 클릭하여 f1 누르면 각 메소드에 대한 설명 나옴!

	}
}

6. ArrayList를 활용한 예제 (+ 주석)

  • 예제 시나리오
    • 1001학번, 1002학번 두 학생이 있으며 두 학생은 수강 과목이 각자 다름
    • Student 클래스와 Subject 클래스를 만들고 ArrayList를 활용하여 두 학생의 과목 성적 및 총점 출력
  • 실행 클래스
  public class StudentTest {

	public static void main(String[] args) {
		
		Student studentRico = new Student(1001, "리코");
		
		studentRico.addSubject("국어", 100);
		studentRico.addSubject("수학", 50);
		
		Student studentYoshiko = new Student(1002, "요시코");
		
		studentYoshiko.addSubject("국어", 70);
		studentYoshiko.addSubject("수학", 85);
		studentYoshiko.addSubject("영어", 100);
		
		studentRico.showScoreInfo();
		System.out.println("======================");
		studentYoshiko.showScoreInfo();
				
	}

}
  • Student 클래스
public class Student {
	
	// field
	String studentName;
	int number;
	ArrayList<Subject> subjectList; // ArrayList
	
	// constructor
	
	Student(int number, String studentName) {
		this.number = number;
		this.studentName = studentName;
		
		subjectList = new ArrayList<>(); // Student 객체 생성 시 subjectList 생성
	}
	
	// method
	
	public void addSubject(String name, int point) { // 학생 별로 수강하는 과목의 이름과 점수를 subjectList에 저장
		Subject subject = new Subject(); // Subject 객체 생성
		subject.setName(name); // Subject 객체의 과목 이름
		subject.setScorePoint(point); // Subject 객체의 점수
		
		subjectList.add(subject); // 위의 subject 객체를 subjectList에 저장
	}
	
	public void showScoreInfo() {
		
		int total = 0; // 총합 계산을 위한 로컬 변수
		
		for (Subject subject : subjectList) { // 향상된 for 문, subjectList 내에 있는 모든 요소들에 대해 반복
			
			total += subject.getScorePoint(); // subjectList 내에 있는 과목 점수들 합침
			System.out.println(studentName + " 학생의 " + subject.getName() + " 과목의 성적은 " + subject.getScorePoint() + "입니다.");			
		}
		
		System.out.println(studentName + " 학생의 총점은 " + total + "점 입니다."); // 총점 계산
	}
	
}
  • Subject 클래스
public class Subject {
	
	// field
	
	private String name;
	private int scorePoint;
	
	// getter and setter
	
	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;
	}

}

profile
공부했던 내용들을 모아둔 창고입니다.

0개의 댓글