2013년 8월 18일 일요일

Design pattern: Factory Method

RedApp.class
SQL과 연동하기 위한, list(), add(), view(), update() 메소드 수정.



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

1.서버와 연결

Connection con = null;

2. SQL문을 보낼 도구를 얻기

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

Statement stmt = con.createStatement();

3. SQL 서버에 보냄

ResultSet rs = stmt.executeQuery("select MNAME,PHONE,EMAIL, "
+ "from MEMBERS order by MNAME");

- executeQuery()는 서버에 SQL문을 보낸다.
- 서버는 결과를 준비한다.
- executeQuery()는 서버에서 결과를 가져올 도구를 리턴한다.

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

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




Statement vs. PreparedStatement

*1) 소스 가독성:

SQL문이 복잡할 수록 읽기 어렵다. <==> 간결하다.

*2) 바이너리 데이터(이미지, 음악, 동영상 등) 입력:

불가(base64와 같은 형식으로 인코딩 시 가능) <==> 가능

3) 반복 수행시 속도:

매번 SQL문을 DBMS 형식에 따라 변환 속도 느리다
<==> 한번만 변환, 그리고 실행, 속도 빠르다.


add()





delete()






view()





update()







list()









2013년 8월 16일 금요일

interface

Test.ex1



Tico.class






HankookTire.class



KumhoTireClass




Tire.class




중요한 내용이 많으므로, 코드를 가지고 연습을 많이 하자.


2013년 8월 13일 화요일

SQL


desc 테이블명 

- 테이블에 대한 정보를 출력한다.






























데이터 조회

select 컬럼명, 컬럼명, ...
from 테이블명

select *
from 테이블명


















조건조회

select *
from 테이블명
where
컬럼명 연산자 값 and / or 컬럼명 연산자 값 ... 






















































연산자 : <, >, <=, >=, <>, =


데이터변경
update 테이블명 set 컬럼명=값, 컬렴명=값, ...
where 조건




like







between a and b : x >= a and x <= b 





in (값, 값, 값), not in (값, 값, 값)






















데이터 삭제

delete 
from 테이블명
where 조건

SET SQL_SAFE_UPDATES=0; 
- SAFE 모드를 해제 한다.


















=====================================================================

추상클래스

- 서브클래스들에게 공통 속성 및 기능을 상속해주기 위한 용도.


인터페이스

- 사용 객체와 사용당하는 객체 사이의 호출 규칙
- 자동차 => [타이어] <= 한국타이어, 금호타이어 등등
- 인터페이스의 메서드는 단지 규칙으로 역할을 하기 때문에 구현하지 않는다.
  - 인터페이스의 모든 메서드는 추상메서드 이다.
  - abstract 생략 가능
- 규칙은 반드시 공개 되어야 하기 때문에, public이다.
  - public 은 생략 가능




=============================================================
Java.
RedApp.class 에 MySQL 연동하기.

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

1. 서버와 연결
2. SQL문을 보낼 도구를 얻기
3. SQL문을 서버에 보냄
4. 서버에 결과를 가져와서 출력



2013년 8월 12일 월요일

13.08.13

* DBMS
- mySQL, Oracle, Ms-SQL, DB2
- Data 저장, 조회, 변경, 삭제 (관리 전문 S/W)
- Data or Data 사이의 관계 관리 (Relational - DBMS)
- File I/O free
- 효율적인 Data관리


Native API ( = Vendor API)
( .dll .dib .so ( c/c++ 함수들))
- SQL문을 DBMS 프로토콜에 맞추어 서버에 전달
- 서버에서 보낸 결과를 리턴.
































문제점
- DBMS 마다 API가 다르다.
- function 사용이 다르다.
- 따라서, DBMS 마다 프로그램을 재작성 해야 한다.
===============================================================

Open DataBase Connectivity (ODBC) API 명세 
- 모든 DBMS의 기능 수용.
ex) ODBC Driver이라 해서 프로그램 끼리 모두 호환되지는 않는다.





























































* API가 같다.
- 하나의 App만 개발하여 여러 DBMS 연결이 가능하다.

====================================================================

JDBC API 명세


* Type1 특징
- ODBC Driver를 사용한다.
- JRE에 포함되어 있다.
- 속도가 느리다.
- Excel, Access와 같은 파일기반 DBMS를 사용할 수 있다.

=====================================================================




* Type2 특징
- DBMS 회사로부터 별도 다운로드 필요하다. (JRE에 포함되지 않다.)
- Native API를 사용한다.

======================================================================






















* Type4 특징
- DBMS 회사로부터 다운로드.
- 직접 DBMS와 연결됨.
- Pure Java Driver이다.

===================================================================

* SQL 작성법?
- DDL
 Data를 저장한 틀을 정의한다.
 Table 생성 / 삭제 / 변경

- DML
 Data를 입력 / 삭제 / 변경

- DQL
 Data를 조회


My SQL

테이블 생성

- 기본키를 정의
- 기본키(Primary Key)
후보키들 중에서 DB 관리자가 사용하기로 선택한 키
이메일로 설정.
- 후보키(Alternate Key)
키들을 최소로 만든 키
ex)
이름, 전화번호
블로그
이메일
- 키(Key)
데이터를 구분하기 위한 컬럼들의 집합
ex)
이름, 전화번호
전화번호, 블로그
이름, 블로그
이름, 전화번호, 블로그
이름, 이메일, 전화번호
이메일
이름, 나이, 이메일
전화번호, 이메일
블로그




























====================================================================

* insert
- 테이블에 데이터 입력
- insert into 테이블명(컬럼명, 컬럼명 ... ) values(값, 값, ...)






























2013년 8월 11일 일요일

13.08.12

ObjectIOTest.class


- 객체를 저장 -> ObjectInputStream/ObjectOutputStream (Data process Stream)
- java.io.Serializable 인터페이스의 의미
- SerialUID 변수

* Java 에서는 보안상 인스턴스의 byte 배열화를 제한한다.

* java.io.Serializable
- 이 인터페이스를 구현한 클래스 만이 인스턴스를 바이트 배열로 자동 변환할 수 있다. (Serializable)
- 또는 바이트 배열을 인스턴스


==============================================================




private static final long serialVersionUID = 1L;

- Serialize한 데이터를 구분하기 위한 버전번호이다.
- 이것은 읽을 때 구분 용도로 사용한다.
- 선택이다. 그러나 serialize 대상 클래스라면 설정하는 것이 좋다.
- 만약, 개발자가 명시적으로 serialVersionUID를 선언하지 않는다면,
  컴파일러가 인스턴스의 타입과 변수, 개수에 의존하여 자동으로 버전번호를 생성한다.
- 순서가 달라도 변수의 개수와, 이름과 타입이 같은 버전 번호를 갖는다.



















Value Object 는 되도록이면 시리얼라이즈 하는게 낫다.


RedApp.class (save 와 open 코드)




================================================================











2013년 8월 9일 금요일

13.08.09


 상속

- 기존의 코드를 손대지 않고 기능을 확장하는 방법.
    -> 기존의 코드를 건드리지 않으면 버그가 있을 가능성이 줄어든다.
- 기존의 소스 코드가 필요 없다.


상속된 클래스 실행 순서.


1. 클래스들 로딩
- 슈퍼 클래스로부터 로딩한다.
- static 변수(=class 변수) 로딩 
- static 변수 수행

2. 인스턴스 생성
- super -> self

3. 생성자 호출
- self -> super (실행은super -> self)

=================================================================






------




BufferedReader 데코레이터

- 버퍼기능, 한 번 읽을 때 8192byte를 읽어서 char[] 배열에 저장해둔다.
- 읽을 때는 버퍼에서 읽는다. 버퍼를 모두 읽으면 다시 버퍼를 채운다.
- 라인 단위로 리턴하는 메서드가 있다.

프로젝트RedApp save 코딩








프로젝트 RedApp open 코딩



















2013년 8월 7일 수요일

13.08.08


Data Sink Stream

























Data sink stream class

- 데이터를 직접 읽고 쓰는 클래스
예) FileInputStream/FileOutputStream, FileReader/FileWriter
     ByteArrayInputStream/ByteArrayOutputStream,
     CharArrayReader/CharArrayWriter
     StringReader/StringWriter
     PopedInputStream/PopedOutputStream
     PopedReader/PopedWriter




예외처리 ( try ... catch ... finally )



예외처리 방법1
- 오류 발생 시 자신이 처리하지 않고 호출자에게 떠 넘긴다.
- 호출자에게 오류를 넘기기 위해서는 메서드 선언부에 어떤 오류를 넘길지 선언해야 한다.
 - 문법
 void method throws 떠넘길오류클래스명, 떠넘길오류클래스명, ... { 
 

 }
public static void case1()  {
System.out.println("작업 준비...");
work();
System.out.println("다른 작업...");
         }

예외처리 방법2
- try... catch 문법을 사용하여 오류를 적절히 처리하여 시스템이 멈추지 않게 한다.
- 이것이 예외처리 문법의 존재이유이다.
- 문법
try {
  ...
} catch ( 파라미터 선언 ) {
  ...
  } catch ( 파라미터 선언 ) {
...
  } ...

public static void case2() {
System.out.println("작업 준비...");
try {
work();
} catch (Error e) {
System.out.println("오류 났네요. 그래도 계속 고~~~");
}
System.out.println("다른 작업...");
}

예외처리 방법3
- 예외 발생 시 '방법2'와 같이 적절한 처리를 한다.
- 추가적으로 보고도 한다.
- 예외 발생 상황을 호출자에게 전달할 필요가 있을 때
- 문법
try {
  ...
  } catch ( 파라미터 선언 ) {
  throw 보고;
  } catch ( 파라미터 선언 ) {
  throw 보고;
  } finally {
  예외 처리 
  }
- finally 블럭은 try...catch 블럭을 탈출하기 전에 반드시 수행된다.

public static void case3() throws Error{
System.out.println("작업 준비...");
try {
work();
int a = 20;
if (a == 20)
return;
} catch (Error e) {
throw e;  // throw 명령어로 던질 수 있는 인스턴스는 오로지 
                                        Throwable 만 가능! (아래 참조)
} finally {
System.out.println("예외에 대해 일단 마무리 조치를 했습니다.");
}
System.out.println("다른 작업...");
}

throwable 클래스
- 예외 상황을 보고할 때 사용하는 클래스
- 보통 예외 상황이 발생했을 때의 정보를 담고 있다. 
- throw 명령어로 해당 객체를 호출자에게 전달한다.
- 두 타입의 자식 클래스가 있다.
1) Exception 자식 클래스
   - 애플리케이션에 작업 도중에 발생하는 오류를 표현 
   - 이런 예외를 보고 받는 호출자는 반드시 오류 처리를 해야 한다.
      만약 오류 처리를 하지 않으면, 컴파일 시 오류가 발생한다.
   - RuntimeException 
         Error와 마찬가지로 호출자에게 던졌을 때 
         오류를 잘 받는지 컴파일러가 검사하지 않는다.

2) Error 자식 클래스 
   - JVM 시스템에서 발생하는 오류를 표현 
   - 이런 예외를 보고 받는 호출자는 오류를 처리하지 않아도 컴파일 오류가 
      발생하지 않다.

======================================================

DataOutputStream
























DataOutputStream

- 필터 역할을 한다.
- 중간에서 Data를 가공하는 역할을 한다.
- 구분하는 방법
   생성자에서 다른 스트림을 요구한다면 이것은 혼자 입.출력을 할 수 없다는 뜻이기 때문        에 데이터 가공 클래스라 할 수 있다.












=======================================

다형성

다형적 변수(polymorphic variables)
- X의 참조 변수는 X의 인스턴스 및 X의 서브 클래스의 인스턴스를 가리킬 수 있다.