# ArrayList - get() Book 클래스에 있는 title과 price의 접근제한자가 private 으로 설정되어 있는데 이 예제에서는 게터를 써주지 않고 어떻게 접근 가능한지 궁금합니다. #### CODE <a class='btn btn-default' href='/codes/51445'>Link</a> ``` import java.util.ArrayList; public class BookTest { public static void main(String[] args) { /* 1. Book을 담기 위한 ArrayList 객체를 만드시오. */ ArrayList<Book> list = new ArrayList<>(); /* 2. Book 객체를 생성하시오. */ Book onePiece = new Book("원피스", 4500); Book naruto = new Book("나루토", 4000); Book java = new Book("자바 프로그래밍", 24000); /* 3. ArrayList 객체에 Book 객체들을 담으시오. */ list.add(onePiece); // 원피스 객체 담기 list.add(naruto); // 나루토 객체 담기 list.add(java); // 자바 객체 담기 /* 4. 리스트에 담긴 모든 책 정보 출력 */ for (int i = 0; i < list.size(); i++) { Book book = list.get(i); System.out.printf("list.get(%d) -> %s\n", i, book.toString()); } } } class Book { // 필드 private String title; private int price; // 생성자 public Book(String title, int price) { this.title = title; this.price = price; } // 메소드 public String toString() { return String.format("Book { name: %s, price: %d }", title, price); } } ``` #### INPUT ``` ``` #### OUPUT ``` list.get(0) -> Book { name: 원피스, price: 4500 } list.get(1) -> Book { name: 나루토, price: 4000 } list.get(2) -> Book { name: 자바 프로그래밍, price: 24000 } ```
private 이 적용되면 외부 접근이 불가합니다. 반대로 public은 모든 외부 접근이 가능합니다. 주어진 Book의 toString() 메소드는 public 이므로, 누구나 사용할 수 있습니다. 따라서 BookTest 클래스는 이를 호출할 수 있는데, toString() 메소드는 Book 클래스에 존재하므로, private 필드인 name과 price에 접근할 수 있습니다.
그렇다면 굳이 Book의 필드인 title과 price를 Private으로 해주는 이유가 있나요?
게터와 세터는 private 필드의 정보 은닉과 이를 해소하는 public을 통한 우회 접근 개념을 설명하기 위한 기본 개념입니다. 도어락에 비유해볼까요? 도어락을 설치해도 비밀번호를 누군가 알게되면, 무용지물입니다. 하지만 그래도 설치하는 이유는 어느 정도 선의 예방기능이 있기 때문인데요. private 선언과 public을 통한 게터/세터도 이와 같습니다. 아무나 막 사용할 수 있는 것과, 정해진 방법을 통해 사용하는 것에는 큰 차이가 있죠. private을 통한 정보은닉. 이는 방어적 프로그래밍과 협업의 관점에서 정말 중요한 개념인데요. 외부의 임의 접근으로 문제를 몇번 겪어 보면 아, private..! 하고 느낌이 오실겁니다. 워낙 추상적인 내용이라 잘 전달이 되었는지 모르겠네요. PS. 실무에서는 세터의 사용은 권장되지 않으며, 게터 또한 최소화 하는 것이 좋습니다. 더 궁금한 점이 있다면 "자바 정보은닉 세터 지양하기" 정도로 구글링해보세요.
친절한 답변 정말 감사합니다!! 많은 도움이 되었습니다!! : )