uri 뽑는부분
?class=useItem : parameter
08_self/common : uri
08_self/ : contextpath
전송부분
리퀘스트에다가 msg라는 이름으로 result변수값을 담는거야 그리고 dispatcher를 호출해서 index로 보내고
forward를 통해서 req와 resp를 전송하는거에요
왜 req, resp를 쓰는거임? jsp에선 내장객체로 되지만 얜 자바라서 request와 response를 받아와야함 그래서 doGet 메서드를 호출하는것
추상클래스는 자식만 객체화시킬 수 있음
추상화를 통해서 규격을 만들 수 있다 - >인터페이스와 추상화를 이용하면 모듈간의 결합도를 감소시킨다
인터페이스와 추상 클래스 차이점
인터페이스 | 추상클래스 | |
키워드 | interface | abstract |
추상메서드 | 사용가능 (기본적으로 이거 사용함) | abstract 추가시 사용가능 (추가하면 강제로 오버라이딩) |
일반 메서드 | dafault 키워드 추가시 가능 | 사용가능 |
사용개수 | 복수개의 인터페이스 구현가능 | 1개의 abstract class 상속가능 |
객체화 | 불가능( ->익명객체 활용함) | 자식 객체만 가능 |
상속 | 필요한 부분만 implements하는 모듈구조 (다중 상속 가능) |
순차적으로 extends 하는 위계구조 |
추상화 장점 (결합도)
응집도 높을수록좋고
결합도 낮을수록 좋다
결합도가 높으면 떼어냈을 때 손상이 심함
규격이 맞으면 결합도가 낮아짐 !
인터페이스와 추상화를 활용하면 규격이 만들어짐 -> 모듈의 결합도를 감소시킴 - > 분리했을 때 손상이 덜함 ex)같은 볼펜 뚜껑
활용안하면 유지보수할 때도 엄청 오래걸림, 우유 하나 바꾸려면 다 바꿔야되잖아 ->결합도가 높음 ex)사람 몸
405오류 : 허용되지 않은 메서드 -> doPost방식인데 meothod를 get으로 보내서
controller에는 post로 받겠다고 햇지만 get으로 보낼 때 뜬다
ctrl+shift+alt+l : vingsu라고 쓴 모든 자료 다 뜨고, 어디 부분인지, path 등등에 ㅐ해 다 알려줌
다형성polymorphism
같은 부모를 상속받은 클래스는 자식객체 부모와 같은 데이터 타입으로 들어갈 수 있다
장점 : 여러변수 할 필요없이 하나의 변수로만으로도 가능(ex방세아끼는것), 코드 중복 줄일 수 있다
ex1) 상속 다형성
다형성을 안했을 때
String param = req.getParameter("element");
System.out.println(param);
String msg = "";
switch (param) {
case "fire":
Fire fire = new Fire();
msg = fire.casting();
break;
case "ice":
Ice ice = new Ice();
msg=ice.casting();
break;
case "light":
Light light = new Light();
msg=light.casting();
break;
}
다형성을 했을 때
String param = req.getParameter("element");
System.out.println(param);
String msg = "";
Spell spell = null;
switch (param) {
case "fire":
spell = new Fire();
break;
case "ice":
spell = new Ice();
break;
case "light":
spell = new Light();
break;
}
msg = spell.casting();
Spell spell = null; 을 추가해줘서 모든 model들을 대체해줬음
이 spell클래스는 당연 model 패키지에 넣어줘야함
msg = spell.casting(); 결과값을 넣어준 msg 이 부분은 switch문 다 나와서 밖에다가 1번만 써줘도 됨
ex2) 구현 다형성
다형성 안했을 때
String vingsu = req.getParameter("vingsu");
System.out.println(vingsu);
String result = "";
switch (vingsu) {
case "redBean":
RedbeanVingsu rv = new RedbeanVingsu();
rv.iceFlake();
rv.milk();
rv.redBean();
rv.jelly();
result = "팥빙수가 완성되었습니다.";
break;
case "choco":
ChocoVingsu cv = new ChocoVingsu();
cv.iceFlake();
cv.milk();
cv.redBean();
cv.jelly();
cv.choco();
result = "초코빙수가 완성되었습니다.";
break;
case "cookie":
CookieVingsu ck = new CookieVingsu();
ck.iceFlake();
ck.milk();
ck.redBean();
ck.jelly();
ck.cookie();
result = "쿠키빙수가 완성되었습니다.";
break;
}
iceflake, milk, redbean 이런 부분들이 계속 반복하고 있음 이를 막기 위해 저 값들을 담은 Vingsu 인터페이스를 만들었음
그리고 그걸 각 모델들이 구현한 뒤, Vingsu vs = null로 불러오면 다형성 적용완
String vingsu = req.getParameter("vingsu");
System.out.println(vingsu);
VingsuMachine vm = new VingsuMachine(vingsu);
Vingsu vs = null;
String result = "";
switch (vingsu) {
case "팥빙수":
vs = new RedBeanVingsu();
result = vm.makeVingsu(vs);
break;
case "초코빙수":
vs = new ChocoVingsu();
result = vm.makeVingsu(vs);
break;
case "쿠키빙수":
vs = new CookieVingsu();
result = vm.makeVingsu(vs);
break;
case "과일빙수":
vs = new FruitVingsu();
result = vm.makeVingsu(vs);
break;
}
매개변수, 변수, 필드 차이점
String name = ""; //클래스안에 있는 변수 = 필드
public VingsuMachine(String name) { //여기있는 String name은 매개변수
this.name = name;
}
'Spring' 카테고리의 다른 글
국비코딩 Mar03 | promotion 시 자식객체의 특성, string 기능들, session에 저장 (0) | 2023.03.03 |
---|---|
국비코딩 Mar02 | 값이 아니라 주소가 뜰 때, mvc 패턴 흐름 정리 (0) | 2023.03.02 |
국비코딩 Feb27 | 익명객체, index-controller-model (0) | 2023.02.27 |
국비코딩 Feb24 | 추상화, 인터페이스 (0) | 2023.02.27 |
국비코딩 Feb23 | 디자인패턴, MVC, 상속 (0) | 2023.02.27 |