이하 구디아카데미 김지훈 강사님의 수업자료와 강의 내용 정리, 실습한 내용을 정리함!
JSP 를 거쳐서 다시 돌아온 JAVA!
디자인 패턴
디자인 패턴의 정의
- 설계 문제에 대한 해답을 문서화하기 위해 고안된 방법
- 소프트웨어 개발 과정에서 자주 나타나는 과제를 해결하기 위한 방법
- 패턴은 특정한 상황에서 구조적인 문제를 해결하는 방식을 설명해 준다.
패턴 사용 시 주의 사항
- 디자인 패턴은 일반적으로 대규모 프로그램 개발에 적합하다.
- 각 디자인 패턴이 유용한 상황에 대해 잘 알아야 한다.
- 패턴은 절대적이지 않다.(상황에 맞게 유연하게 변형이 가능하다.)
MVC 패턴(Model2)
- MVC Pattern 은 Model View Controller의 약자로 애플리케이션을 세 가지의 역할로 구분한다.
- 각 파트는 자신이 맡은 역할을 수행한다.
JSP 와 MVC 의 비교
Basic MVC Patten
- 기본적인 MVC 구조로 jsp 와 Java 를 분리해 보자
- 우선 View(jsp) 에서 보내는 내용을 Controller(java) 에서 받을 수 있는 기능이 필요하다.
- Jsp 에서 하던 서버의 기능을 이제 JAVA 에서 해야 한다.
- 그런 기능을 만들기 위해서는 많은 코드가 필요하다.
상속(inherit)
- JAVA 에서는 다른 소스를 가져다 쓰기 위한 두 가지 방법이 있다.
- 객체화(instance) 와 상속(inherit) 이다.
- 상속은 부모의 것을 내 것처럼 사용하는 개념이다.
- 상속은 OOP 4대 특징 중 하나이다.
- 상속을 하는 이유는 다음과 같다.
설치 과정
- 입력 창에 HttpServler 입력
- 알트+쉬프트+S
-
상속을 위해서는 extends 라는 키워드를 사용 한다.
-
HttpServlet 을 상속받는 MainController 클래스를 만들어 보자
-
MainController
-
퍼블릭 클래스인 MainController 는 HttpServlet을 상속한다.
-
alt+shift+S -> Override/Implement method - > goGet, doPost 메서드 override
-
doGet 메서드 실행 시 "GET 방식 요청" 시스템에 출력
-
doPost 메서드 실행 시 "POST 방식 요청" 시스템에 출력
-
부모님이 상속해 주겠다는 것만 받을 수 있는 것처럼 부모클래스에서 private 접근 제한자를 갖는 멤버는 상속이 불가능하다.
-
java 에서 상속은 상속받을 class 를 선택한다.
-
Java 에서는 c++ 과 달리 다중 상속을 허용하지 않는다.
-
class 는 분류의 의미를 가지고 있기 때문에 두 분류를 동시에 가질 수 없다.
요약
- 부모 클래스를 상속하면 부모의 기능을 자식이 사용할 수 있다.
- 상속을 통해 누군가가 만들어 놓은 기능을 상속해서 내 것처럼 쓸 수 있다.
- 상속받을 경우 extends 키워드를 사용한다.
- 상속은 한 번에 한 클래스만 받을 수 있다.
객체화로도 남의 기능을 쓸 수 있는데 상속과의 차이는 무엇인가?
- index(view 영역 출력)
- calc 에 내용 전송하는 폼 생성/매서드는 포스트 타입
- text 입력할 수 있는 란 생성/호출 이름은 su1
- 선택할 수 있는 입력 란 생성/ 호출 이름은 oper
- text 입력할 수 있는 란 생성/호출 이름은 su2
- 계산이라고 쓰인 버튼 생성
- clacController(요청 확인 및 지시)
- /calc 입니다.
- 퍼블릭 클래스 calccontroller 는 HttpServlet를 상속받는다.
- post 요청이 와서 doPost 메서드 동작함
- su1의 값을 받아와서 su1 변수 선언
- su2의 값을 받아와서 su2 변수 선언
- oper의 값을 받아와서 oper 변수 선언
- Calculator 한테 일을 시키고 객체화해서 cal에 받아온다.
- cal의 메서드는 su1, su2, oper를 매개변수로 받아와서 int 값 result를 뱉는다.
- su1/oper/su2=result를 시스템에 출력한다.
-
Operator~4(calculator 를 수행하기 위해 필요한 연산자 클래스)
-
Operator 는 Operator2 를 상속받고 Operator2 는 Operator3을 상속받고 Operator3 은 Operator4 를 상속받음 = Operator 에는 2~4의 내용이 모두 들어 있음
-
int a 와 int b 를 plus/minus/multi/devide 한 값을 리턴
-
calculation(Operator 를 가져와서 Controller 의 지시를 수행하는 model)
- int calculation 은 매개변수 su1, su2, oper 를 받아 아래 본체를 실행한다.
- int a 변수에 su1 담음 / int b 변수에 su2 담음 / int 값을 받을 result 변수 선언
- Operator 클래스를 객체화 해서 op 에 담음
- 객체화 했을 때는 Operator~4 각 클래스를 모두 객체화해서 사용해야 합
- 상속받았을 때는 최종 상속받은 Operator 만 받아오면 각 메서드 수행 가능
- oper 실행 시 + value 가 "+" 일 때 op 클래스의 plus 매서드 값을 뱉음 / 이하 각 연산 반복
Override
- 부모의 메서드의 기능이 마음에 들지 않거나 아쉬운 경우가 있다.
- Java 에서도 부모로부터 물려받은 method 를 튜닝할 수 있다.
- 우리는 그것을 Override 라고 한다.
오버로드 : 과적
오버라이드 : 상속받은 것에 올라타거나 튜닝하는 것
- 둘의 가장 큰 차이점은 상속관계이냐 아니냐의 차이이다.
- 오버라이드는 상속관계에서만 일어난다.
- index(veiw 영역)
- ./car 에 입력한 내용을 보내는 폼 생성/ 매서드는 get
- 선택창 생성 / 호출 이름은 action
- 선택 종류는 start(시동 건다) / run(달린다) / stop(멈춘다) / test(정비한다)
- 실행 버튼
- msg 출력
1. 퍼블릭 클래스 MyCar 는 ParentCar를 상속받는다.
2. 주석처리된 부분 : run 메서드는 "시속 150km 로 달린다." 를 뱉음.
3. 블린 변수 turbo 는 false
4. run 메서드 실행 > 만약 turbo 가 false 와 같으면 부모 메서드 run 을 그대로 실행하고 아니면 "시속 200km 로 달린다" 뱉음
1. 퍼블릭 클래스 ParentCar는 아래 메서드 실행
2. start 메서드는 "시동이 걸린다." 뱉음
3. run 메서드는 "시속 50km 로 달린다." 뱉음
4. stop 메서드는 "멈춘다" 뱉음
5. 자식 클래스에서 수정이 불가능한 test 메서드는 "자체 점검 실행..." 뱉음
- MainController(view 에서 요청을 받아 model 에 전달)
- /car 입니다.
- 퍼블릭 클래스 Maincontroller 는 HttpServlet 을 상속받는다.
- doGet 메서드 실행
- "action"의 값을 가져와서 action 변수에 넣는다.
- 시스템에 action 출력
- MyCar 클래스를 객체화해서 car 에 담는다.
- 오는 문자열을 result 변수에 넣는다.
- action 이 스위치 될 때 아래 케이스별 실행
- start 호출 시 car 클래스의 start 메서드 값을 result 에 담는다.
- run 호출 시 car 클래스의 turbo 가 true 면 car 클래스의 run 메서드 값을 result 에 담는다.
- stop 호출 시 car 클래스의 stop 메서드 값을 result 에 담는다.
- test 호출 시 car 클래스의 test 메서드 값을 result 에 담는다.
- result를 시스템에 출력
- 보낼 값을를 세팅한다. msg 속성에 result 값을 담는다.
- index.jsp에 값을 보낸다. dis 에?
RequestDispatcher 란 현재 request에 담긴 정보를 저장하고 있다가 그 다음 페이지 그 다음 페이지에도 해당 정보를 볼수있게 계속 저장하는 기능.
- req 값과 resp 값을 dis(index.jsp) 로 전송한다.
요약
- 상속을 받으면 내 것처럼 사용할 수 있다.
- 즉 부모 기능을 사용하기 위해 부모를 객체화하지 않아도 된다.
- 상속받은 메서드를 내 마음대로 바꿔 쓸 수 있다.(override)
- 단 읽기 전용인 final 키워드가 있는 메서드는 불가능하다.
추상화
- 추상화(Abstract)는 OOP 의 4대 특징 중 하나이다.
- Encapsulation : 다른 사용자에게 데이터 입/출력을 제한한다.
- Inheritance : 나에게 없는 기능을 부모에게 받아서 내 것처럼 쓴다.
- Abstraction : ?
- Polymorphism : ?
- 추상은 실체 간에 공통되는 특성을 추출하고 불필요한 정보를 제거해 단순화시키는 것이다.
- 추상클래스는 추상 메서드로 꼭 구현해야 하는 메서드 등의 규격을 만들 수 있다.
- 실체 클래스(concrete class) 는 추상 클래스(abstract class) 를 상속한다.
- 추상화 class 및 method 를 선언하기 위해서는 abstract 라는 키워드를 붙여야 한다.
- 둘은 상속 관계이기 때문에 추상화 클래스의 기능을 실체 클래스에서 사용 할 수 있다.
- 추상 메서드(abstract method) 를 통해 꼭 구현할 메서드를 override 할 수 있다.
추상 클래스
- 추상 클래스를 상속받으려면 규격이 필요하다(ex.HttpServlet 에서의 doGet, doPost)
- 예시와 같이 해당 클래스를 사용하기 위해 반드시 필요한 부분을 추상 클래스에서 규격화한다.
추상 메서드
- abstract method 는 형태만 있고, 그 몸체는 없는 메서드를 말한다.
- abstract method 는 특정한 메서드를 강제로 override 해야 할 경우 설정해 준다.
- ex. RPG 게임에서 클래스 추가 시
- 모든 클래스(직업)은 스킬 사용, 아이템 사용 기능이 필수로 있어야 한다.
- Jump 기능은 클래스별로 차이가 없다.
- 모든 클래스는 skill() 과 useItem() 은 반드시 구현해야만 하는 상황이다.
- 이때 abstract method 를 활용하면 override 를 통해 만들어야 할 기능을 강제할 수 있다.
- StandardModel(추상 클래스)
- 퍼블릭 추상 클래스 StandardModel 은 아래 메서드를 실행한다.
- jump 메서드는 job을 매개변수로 써서 job+가 점프한다 고 뱉는다.(실행문이 있는 일반 메서드)
- skill 메서드는 매개변수가 job인 추상 메서드(실행문 없음)
- useItem 메서드는 매개변수가 job 인 추상 메서드(실행문 없음)
요약
- 추상화는 공통되는 특징을 추출하여 단순화 시키는 작업이다.
- 추상 클래스는 abstract 키워드를 사용한다.
- 추상 클래스는 자식 이외에는 객체화시킬 수 없다.
- 추상 클래스를 상속받으면 추상 메서드를 강제로 overide 하게 된다.
- 이 과정을 통해 꼭 필요한 메서드를 만들어 규격화 시킬 수 있다.
글 재미있게 봤습니다.