프로그래밍을 어떻게 만드는가?(설계부분)
이전에 사용했던 Calculator 예제는 Template pattern
추상: 상속을 강제 <-> final: 상속/변경 금지하는 규제
class Calculator{
static final double PI=3.14;
int left,right;
public void setOprands(int left,int right){
this.left=left;
this.right=right;
//Calculator.PI=6;
}
public void sum(){
System.out.println(this.left+this.right);
}
public void avg(){
System.out.println((this.left+this.right)/2);
}
}
public class CalculatorDemo1{
public
}
static final doubl PI=3.14;
: PI는 변하지 않는 값이여서 final을 지정함
주석처리된 부분을 실행해보면 error 발생함.(final을 지정했기 때문에)
class A{
final void b(){}
}
class B extends A{
void b(){}
}
A class의 b메소드는 final로 지정되어있기 때문에 overriding
불가해서 error가 발생함
final class C{
final void b(){}
}
clss D extends c{}
final로 class C를 지정했기 때문에 상속 불가함
abstract
final
과 같은 대표적인 규제인 interface
어떤 객체가 있고 그 객체가 특정한 인터페이스를 사용한다면 반드시 인터페이스의 메소드들을 구현해야함
interface I{
public void z();
}
class A implements I{
public void z(){}
}
class A
는 interface I
를 구현함
클래스 A는 인터페이스 I를 구현한다라고 함
class CalculatorDummy{
public void setOprands(int first, int second,int third){}
public int sum(){
return 60;
}
public int avg(){
return 20;
}
}
public class CalculatorConsumer{
public static void main(String[] args){
CalculatorDummy c = new CalculatorDummy();
c.setOprands(10,20,30);
System.out.println(c.sum()+c.avg);
}
}
여기서 클래스 CalculatorDummy
는 가짜 클래스임
사용자는 계산기라는 클래스가 필요하지만 계산기 클래스가 완성되려면 3개월의 시간이 필요함
사용하는 입장에서는 계산기 클래스가 완성될거라고 기대하고 모조 클래스를 생성하고 나머지 로직을 완성하게 됨
3개월 뒤 코드를 받아보니 문제가 발생
기대했던 매개변수의 갯수와 실제 메소드의 매개변수 갯수가 달라지게 됨
class Calculator{
int left,right;
public void setOprands(int left,int right){
this.left=left;
this.right=right;
}
public void sum(){
System.out.println(this.left+this.right);
}
public void avg(){
System.out.println((this.left+this.right)/2);
}
}
(잘못된 커뮤니케이션으로 error가 발생)
계산기를 사용하는 개발자A
계산기를 개발하는 개발자B
아래의 형식으로 인터페이스를 구성하게 됨
public interface Calculatorble{
public void setOprands(int first,int second,int third);
public int sum();
public int avg();
}
개발자 A
class CalculatorDummy implements Calculatable{
public void setOprands(int first,int second,int third){
}
public int sum(){
return 60;
}
public int avg(){
return 20;
}
}
public class CalculatorConsumer{
public static void main(String[] args){
CalculatorDummy c = new CalculatorDummy();
c.setOprands(10,20,30);
System.out.println(c.sum()+c.avg());
}
}
해당 인터페이스를 생성하고 나머지 기능을 개발하게됨
개발자 B
class Calculator implements Calculatable{
int first,second,third;
public void setOprands(int first,int second,int third){
this.first=first;
this.second=second;
this.third=third;
}
public int sum(){
return this.first+this.second+this.third;
}
public int avg(){
return (this.first+this.second+this.third)/2;
}
}
인터페이스 구성대로 개발자는 계산기를 개발하면 됨
계산시 개발을 완성한 이후 인계를 받은 개발자A 는 CalculatorDummy c = new Calculator()
로 실행해주면 정상적으로 실행됨
인터페이스는 명세서라고 생각하면 될 것 같다
멤버 서비스에서 사용하는 MemoryMemberRepository
테스트 케이스에서 사용하는 MemoryMemberRepository
서로 다른 리포지토리(인스턴스)이기 때문에 다른 내용물이 될 수 있는 우려가 있음
그래서 외부에서 객체를 받아서 넣어줌
지금까지
멤버 서비스
리포지토리
멤버 객체
서비스를 통해 멤버를 가입 할 수 있고 리포지토리에 저장됨
리포지토리에서 꺼내올 수 있고
테스트케이스
이제 화면에 붙이고 싶음 --> 컨트롤러랑 뷰템플릿이 필요함
DI 의존관계를 넣어줌