- 1. 잘 설계된 클래스
(1) PDT (기본 자료형)
(2) UDDT (사용자 정의 자료형) - 2. 배열과 클래스
(1) 클래스(class)
(2) 배열(array)
(2) 객체 배열(object array)
1. 잘 설계된 클래스
잘 설계된 클래스는 정보은닉이 잘 되어있다.
Before
1 2 3 4 5 6 7 8 9 | public class BookVO { public String title; public int price; public String company; public int page; // public BookVO { // super(); // 생략된 기본생성자 // } { | cs |
이 코드는 객체 생성에 사용했던 코드이다.
객체 생성의 주 목적은 당연히 값을 담기 위해서인데
현업에서는 이렇게도 쓰기도 하지만
사실 보통은 정보은닉을 위해 public보다 private를 많이 쓴다.
저렇게 class를 만들 경우 너무 쉽게 해당 객체에 다가갈 수 있다는 문제가 있기 때문이다.
그러면 잘못된 데이터가 들어가도 그대로 사용될 수가 있다.
BookVO m = new BookVO(); m.title = "자바의 정석" |
이렇게 new 생성자로 객체를 만들어서 바로 값을 저장할 수 있다. title은 언제든지 변경할 수 있다는 정보의 취약점을 가지고 잇다. 접근이 쉬우면 정보를 쉽게 보호할 수 없으므로 보통 멤버 변수를 private하게 만든다. (이전 강의에서 class 생성자 자체를 private으로 정하는 것과 멤버 변수를 private로 정하는 것은 다른 얘기임. 헷갈리지 말자. class 생성자를 private하게 만드는 것은 객체를 생성할 때의 이야기고 이건 설계 단계의 이야기)
After
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class BookVO { private String title; private int price; public BookVO() {} public BookVO(String title, int price) {
this.title = title;
this.price = price;
} 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; } @override public String toString() { return "BookVO [title=" + title + ", price=" + price + "]""; } { |
private String title;
private int price;
=> 정보를 은닉하기 위해 private으로 객체의 상태를 보호한다.
public BookVO() {}
=> 디폴트 생성자 메서드를 명시적으로 만든다. 처음에 생성되는 부분이지만 밑에서 멤버변수를 초기화하는 메서드를 만들었기 때문에 자동으로 생성되지 않는다. 이 부분이 없으면 다른 클래스에서 객체를 생성할때 BookVO = m = new BookVO();에서 BookVO(); 부분은 에러가 난다.
public BookVO(String title, int price) { this.title = title; this.price = price; }
=> 이름은 같고 들어오는 값이 다른 오버로딩 생성자 메서드를 통해 title, price를 초기화한다. BookVO = m = new BookVO("자바의 정석", 20000); 이런식으로 활용한다. 이 경우는 setter method는 굳이 필요없다고 볼 수 있다. * 오버로딩 : 같은 이름의 메서드를 여러 개 가지면서 매개변수의 유형과 개수를 다르게 한다. 오버로딩 기법은 여러 개를 만들어도 속도는 떨어지지 않는다.
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; } => private 멤버 변수는 직접 접근이 어렵기 때문에 이렇게 setter와 getter로 멤버 변수에 접근한다. setter method는 외부에서 데이터를 받아서 멤버변수에 넣어주는 역할. getter method는 데이터를 사용한다. 즉, 간접 접근 방식을 지향한다.
@override public String toString() { return "BookVO [title=" + title + ", price=" + price + "]""; }
=> toString 메서드는 디버깅하기 쉽도록 넣는 부분으로
title, price등등 을 일일히 쓰지 않고도 해당 내용을
하나의 문자열 형태로 만들어서 리턴한다.
이렇게 설계하면 '잘' 설계한 class에 가까워진다.
2. 배열과 클래스
둘 다 데이터를 담는 바구니이며 객체라고 볼 수 있다. 그러나 어떤 데이터인지에 따라 사용방법이 나뉘어진다.
(1) 클래스(class) 클래스는 서로 다른 데이터를 넣을 수 있는 구조이다. 즉, BookVO안에 String title, int price, String company, int page가 들어있는 것처럼 여러개의 데이터 타입을 담을 수 있을 때 사용한다.
(2) 배열(array) 배열은 동일한 데이터 구조를 갖는다. int[] arr = new int[5]를 만들었을 때 arr[0], arr[1], arr[2], arr[3], arr[4] 여기에는 오직 정수 5개만 담을 수 있는다.
설명이 어려워서 일단 그림으로 설명
MovieVO를 만든 경우
public class MovieVO {
private String title;
private String author;
}
대략 이런 구조가 나오게 되는데, 객체를 배열로 만든다는건
MovieVO를 여러개 만든다는 의미이다.
MovieVO vo = new movieVO();
vo.title = "히든 피겨스"
vo.author = "멜피"
우리가 보통 사용하던 객체가 이런 식이라면
MovieVO[] vo = new movieVO[3];
이런 객체배열의 구조는
vo[0]에도 MovieVO가 들어가고, vo[1], vo[2]에도 MovieVO라는 하나의 객체가 들어간다.
결국 vo[0]은 title="히든 피겨스", author="연기자1"
vo[1]은 title="레이디스 나잇", author="연기자2" 으로 한 세트씩 담는다고 생각하면 된다.
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA] Java TPC 강의 정리 (PART 2) - 추상클래스/인터페이스 (0) | 2020.09.20 |
---|---|
[JAVA] Java TPC 강의 정리 (PART 2) - 다형성 (0) | 2020.09.19 |
[JAVA] Java TPC 강의 정리 (PART 2) - 상속 (0) | 2020.09.18 |
[JAVA] Java TPC 강의 정리 (PART 1) - 객체 생성의 과정 (0) | 2020.09.16 |
[JAVA] Java TPC 강의 정리 (PART 1) - JVM (0) | 2020.09.15 |