강의 내용
[1] BookArray 클래스를 만들어 사용하는 방법
[2] ObjectArray 클래스를 만들어 사용하는 방법
[1] BookArray 클래스를 만들어 사용하는 방법
배열처럼 동작하는 클래스를 통해 책을 핸들링하는 방법
Q. 책 3권을 배열에 저장하고 출력하시오.
Book(데이터 자료형)을 먼저 만들어야 함
// 잘 설계된 VO, DTO public class Book { private String title; private int price; private String company; private String author; // 기본 생성자 public Book() { } // 생성자 오버로딩 public Book(String title, int price, String company, String author) { this.title = title; this.price = price; this.company = company; this.author = author; } // Setter, Getter public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getCompany() { return company; } public void setCompany(String company) { this.company = company; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } // 재정의 : Object -> toString() @Override public String toString() { return "Book{" + "title='" + title + '\'' + ", price=" + price + ", company='" + company + '\'' + ", author='" + author + '\'' + '}'; } }
(1) 생성 동작 : BookArray()
생성자 오버로딩 : 생성자를 이용하여 객체를 초기화하기 위함
(2) 저장 동작 : add()
객체 배열 : 책 데이터 한 권이 들어가야 함
(3) 가져오는 동작 : get()
println()로 인해 객체의 toString()가 호출된다.
(4) 크기를 구하는 동작 : size()
public class BookArray { private final int DEFAULT_CAPACITY = 5; // 상수(수정 불가) private Book[] elements; // 원하는 형태로 변경 private int size = 0; // 생성 동작 public BookArray() { elements = new Book[DEFAULT_CAPACITY]; } // 저장 동작 public void add(Book element) { // 공간 확인 if (size == elements.length) { // 크기를 2배로 늘리는 작업 ensureCapacity(); } elements[size++] = element; } public void ensureCapacity() { int newCapacity = elements.length * 2; elements = Arrays.copyOf(elements, newCapacity); } // 가져오는 동작 public Book get(int index) { // -1, 5 // index 확인 if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("index의 범위(0~4)가 초과됨"); } return elements[index]; } // 원소의 개수를 넘겨주는 동작 public int size() { return size; } }
public class MyBookArrayTest { public static void main(String[] args) { // Q. 책 3권을 배열에 저장하고 출력하시오. BookArray list = new BookArray(); list.add(new Book("자바", 15000, "한빛", "홍길동")); list.add(new Book("C++", 17000, "대림", "이길동")); list.add(new Book("Python", 16000, "정보", "나길동")); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); // toString() } } }
[2] ObjectArray 클래스를 만들어 사용하는 방법
IntArray, BookArray : 특정 타입만 저장 가능(한계)
범용적인 API가 되려면? 특정 타입이 아닌 여러 타입을 저장해야 함
클래스가 어떤 배열을 갖느냐에 따라 범용성인지 확장 가능한 클래스인지 결정된다.
# Object : 최상위 클래스. 모든 객체에 대한 업캐스팅 가능
Q. 객체 3권을 배열에 저장하고 출력하시오.
어떤 타입의 객체라도 저장 가능한 범용적인 클래스(A, B, C : 서로 다른 클래스)
최상위 클래스이므로 서로 다른 하위 클래스 저장 가능(다형성 배열)
Object로 Upcasting되면 꺼낼 때 Downcasting되어야 함
# 다형성 배열 : 모든 클래스를 저장할 수 있는 배열
(1) 생성 동작 : ObjectArray()
(2) 저장 동작 : add()
(3) 가져오는 동작 : get()
(4) 크기를 구하는 동작 : size()
public class A { public void display() { System.out.println("나는 A이다."); } }
public class B { public void display() { System.out.println("나는 B이다."); } }
public class C { public void display() { System.out.println("나는 C이다."); } }
public class ObjectArray { private final int DEFAULT_CAPACITY = 5; // 상수(수정 불가) private Object[] elements; // 다형성 배열 private int size = 0; // 생성 동작 public ObjectArray() { elements = new Object[DEFAULT_CAPACITY]; } // 저장 동작 public void add(Object element) { // 다형성 인수 // 공간 확인 if (size == elements.length) { // 크기를 2배로 늘리는 작업 ensureCapacity(); } elements[size++] = element; } public void ensureCapacity() { int newCapacity = elements.length * 2; elements = Arrays.copyOf(elements, newCapacity); } // 가져오는 동작 public Object get(int index) { // -1, 5 // index 확인 if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("index의 범위(0~4)가 초과됨"); } return elements[index]; } // 원소의 개수를 넘겨주는 동작 public int size() { return size; } }
public class MyObjectArrayTest { public static void main(String[] args) { // A, B, C 객체를 배열에 저장하고 출력하시오. ObjectArray list = new ObjectArray(); list.add(new A()); // Upcasting : Object element = new A(); list.add(new B()); // Upcasting : Object element = new B(); list.add(new C()); // Upcasting : Object element = new C(); for (int i = 0; i < list.size(); i++) { if (list.get(i) instanceof A) { ((A)list.get(i)).display(); // Downcasting : Object -> A } else if (list.get(i) instanceof B) { ((B)list.get(i)).display(); // Downcasting : Object -> B } else { ((C)list.get(i)).display(); // Downcasting : Object -> C } } } }
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.