2013년 8월 29일 목요일

[5주차 5일] 요구사항 식별

1) Actor 식별(Primary Actor)

Actor(Primary Actor)
: 시스템을 이용하는 사람이나 프로세스

ex> 은행시스템이라면 PrimaryActor는 은행원, 고객, ATM, Timer 등등이 있다

Supplementary Actor(Secondary Actor)
: 시스템에 의해 이용당하는 다름 시스템



2) Use-case 식별

: Actor가 시스템을 사용해서 달성하려는 업무목표(사용용도)


Use-case 크기
: 2주 ~ 6주 내에 개발이 가능한 범위

* 체크리스트
i) 업무의 시작과 끝이 명확(카운트가 가능)
ii) 한사람이 한순간에 한장소에서 수행하는 작업
iii) 업무여야 한다.

* Use-case 통합
i) Usecase 관리를 용이하게 하기 위해 통합
ex> C, R, U, D    ===>   xxxx관리
ii) Use-case 간 서고 관련 있는 작업을 통합
ex> 주문, 장바구니, 결제    ===>   xxxx관리




3) Use-case 명세서 작성

i) Use-case 명
ii) Actoer
iii) Pre-Condition
   : Use-case를 시작하기 위한 사전 시스템 상태
iv) Post-Condition
   : Use-case를 종료한 후 시스템 상태, 종료조건
v) 기본 시나리오
   :  Actor와 시스템간의 눈에 보이는 대화, 오류상황을 가정하지 않는다.
vi)  예외시나리오
   : 오류발생의 시나리오



# 시스템이 다루는 Data 관리









2013년 8월 28일 수요일

[5주차 4일] getAttribute() 하고 형변환 하는 이유

[5주차 4일] ServletContextListener 와 ServletContext

Listener

: 어떤 이벤트가 발생 했을 때 알림을 받는 객체



ServletContextLIstener

: Web Application이 시작되거나 종료될때 알림을 받는 Listener
  ServletContext가 Listener에게 시작과 종료를 알려주는 호출 규칙이다.

ContextInitialize()
: 웹 어플리케이션이 시작 될 때 호출됨.

ContextDestroy()
: 웹 어플리케이션이 종료 될 때 호출됨.


만드는 방법
1) ServletContextListener implements 하고 구현

2) web.xml 에 Listener 등록



* web.xml에 등록해야지만 listener가 작동 한다.


[5주차 4일] 객체 공유 방법

: 사용할 객체를 공유

1) Servlet Context
: web app. 시작 부터 종료 할 때 까지 보관

2) Http Session
: 로그인 부터 로그아웃 할 때 까지 보관

3) Http Request
: 요청부터 응답 할 때 까지 보관


[참고] 이클립스 단축키

https://docs.google.com/file/d/0BxtIItelHlOcdVpYZEpFV2ZQRVU/edit?usp=sharing

[5주차 4일] Design Patter - Command Pattern

: 향후 지속적인 기능추가가 발생할 가능성이 높을 때 기능을 객체화 시키는 방법.
  method   ==>  class

* 기능이 추가 될 때 가능은 코드수정이 적은것이 유지보수 측면에서 좋다.

* 모든 커멘드는 메서드 이름이 같다.

[5주차 4일] Design Pattern - Singleton Pattern

: 인스턴스를 한개만 생성해야하는 경우 사용하는 설계기법
  해당 객체를 static으로 선언하고 getInstance()라는 메서드를 통해서 해당 객체를 생성 후 리턴 한다.
ex> java.util.Calendar


DBConnectionPool 을 예로 들어 보자.
ex>
public class DBConnectionPool {
String dburl;
String id;
String pwd;
String driverClass;

ArrayList<Connection> list = new ArrayList<Connection>();

static DBConnectionPool instance;;

public static DBConnectionPool getInstance() {
if (instance == null) {
DBConnectionPool instance = new DBConnectionPool(
"jdbc:mysql://localhost/test", 
"test", 
"test", 
System.getProperty("driverClass"));
}
return instance;
}

private DBConnectionPool(
String dburl, String id, String pwd, String driverClass) {
this.dburl = dburl;
this.id = id;
this.pwd = pwd;
this.driverClass = driverClass;
}
}

[참고] 정규식 표현 replace()와 replaceAll()의 차이

String의 replace() 메서드와 replaceAll()메서드의 차이는
replace()를 인자값을 일반 문자열이고,
reaplaceAll()은 정규식 표현 String이다.

정규식 표현은 일반 문자열과는 다르게 문자열을 찾거나 할때 적합한 표현이다.
공부를 좀 해봐야 할 부분이라고 생각되고, 너무 어렵다..ㅠㅠ

참고 블로그
http://j07051.tistory.com/554
http://radiocom.kunsan.ac.kr/lecture/unix_cmd/regexp.html
http://nkdk.tistory.com/entry/%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D-%EC%A0%95%EB%A6%AC

연습 사이트
http://gskinner.com/RegExr/

2013년 8월 27일 화요일

[참고] Java41기 블로그

강윤원http://ywkang1.blogspot.kr/
고유한http://rhdbgks1019.blogspot.kr/
공경식http://kskong87.blogspot.kr/
김상헌http://burufactory.blogspot.kr/
김영화http://younghwakim.blogspot.kr/
김태경http://ktk08.blogspot.kr/
박유진http://hiyoujin890.blogspot.kr/
박재원http://pjw8898.blogspot.kr/
박준혁http://joonjava.blogspot.kr/
박치하http://pch3232.blogspot.kr/
박혜경http://hyekyungpark.blogspot.kr/
손창철http://sccacademy.blogspot.kr/
송재우http://songjaewoo.blogspot.kr/
안성헌http://ansunghun.blogspot.kr/
오다환http://dahwan0h.blogspot.kr/
유남석http://dbskatjr.blogspot.kr/
유승연http://seungyeon2.blogspot.kr/
이영균http://mclycos.blogspot.kr/
이용준http://yjleedev.blogspot.kr/
이지우http://moebiusjw.blogspot.kr/
이진세http://ljsmr88.blogspot.kr/
임재완http://imjaewan.blogspot.kr/
장종혁http://jonghyeok.blogspot.kr/
정선진http://sunjin8565.blogspot.kr/
정승호http://jhoho82.blogspot.kr/
정재우http://jaewoojungjava.blogspot.kr/
허승희http://sseunghee.blogspot.kr/

[5주차 3일] proxy

무료인 Fiddler2
유료인 Charles

[5주차 3일] 주석

Java 주석

라인주석
: 한 줄만 주석처리 할 때 사용

- 형식
// 내용


멀티라인 주석
: 여러 줄을 주석처리 할 때 사용

- 형식
/* 내용
 * 내용
 */

JavaDoc 주석
: javadoc.exe로 API 문서를 만들 때 사용하는 주석

- 형식
/** 내용
 * 내용
 */


annotation(에노테이션)
: 컴파일러나 JVM에게 전달하는 주석
- 형식
@애노테이션이름(값) 

[5주차 3일] Tomcat에서 Charset 변환

: Servlet의 Charset은 UTF-16이고, Tomcat의 Charset은 MS949라서 영어 이외의 문자는 제대로 주고 받을수 없어서 Charset을 맞춰 줘야 한다.




response 시 Charset 변환

출력 스트림을 얻기 전에 변환할 문자집합을 설정한다.

UTF-8로 변환
response.setContentType("text/plain;charset=UTF-8")

ex>
response.setContentType("text/plain;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("테스트!!!");

* response.setContentType()메서드는 response.getWriter() 전에 수행해야 한다.


request 시 Charset 변환

POST 방식과 GET 방식 처리가 다르므로 주의하자.

POST 일때 변환
: 클라이언트가 보낸 데이터를 읽기 전에 문자 집합을 설정.
  request.setCharacterEncoding("UTF-8")

ex>
request.setCharacterEncoding("UTF-8");
System.out.println(request.getParameter("name"));

* request.setCharacterEncoding()메서드는 request.geParameter() 전에 수행해야 한다.


GET 일때 변환(Tomcat 인 경우):
: server.xml 파일의 <Connection> 태그에 속성값 설정.
  <Connector ....  URIEncoding="UTF-8" />

ex>
<Connector connectionTimeout="20000" port="9999" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

* 서버마다 GET방식 일 때 처리방법이 다르므로 문서를 참조해서 처리하자.




[5주차 2일] Servlet

: javax.servlet.Servlet 인터페이스구현해서 만들수 있고,
  Servlet의 집합이 Web Application이다.
  Server + Application + let = Servlet


Servlet 인터페이스

- init() : 서블릿 생성시
- service() : 요청시
- destroy() : web app. 종료시
- getServletConfig(): 관리메뉴 이용시
- getServletInfo() : 관리메뉴 이용시



Servlet 등록

: Servlet을 사용하려면 web.xml에 등록되어야 한다.

1) 서블릿 선언
ex>
  <servlet>
    <servlet-name>hello ok</servlet-name>
    <servlet-class>net.bitacademy.java41.servlets.HelloServlet</servlet-class>
  </servlet>

2) 서블릿에 URL 부여
ex>
  <servlet-mapping>
    <servlet-name>Servlet01</servlet-name>
    <url-pattern>/servlet01</url-pattern>
  </servlet-mapping>


* Servlet에 annotation주석을 추가해서 web.xml에 설정해주는것을 대신할수 있다.
@WebServlet("메핑버플릿이름")

ex>
@WebServlet("/member")

GenericServlet 클래스

: javax.servlet.GenericServlet 은 service()를 제외4개의 메서드를 구현한 추상클래스이다.

ex>
public class TestServlet extends GenericServlet {
@Override
public void service(ServletRequest resqust, ServletResponse response)
throws ServletException, IOException {
}
}
위의 예제에서 처럼 상속을 받아서 주로 많이 사용되는 service()메서드만 구현해 주면 된다.




Servlet의 인스턴스 생성 시점

: 클라이언트가 요청 할 때 생성되며, 한번 만들어지면 다시 만들지 않는다.

* 서버가 시작될 때 서블릿 인스턴스가 생성되는게 아니다.




2013년 8월 26일 월요일

[5주차 2일] Web Application 배치(Deployment)

Web Appication 배치(Deployment)

: Server 마다 배치 폴더가 다르다

Tomcat 폴더:
....../apache-tomcat-7.0.42
/bin
톰캣 실행 관련 파일

/conf
설정관련 파일
/lib
톰캣 java 라이브러리 관련(Tomcat은 Java로 개발됨)
/work
실행중인 임시파일 생성
/webapps
Wep Application 배치 폴더

개발이 완전히 끝난후 운영 배포하는 경우에 톰캣의 /webapps에 배포하도록 한다.



이클립스와 연동한 Web Application 배치 폴더











ex>
....\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\web01\WEB-INF\classes


* eclipse로 작업되 실제 파일은 \workspace\.metadata\.plugins\org.eclipse.wst.server.core\ 아래 있다는 것을 알아 두도록 하자.

eclipse가 버그가 있어서 변경된 것이 바로바로 적용이 안되는 경우가 종종 있다.
그럴때 실제 파일이 있는 위치로 가서 직접 확인해 보도록 하자.

[5주차 2일] Web Browser의 요청URL

-형식
프로토콜://서버주소:포트번호/리소스

서버주소
- IP Adress
- 호스트 + 도메인

ex>
192.168. 0. 0
www.google.com 
(www-호스트, google.com-도메일)


포트번호
: 생략하면 80번

리소스
: Application 또는 정적파일(HTML, gif ... )

* 관리를 쉽게 하기 위해서 파일path 형태를 사용



localhost(127.0.0.1)

: 현재PC(자기자신)

[5주차 2일] Tomcat 세팅

Tomcat 7.0.42 다운로드


http://tomcat.apache.org/download-70.cgi




이클립스 서버세팅

Tomcat 7버전으로 서버추가








[5주차 2일] Servlet Container

: 규칙정의 Java EE Spec.

- Servlet / JSP
- EJB(분산컴퓨팅)
- Web Server
- Web Socket
- DB Connection
- Resource 사용 & 관리


* 구현체의 버전보다 해당 구현체가 JAVA EE의 어떤 버전을 구현 했는지가 중요하다.

[5주차 2일] Web Application

HTTP Application

: Web Server(Http Server)Web Browser(Http Client) 통신하는 Applicatoin.





Web 발전

1. 문서 전송

2. 간단한 Application(게시판, 방명록)

* CGI(Common Gateway INterface)
: Web ServerWeb Application 사이에 Data를 주고 받는 규칙


* Web Application 아키텍처



3. Web을 Application의 플랫폼화
PC App  ===>  WebApp  전환
- 장소 구애없이 Web Browser만 있으면 업무 처리 가능.

* 복잡한 Application을 구현하기 위해서 HTML발전

* 문서형식만 지원하던 HTMLUI제어나 서버통신도 지원하게됨
    HTML-문서구조, UI구조
    CSS-UI
   Javascript-UI제어, 서버통신




Java Web Application Architecture




[5주차 2일] HTML(HyperText Markup Language)

역사

: CERN에서 연구 논문 공유로 FTP를 사용하는데 불편함을 느끼고 팀버너스리의 제안으로 만들게 되었다.



HTTP(HyperText Transfer Protocol)

: 문서를 주고 받는 규칙



Connectionful(Stateful)

: Client와 Server가 계속 연결되어 있는 방식.

- 요청자의 정보를 알 수 있음
- 응답속도가 빠름
- 적은 클라이언트만 처리 할 수 있음

ex> FTP, telnet, catting, 온라인게임 등등...



Connectionless(Stateless)

: Client의 요청에 대한 Server의 응답이 끝나면 연결도 끊는 방식.

- 많은 클라이언트의 요청처리 가능
- 매 요청마다 연결해야 함.
- 응답속도 느림

ex> HTML, 메세지 등등..







[참고] gitHub 사용법 참고 블로그


GIT과 Github 안내
http://blog.hjf.pe.kr/37

Windows용 Git Client(mysql: Git for Windows, TorloriseGit) 설치
http://blog.hjf.pe.kr/34

Github와 로컬 환경 변수
http://blog.hjf.pe.kr/38


TortoiseGit을 이용해 Github에 저장소 생성 및 데이터 올리기
http://blog.hjf.pe.kr/57


git에서 파일 무시하기(ignore pattern)
http://blog.hjf.pe.kr/45



[5주차 1일] Thread 3 - synchronized(동기화)

2013년 8월 21일 수요일

[4주차 4일] ServerSocket 과 Socket

[4주차 4일] 시스템 아키텍처의 발전사

[4주차 3일] instance of 와 getClass()

클래스나 인스턴스를 비교 할때 instance ofgetClass()를 이용해서 비교하는 경우가 종종 있는데 이때 둘의 차이를 알아 보자.

instance of

: Type비교 연산자로 인스턴스의 형태가 포함되어 있으면 true를 리턴한다.



getClass()

: 로딩된 클래스 주소값을 리턴한다.
(클래스 로딩은 한번만 이루어진다.)



instan of 와 getClass()의 차이

예제를 통해서 자세히 알아보자.
아래와 같은 상황이라고 가정해보자.

인터페이스 X 와 Y가 있고,
클래스 A가 있고,
클래스 B는 클래스 A 를 상속 받고 인터페이스 A를 구현했고,
클래스 C는 클래스 B 를 상속 받고 인터페이스 B를 구현했다.



interface X {}
interface Y {}
class A {}
class B extends A implements X {}
class C extends B implements Y {}


이때

ex>
B p = new B();
if (p instanceof A)
System.out.println("p instanceof A");
if (p instanceof B) 
System.out.println("p instanceof B");
if (p instanceof C)
System.out.println("p instanceof C");
if (p instanceof X)
System.out.println("p instanceof X");
if (p instanceof Y)
System.out.println("p instanceof Y");


위의 결과로
p instanceof A
p instanceof B
p instanceof X
출력되는 것을 확인 할수 있다.
이 말은 instance of상속을 받거나 구현을 해서 해당 객체의 형태가 있으면 true를 리턴한다는 것인다.


ex>
B p = new C();
if (p instanceof A)
System.out.println("p instanceof A");
if (p instanceof B) 
System.out.println("p instanceof B");
if (p instanceof C)
System.out.println("p instanceof C");
if (p instanceof X)
System.out.println("p instanceof X");
if (p instanceof Y)
System.out.println("p instanceof Y");

위의 결과로
p instanceof A
p instanceof B
p instanceof C
p instanceof X
p instanceof Y
모두 출력되는 것을 확인 할수 있다.
이 말은 B클래스로 타입으로 선언이 되어 있지만 실제로는 C클래스 객체가 들어가 있기 때문에 C클래스가 포함하는 Y인터페이스, C클래스도 instance of 의 결과가 true인 것이다.


ex>
B p1 = new B();
B p2 = new B();
if (p1.getClass() == p2.getClass()) {
System.out.println("p1.getClass() == p2.getClass()");
}

위의 결과는
p1.getClass() == p2.getClass() 이 출력되는 것을 확인할수 있다.
이것은 인스턴스는 다른 인스턴스이지만, getClass()는 로딩된 클래스의 주소를 가져오는 메서드 이고, 실제 로딩된 클래스는 같은 클래스이기 때문에 p1.getClass() == p2.getClass() 의 결과는 true를 리턴하는 것이다.


ex>
B p1 = new B();
B p2 = new C();
if (p1.getClass() == p2.getClass()) {
System.out.println("p1.getClass() == p2.getClass()");
}

위의 결과는 아무것도 출력되지 않는다.
이것은 B로 선언된 변수에 실제로 담겨있는 클래스가 B와 C로 다르기 때문에 클래스로딩 또한 다른 클래스가 로딩되었기때문에 p1.getClass() == p2.getClass() 는 false를 리턴하는 것이다.

[4주차 3일] equals, toString

equals()

: Object로 부터 상속받은 메서드로 주소가 같은지를 비교한다.
그러나 String같은 클래스나 DTO(VO)같은 클래스에서는 값비교로 사용하기 위해 Overring해서 값비교 용도로 많이 사용된다.

ex>
String s1 = new String("Hello");
String s2 = new String("Hello");

if (s1.equals(s2)) {
System.out.println("s1.equals(s2)");
}

위 예제의 결과는
s1.equals(s2) 가 출력되고 String은 equals()를 Override해서 값비교 용도로 사용한다는것을 알수 있다.


ex>
class Member {
String name;
int age;

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Member other = (Member) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}

public Class Test {
public static void Main(String[] args) {
Member m1 = new Member();
m1.name = "홍길동";
m1.age = 20;

Member m2 = new Member();
m2.name = "홍길동";
m2.age = 20;

if ( m1.equals(m2) ) {
System.out.println("m1.equals(m2)");
}
}
}

위 예제 결과는
m1.equals(m2) 출력되는 것을 확인 할 수 있을 것이다.
Member 클래스에서 equals() 를 Override하지 않았다면 m1과 m2가 다른 인스턴스이기 때문에 아무런 결과도 출력되지 않았겠지만, 위 예제에서는 Member클래스를 Override를 해줬기 때문에 값비교를 통해 m1과 m2가 같다는 결과를 출력 하수 있다.


* DTO(Value Object) 는 값들만 들어 있기 때문에 일반적으로 equals()를 재정의 해서 사용하는 경우가 많다.




toString()

: Object로 부터 상속받은 메서드로 "클래스명@인스턴스고유값"을 리턴한다.
그렇지만, 재정의 해주게 되면 원하는 값을 출력 할수도 있다.

ex>
StringBuffer buf = new StringBuffer("Hello, ");
buf.append(" World!");

System.out.println(buf);

위 예제에서는
Hello, World! 가 출력되는 것을 확인 할 수 있다.
StringBuffer 클래스는 appeand()한 값을 출력하도록 toString()을 재정의 한 경우다.

ex>
class Member {
String name;
int age;

@Override
public String toString() {
return "[" + name + "," + age + "]";
}
}

public Class Test {
public static void Main(String[] args) {
Member m1 = new Member();
m1.name = "홍길동";
m1.age = 20;

System.out.println(m1);
}
}

위 예제 결과는
[홍길동,20] 이 출력되는 것을 확인 할 수 있다.
Member 클래스에서 toString()을 재정의 하지 않았다면, "클래스명@인스턴스주소값" 이 출력 됬을것인데, 위 예제에서는 Member 클래스를 재정의 했기 때문에 재정의한 원하는 형식으로 출력이 된 것이다.



[4주차 3일] String 과 StringBuffer

String

: Immutable 객체

ex>
String ss = "12";
ss = ss + "34";
ss = ss + "56";

위의 코드를 실행하게 되면
처음에 "12"의 주소를 ss에 담고,
"12" + "34"를 수행한 결과인 새로운주소값을 ss에 담고,
"1234" + "56"을 수행한 결과인 새로운주소값을 ss에 담게 된다.

이 말은 String은 문자열을 더할때마다 결과를 위해 새로운 주소값을 할당 한다는 것이고, 이전에 쓰던 주소는 가비지가 된다는 것이다.



StringBuffer

: Mutable 객체

ex>
StringBuffer buf = new StringBuffer();
buf.append("12");
buf.append("34");
buf.append("56");

위의 코드를 실행하게 되면
StringBuffer에 append()를 하게되면 "12", "34", "56"의 각각의 주소를 StringBuffer에 저장해 놓는 개념이기 때문에 String을 더할때 처럼 중간 결과를 위한 가비지는 생성되지 않는다.



String과 StringBuffer의 사용에 주의할점

String은 값을 비교하기 위해서 equals()를 재정의 해서 사용하지만,
StringBufferequals()를 재정의 하지 않았기 때문에 기존 equals()의 원래 기능인 주소값을 비교한다.

ex>
String s1 = new String("Hello");
String s2 = new String("Hello");
if (s1.equals(s2)) {
System.out.println("s1.equals(s2)");
}

StringBuffer buf1 = new StringBuffer("Hello");
StringBuffer buf2 = new StringBuffer("Hello");
if (buf1 .equals(buf2 )) {
System.out.println("buf1 .equals(buf2)");
}

위의 결과를 살펴보면
s1.equals(s2)출력되지만
buf1 .equals(buf2)출력되지 않는다.



* java 1.5(?) 1.6(?) 이후 부터는 String의 개선을 통해서 String과 StringBuffer의 큰 차이가 없다고 하지만, 그래도 많은 String을 한꺼번에 처리 할때는 StringBuffer를 쓰도록 하자.










2013년 8월 20일 화요일

[4주차 2일] MVC Architecure

: Model View Control (Entity Boundary Control)

- View(Boundary)
: UI처리

- Control
UI처리

- Model(Entity)
UI처리


- 표현










* Desktop App



* Web App

2013년 8월 19일 월요일

[4주차 2일] Connection을 DBConnectionPool 로 관리

: DBConntion을 Flyweight Pattern을 이용해서 Pooling방식으로 관리
==> Conntion을 재사용하므로 성능을 향상 시킬 수 있다.


[4주차 2일] Design Pattern - Flyweight Pattern

: 자주 사용되는 객체 또는 객체 생성시 시간이 오래걸리는 객체공유해서 사용하는 방식.
==> Garbage생성을 줄이고, 실행속도 향상


[참고] 소스분석 Tip

- 분석하고자 하는 메소드의 전체적인 흐름을 파악하는데 집중하자.

- 분석도중 메서드를 호출한다면, 일일이 해당 메서드로 들어가서 확인을 하지 말아라.
   (호출하는 메서드의 열할 정도만 알고 넘어가자!)

- 메소드 단위로 끊어서 무슨열할을 하는지만 파악하고 전체적인 흐름을 파악해라!

- 전체적인 흐름을 파악한 후에 세부 메소드를 확인하자.


* 전체적인 흐름 파악없이 세부 메서드를 들어가서 확인하면, 방향을 잃고 분석 또한 되지 않는다.

[4주차 2일] DAO 분리

- 이유
: 재사용성을 높이고, 유지보수의 효율을 증가시키기 위함.



RedApp: 입.출력
Member: DTO(VO)
MemberDao: DMBS 접속 및 쿼리


* DAO(Data Access Object): 데이터 접근 객체

[4주차 2일] interface의 사용

Interface의 상속과 구현

아래의 그림과 같이 AImp클래스는 A인터페이스를 구현하고,
B인터페이스는 A인터페이스를 상속받고,
BImp클래스는 B인터페이스를 구현하고, 
X클래스는 B인터페이스를 구현했다고 가정하자.

이때 아래의 코드가 가능한지 확인해 보자.

A a = new A();       ==> 불가능  : 인터페이스는 new로 객체생성 못함.
A a = new B();       ==> 불가능  : 인터페이스는 new로 객체생성 못함.
A a = new AImp();  ==> 가능
A a = new BImp();  ==> 가능

B b = new BImp();  ==> 가능
B b = new AImp();  ==> 불가능  : AImp클래스는 B에서 지정한 기능을 구현 안함.

* X와BImp클래스A와 B인터페이스의 기능을 모두 구현해야 한다.







Interface로 기능제한과 개발의 자유

: 리턴타입을 Interface로 하는 경우 구현 메서드에서는 해당 메서드를 구현한 클래스를 사용하므로 다양한 기능을 사용할 수 있어서 개발이 자류롭고, 리턴받은 쪽에서는 불필요한 기능의 사용을 제한하므로 오사용을 막을수 있다.

아래의 그램에서 보면
X클래스는 A, B, C 인터페이스를 구현상 상황이다.

이때,

A a  = new X();   ==> A의 메서드만 사용가능
B a  = new X();   ==> B의 메서드만 사용가능
C a  = new X();   ==> C의 메서드만 사용가능
X a  = new X();   ==> X의 메서드 모두 사용가능


* 현업에서는 특별한 경우가 아니고서 리스트의 리턴타입 Collection 또는 List로 한다.




[4주차 2일] Generic

- 파라미터나 변수의 타입을 정의하지 않는다.
- 사용하는 시점에 선언한다.


ex>
ArrayList<String> list = new ArrayLIst<String>();

위의 문장에서 <>안의 String 표현이 Generic이다.

[참고] Eclipse 에서 SVN 수정된 파일 표시하기

날짜, 수정한 사람정보 표시

1. Window / Preferences / Team / SVN / Label Decorations
2. Text Decorations 탭
3. Format 에 File, Folder 에  {date} {author} 를 추가해준다. 옆에 ... 버튼을 눌러서 쉽게 추가할 수 있다.



수정된 파일 표시 (문자 변경)

1. Window / Preferences / Team / SVN / Label Decorations
2. Text Decorations 탭
3. Outgoing flag 원하는 것으로 변경
    (▶ 이런 것으로 하면 눈에 확 띈다)




수정된 파일 표시 (배경색 변경)

1. Window / Preferences / General / Appearance / Colors and Fonts
2. SVN 아래
3. Outgoing Change (Background) 원하는 컬러로 변경



[4주차 1일] Design Pattern - Factory Pattern

: 객체 생성이 복잡한 경우 특정 메서드를 통해 얻는 방식이다.

예제를 보면서 확인해 보자.

ex>
public class KimbopTest {

public static void main(String[] args) {
step1();
step2();
step3();
}

private static void step3() {
KimbopNara store = KimbopNaraBuilder.build(15, "종로구");
Kimbop k = store.create();
}

private static void step2() {
KimbopNara factory = new KimbopNara(20, "07:00 ~ 24:00", "강남구");
Kimbop k = factory.create();
}

private static void step1() {
SpecialBop bop = new SpecialBop();
bop.bop = "밥";
bop.chamgirum = "해표참기름";
bop.sokum = "천일염 + 맛소금";

Kimbop k = new Kimbop();
k.bop = bop;
k.danggun = "용인당근";
k.danmuju = "서울단무지";
k.egg = "자연란";
k.ham = "밀가루 + 돼지고기 + 수입생선(명태)";
k.kim = "남해김";
k.oi = "남산오이";
k.sikumchi = "포항시금치";
}
}

- step1() 호출

: 직접 밥을 하고, 김밥에 들어갈 여러가지 재료들을 준비하고 김밥을 만드는 상황이다. 모든것을 혼자서 다 해야 한다.


- step2() 호출

: 김밥을 먹기위해 김밥나라 점포의 수용인원과 영업시간, 위치를 확인하고 김밥나라로 가서 김밥을 만들어 달라고 하면 김밥을 준다.


- step3() 호출

: 김밥을 먹기위해서 김밥나라를 가려고 했는데 김밥나라가 없어서 김밥나라를 만들어서 그 김밥나라로 부터 김밥을 받을 수 있다.



[4주차 1일] Statement 와 PreparedStatement 의 차이


2013년 8월 18일 일요일

[4주차 1일] JDBC로 MySQL연결

일단 MySQL 서버가 동작 중이어야 한다.

0. MySQL 서버에 연결 할 도구 준비

 - JDBC Driver 클래스 중( .jar 파일에 들어있는 클래스들 중에서) java.sql.Driver 인터페이스를 구현한 클래스를 먼저 로딩한다.
 - 이 클래스가 java.sql.Connection 인터페이스를 구현한 클래스를 알고 있다.

* DBMS에 종속 되지 않기 위해서 VM arguments를 추가해서 DBMS에 종속적인 프로그램이 되지 않도록 하는 것이 좋다.
 (Run Configurations > Arguments > -D키=값)

ex>
//Run Configurations > Arguments > -DdriverClass=com.mysql.jdbc.Driver
String driverClass = System.getProperty("driverClass");
Class.forName(driverClass);



1. 서버와 연결

- DriverManager가 내부적으로 DBMS에 맞는 적절한 Driver를 연결 시켜주고, 그 객체는 뭔지 모르지만 해당 Driver에서 Connection객체를 리턴해 준다.

ex>
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/test", "test", "test");



2. SQL문 보낼 도구 얻기

- craeteStatement() 또는 preparedStatement() 를 호출하여 SQL문을 서버에 보낼 도구를 얻는다.

ex>
// Statement
Statement stmt = con.createStatement();
// PreparedStatement
PreparedStatement stmt = con.prepareStatement("select * from MEMBERS");

* Statement를 얻을 때는 SQL문이 필요 없고, PreparedStatement를 얻을 때는 SQL문이 필요 하다.



3. SQL문 서버에 보냄

executeQuery() 또는 executeUpdate() 는 서버에 SQL문을 보낸다.
- 서버는 결과를 준비한다.
executeQuery() 또는 executeUpdate() 는 서버에서 결과를 가져올 도구를 리턴한다. 
(착각하기 쉬우니까 꼭! 염두해 두자!!!! next()를 호출해야지 결과를 가져오는 것이다.)

* executeQuery(): select 할 때 사용.
* executeUpdate(): insert, update, delete 할 때 사용.

ex>
// executeQuery
ResultSet rs = stmt.executeQuery("select MNAME, PHONE, EMAIL from MEMBERS order by MNAME");
// executeUpdate
int count = stmt.executeUpdate("insert into MEMBERS(MNAME) values ('홍길동')");




4. 서버의 결과를 가져와서 출력

- next()를 호출하여 서버로부터 레코드의 결과를 가져온다.

ex>
while( rs.next() ) {
System.out.print(rs.getString("MNAME") + ",");
System.out.print(rs.getString("PHONE") + ",");
System.out.println(rs.getString("EMAIL"));
}


2013년 8월 14일 수요일

[참고] 추천도서



프로그램 교양

조엘 온 소프트웨어 조엘 스폴스키 저















코딩 호러의 이펙티브 프로그래밍 제프 앳우드















UML 관련

Applying UML And Patterns  LARMANCRAIG 저












SQL 관련

NEW SQL& PL/SQL  주종면 




빌게이츠 @ 생각의 속도



스티브잡스




[3주차 3일] 인터페이스(Interface)

: 사용 객체와 사용당하는 객체 사이의 호출 규칙
  (자동차 ==> [타이어] <== 한국타이어, 금호타이어 등등 )

ex>
  어뎁터패턴을 적용한 Car를 좀더 세련된 모양세로 Tire의 규칙을 정해보도록 하자.

#해결
: Tire클래스를 인터페이스로 변경하고,  각각의 타이어에 Tire인터페이스를 implements 시켜주면 된다.

public interface Tire {
/*public*/ /*abstract*/ String getMaker();
public abstract double getRadius();

}


한발더 나가 간다면 HankookTire와 KumhoTire는 공통 점이 많으므로 BaseTire를 생성해서 일반화(Gerneralization)을 시켜주면 더욱 좋다.


abstract public class BaseTire implements Tire {
protected String maker;
protected double radius;

public String getMaker() {
return maker;
}

public double getRadius() {
return radius;
}

}



* 인터페이스의 메서드는 단지 규칙으로 역할을 하기 때문에 구현하지 않는다.
   => 인터페이스의 모든 메서드는 추상메서드 이다.
   => abstract 생략가능

* 규칙은 반드시 공개되어야 하기 때문에, public이다.
   => public 은 생략가능

[3주차 3일] Design Pattern - Adapter Pattern

: 기존에 작성된 클래스를 새로운 규칙에 맞추어 사용하고자 할 때 사용하는 설계 기법

ex>
 Car클래스 자동차를 잘 타고 다니다가 뒷바퀴만 TitaniumWheel을 상속 받은 NexenTire를 장착하고 싶어 졌다. 그런데 NexenTire는 이미 TitaniumWheel을 상속 받은 상황이라서 Tire를 또 상속 받을 수 없는 상황이다.


#해결
: Tire를 상속 받은 NexenTireAdaper 를 생성하여 NexenTire대신 Car에 장착해 주면 된다.

public class NexenTireAdapter extends Tire {
NexenTire tire = new NexenTire();

@Override
public String getMaker() {
return tire.getCompany();
}

@Override
public double getRadius() {
return tire.getDiameter() / 2;
}
}