편집 : 나는이 질문을하는 프로그래밍을 배우는 많은 사람들이 있기 때문에이 질문에 대답했으며, 대부분의 답변은 매우 기술적으로 유능하지만 초보자라면 이해하기 쉽지 않습니다. 우리는 모두 초보자 였기 때문에 좀 더 친숙한 답변을 시도 할 것이라고 생각했습니다.
두 가지 주요한 것은 다형성과 검증입니다. 바보 같은 데이터 구조 일지라도.
이 간단한 클래스가 있다고 가정 해 봅시다.
public class Bottle {
public int amountOfWaterMl;
public int capacityMl;
}
액체의 양과 용량 (밀리리터)을 담는 매우 간단한 클래스입니다.
내가 할 때 어떻게됩니까?
Bottle bot = new Bottle();
bot.amountOfWaterMl = 1500;
bot.capacityMl = 1000;
글쎄, 당신은 그 일을 기대하지 않을 것입니다. 당신은 어떤 종류의 위생 검사를 원합니다. 그리고 더 이상 최대 용량을 지정하지 않으면 어떻게됩니까? 오, 문제가 있습니다.
그러나 또 다른 문제가 있습니다. 병이 단지 한 유형의 용기라면? 용량과 액체가 채워진 용기가 여러 개인 경우 어떻게해야합니까? 인터페이스를 만들 수 있다면 나머지 프로그램에서 해당 인터페이스를 받아 들일 수 있으며 병, jerrycans 및 모든 종류의 것들이 상호 교환 적으로 작동합니다. 더 나아지지 않을까요? 인터페이스는 메소드를 요구하기 때문에 이것도 좋습니다.
우리는 다음과 같은 결과를 얻었습니다.
public interface LiquidContainer {
public int getAmountMl();
public void setAmountMl(int amountMl);
public int getCapacityMl();
}
큰! 이제 병을 다음과 같이 변경합니다.
public class Bottle extends LiquidContainer {
private int capacityMl;
private int amountFilledMl;
public Bottle(int capacityMl, int amountFilledMl) {
this.capacityMl = capacityMl;
this.amountFilledMl = amountFilledMl;
checkNotOverFlow();
}
public int getAmountMl() {
return amountFilledMl;
}
public void setAmountMl(int amountMl) {
this.amountFilled = amountMl;
checkNotOverFlow();
}
public int getCapacityMl() {
return capacityMl;
}
private void checkNotOverFlow() {
if(amountOfWaterMl > capacityMl) {
throw new BottleOverflowException();
}
}
나는 BottleOverflowException의 정의를 독자에게 연습으로 남겨 둘 것이다.
이제 이것이 훨씬 더 강력하다는 것을 알 수 있습니다. 이제 Bottle 대신 LiquidContainer를 수락하면 코드에서 모든 유형의 컨테이너를 처리 할 수 있습니다. 이 병이 이런 종류의 물건을 다루는 방법은 모두 다를 수 있습니다. 상태가 변경 될 때 디스크에 상태를 기록하는 병이나 SQL 데이터베이스 또는 GNU에 저장된 병이 다른 것을 알고있을 수 있습니다.
그리고이 모든 것들은 다양한 솜씨를 다루는 다른 방법을 가질 수 있습니다. 병은 방금 확인하고 넘치면 RuntimeException을 발생시킵니다. 그러나 그것은 잘못된 일일 수 있습니다. (오류 처리에 관한 유용한 토론이 있지만 여기서는 매우 간단하게 설명하고 있습니다. 의견을 가진 사람들은이 단순한 접근 방식의 결함을 지적 할 것입니다.;))
그리고 그렇습니다. 우리는 매우 간단한 아이디어에서 훨씬 더 나은 답변을 빨리 얻는 것처럼 보입니다.
병의 용량은 변경할 수 없습니다. 이제 돌로 설정되었습니다. 최종 선언하여 int 로이 작업을 수행 할 수 있습니다. 그러나 이것이 목록 인 경우 목록을 비우고 새 항목을 추가하는 등의 작업을 수행 할 수 있습니다. 내부를 만지는 것에 대한 액세스를 제한 할 수 없습니다.
모든 사람이 해결하지 않은 세 번째 사항도 있습니다. getter 및 setter는 메소드 호출을 사용합니다. 즉, 다른 곳에서는 일반적인 방법처럼 보입니다. DTO 및 물건에 대해 이상한 특정 구문을 사용하는 대신 모든 곳에서 동일한 내용을 갖습니다.