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의 서브 클래스의 인스턴스를 가리킬 수 있다.













































2013년 8월 6일 화요일

13.08.07

RedApp 프로젝트.











ArrayList 

- ArrayList 는 Vector 클래스와 비슷한 기능을 가진 동적 배열이다.

ArrayList 객체생성

ArrayList<Member> list = new ArrayList<Member>();
- < > 안에 보통 객체를 넣어준다.

ArrayList 메서드

객체명.add() - 추가하는것.
객체명.get() - 값을 가져온다.

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

Member.Class
















Value Object = Data Transfer Object 를 만든다.

- 여러 속성의 값을 관련된 것 끼리 하나로 묶어서 다루는 클래스

- 예) Member, Project, Task



RedApp.class

add() 메소드.



29 Memeber m = new Memeber(); - 인스턴스 m을 만든다.

32 Memeber 클래스에 있는 setName 값에 이름을 할당한다.

47 .toLowerCase() - 대문자를 소문자로 만들어준다. 즉 Y를 입력해도 y로 입력받는다.
48. m.setRegDate(new Date()); - 현재 날짜 받는다.

49. list.add(m); - ArrayList<Member> 배열에 Member.class를 추가 시킨다.












2013년 8월 5일 월요일

13.08.06

GIT

Repository - 공유되는 프로젝트를 보관하는 폴더.

sub version 과 다른점.
- git 는 Repository 전부를 체크아웃한다.

Git Repositories 사용하기.
































이클립스 Window - Show View 에서 Git - Git Repositories 를 선택.
오른쪽 그림과 같은 창 뜨면 Clone a Git repository 선택


















Next 클릭
























URI 와 Host , Repository path 에 경로는 적도 Next.
Import all existing projects after clone finishes 체크 후 Finish












완료하면 위와 같이 Git Repositories 창에 폴더가 생긴다.

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

형변환 (Type Conversion)

연산은 같은 Data 형 끼리만 가능하다. 
즉, int는 int끼리, float은 float 끼리, boolean은 boolean끼리만 가능하다.
 - 연산의 결과는 당연히 연산한 값과 같은 데이터 형이 된다. 즉, int 와 int의 연산 결과값은 int가 된다.
 - 서로 다른 Data 형 끼리의 연산시, 연산이 가능하도록 Data 형을 서로 같게 변환시켜줘야 한다. 이것을 "형변환"이라 한다.


형변환의 종류


1)암시적 형변환(implicit type conversion)
- 연산시 자동으로 형변환이 이루어 지는 것을 말한다.
- 암시적인 형변환의 법칙
byte
short > int > long > float > double
char

2)명시적 형변환(explicit type conversion)
- 프로그래머에 의해서 형변환이 이루어지는 것을 말함
- Cast Operator 를 사용하여 명시적 형변환을 한다.
  (데이터형)식;


Post-fix 연산자, Pre-fix 연산자

Post-fix(전위 연산자)

      int a = 10;
      int s = 0;
      s = a++;

1) s = a++; 에서 ++ 은 후위 연산자 이므로 먼저, a++ 자리에 a의 값이 놓이고,
   그 다음에 a++ 이 수행된다. 즉, s = 10; 인채로 있다. 아직 연산이 완료.
   되지 않았기 때문에 할당문은 수행되지 않음.
2) a = a + 1을 수행. (a = 11)
3) s = 10; 에서 할당문이 수행. 즉, s = 10 할당.

Pre-fix(후위 연산자) 

      int a = 10;
      int s = 0;
      s = ++a;

 1) s = ++a; 에서 ++ 은 전위 연산자 이므로, a = a + 1 수행. (a = 11)
 2) s = a;  수행. 즉, s = 11; 과 같다.

논리 연산자(Logical Operator)

-AND : Operand 둘다 true 일때만 연산 결과가 true 가 됨.
           a && b (만약 a가 false 이면 b는 따져보지도 않고 결과값 false를 내 놓는다)
           a & b (a 가 false 일지라도, b 까지 따져보고 결과를 내 놓는다)
- OR : 두개의 Operand중 하나라도 true이면 결과는 true가 된다)
          a || b (a 가 true이면 b는 따져 보지도 않고 결과값 true를 내 놓는다)
          a | b (a 가 true일지라도 b 까지 따져보고 결과를 내 놓는다)
- NOT : Operand가 true이면 false, false이면 true가 된다.
            !a (a 의 값이  true -> false 바뀌고, false -> true)
         

&&, || 앞부분을 검사하고 결과가 나오면 뒷부분은 검사를 하지 않는다.

&, |   앞부분과 뒷부분을 검사를 둘다 한다.

비트 연산은 이미지 처리 필터에 많이 사용된다.


할당 연산자(Assignment Operator)

배정연산자
 - 값을 변수에 할당할 때 쓰는 연산자
a = 10;
       10 이라는 값을 변수 a에 할당한다.

 - 그밖의 할당 연산자
연산자    예 의미
  +=       a += b       a = a + b;
 *=       a *= b       a = a * b;
>>=     a >>= b     a = a >> b;
 -=, /=, %=, &=, |=, ^=, >>=, >>>=, <<= 가 있다.


흐름 제어문 : 조건문 - if

흐름 제어문 
- 명령어의 실행 순서를 제어하기 위한 용도로 사용된다.
- 종류
  조건문 : if... else, switch 
  반복문 : do... while, while, for
  분기문 : break
 - 조건문 : if 
 1) if (조건식) 
문장;

   '조건식' 이 true인 경우 '문장'을 수행한다.

  2) if (조건식) 
  문장1;
   else
  문장2;
    
   '조건식' 이 true라면 '문장1'을 수행하고, false라면 '문장2'를 수행한다.

ex)
    int a = 5;
         if( a > 4)
        System.out.println("a > 4 입니다.");
System.out.println("종료합니다!"); 

에서는 블록을 묶지 않았으므로, System.out.println("종료합니다!") 문장은 실행됨.


ex)
     int a = 4;
if (a > 0)
System.out.println("a > 0 입니다.");
else 
                if (a < 0)
System.out.println("a < 0 입니다.");
else if (a == 0)
System.out.println("a == 0 입니다.");
else
System.out.println("허~~~ 0도, 음수도, 양수도 아닌수가 있나요?");

먼저 if 문장을 실행하고, 해당사항이 없으면 아래 else 문을 실행한다. 계속 반복.
(else if 는 묶여 있는것이 아니다.)


흐름 제어문 : 조건문 - switch

 - 조건문 : switch 
switch(식) {
case 상수식1: 문장1
break;
case 상수식2: 문장2
  break;
case 상수식3: 문장3
  break;
default: 문장0
}

 '식'의 결과값이 '상수식1' 이면 '문장1'을 수행하고 'break'문은 switch문을 빠져나간다.
 '식'의 결과값이 '상수식2' 이면 '문장2'을 수행하고 'break'문은 switch문을 빠져나간다.
 '식'의 결과값이 '상수식3' 이면 '문장3'을 수행하고 'break'문은 switch문을 빠져나간다.
 만약, '식'의 결과값에 해당하는 경우가 없다면 'default:' 의 '문장0' 를 실행한다.

  - '식' 과 '상수식' 에는 int 형 값만 올 수 있다.

만약, break; 가 없다면, break; 를 만날 때 까지 아랫문장까지 실행한다. 


반복문 - do... while, while


1) do ... while
do {
        문장1
        }while(조건식);

일단 '문장1'을 수행후 '조건식'의 값이 true이면 계속 do { } 문을 반복하여 수행한다.


 2) while
while(조건식) {
  문장1
  }

'조건식'의 값이 참일때만 while문의 { } 문을 수행한다.
즉, do... while 문은 1 이상을 반복하고, while 문은 0 이상을 반복한다.


흐름 제어문 : 반복문 - for


for
- 보통 어떤 인덱스 값을 사용하여 반복처리를 할 때 유용.

for(초기화 문장; 조건식; 증가문)
문장1
초기화 문장 - 보통 인덱스 값을 초기화 시키는 문장이 온다.
조건식 - true 이면 for문의 { } 문장을 수행하고, false 이면 for 문을 빠져나간다.
증가문 - 보통 인덱스 값을 증가시키는 문장이 온다.




































Garbage Collector
- 메모리 부족시 동작
- idle time
  메모리 해제 전에 해당 인스턴스에 대해 finalize() 호출.


문자열 표현

String s1 = new String("홍길동");

홍길동 char[], heap에 만들어짐. s1이라는 변수에 시작주소를 할당.


상수 문자열 표현

- '가' -> 내부적으로 가 라는 문자의 유니코드 값을 리턴.
- 상수 문자열은 Heap이 아닌 Constant Pool 영역에 인스턴스를 만든다.
- "홍길동" -> 내부적으로 홍길동 문자열을 가진 인스턴스를 생성.
- 상수 풀은 같은 값을 갖는 인스턴스를 만들지 않는다. -> 메모리 낭비 방지!

String s1 = "홍길동";
상수풀에 새로운 인스턴스를 만든다.

String s2 = "홍길동";
상수풀에 기존의 만들어져 있던 인스턴스의 주소를 리턴한다.


Heap에 만든 스트링을 상수풀에도 만드는 방법: intern()

String s5 = new String("홍길동");
String s6 = s5.intern();


equals() 사용

- Object에서 상속받은 메서드이다.
- 원래는 인스턴스 주소를 비교하는 메서드다.
- 하지만, String 클래스에서 값을 비교하도록 재정의(Overriding) 하였다.

Overriding - 상속받은 메서드를 해당 클래스의 역할에 맞춰서 재정의 하는것






13.08.05

하드 디스크.
























File system - file이 어떤 섹터에 저장되있는 관리하는 것이다.
format - File system을 만드는 것이다.
할당단위 크기는 보통 4096byte 로 한다.

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


CalcTest.class 실행 과정.

java.exe -classpath 경로 CalcTest.class 실행

1. method area 에서 CalcTest.class 가 로딩된다.
 - 클래스 유무 확인.
 - 클래스 변수 준비.
 - static 블록 수행.

2. stack area 에서 main(){...} 메소드 가 호출되면서. 로컬변수(args, c1, c2) 가 준비된다.

3. Calculator.class 가 method area에 로딩된다.

4. heap area 에 instance 변수 생성 (result 변수)

5. heap area, result 변수에 c1의 시작주소값 할당되면서, stack area 에 v1 변수 생성.

6. heap area 에 있는 c1의 시작 주소값이 v1에 할당 되면서 10이 저장됨.

이런식으로 반복..



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

자료형 표현
























값의 범위에서
float 의 범위는 유효자리수 6자리.
double 의 범위는 유효자리수 15자리라 표현한다.
============================================================================


ASCII(7bit) -> ISO-8859-1(8bit) -> EUC-KR(2byte) -> MS949 -> Unicode -> UTF-8

JVM(Java Virtual Machine) 은  Unicode(2)=UTF-16을 사용한다.

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