"Internal Table은 프로그램 내에서 정의하여 사용할 수 있는 Local Table이다."


Struture비교

# c언어에서의 구조체 선언

STRUCT s_type

{
    CHAR no[6];

    CHAR name[8];

    CHAR part[16];

};

STRUCT s_type sawon.


#ABAP에서의 구조체 선언

TYPES : BEGIN OF s_type,

NO(6) TYPE C,

NAME(8) TYPE C,

PART(16) TYPE C,

END OF s_type.

DATA sawon TYPE s_type. 

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

Structure(구조체) 배열과 Internal Table

#C언어에서의 구조체 배열 선언

STRUCT sawon

{
    char NO[6];

    char NAME[8];

    char part[16];

};

STRUCT s_type sawon[100]


#ABAP에서의 Internal Table 선언

TYPES : BEGIN OF s_type,

NO(6) TYPE C,

NAME(8) TYPE C,

PART(16) TYPE C,

END OF s_type.


TYPES t_type TYPE STANDARD TABLE OF  s_type.

DATA sawon TYPE t_type INITIAL SIZE 100.

(s_type이라는 구조체 생성-> s_type을 타입으로하는 internale table 타입 정의-> t_type을 타입으로하는 sawon 테이블 선언)

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

*C언어에서의 배열을 선언할 때 미리 크기를 지정하는 반면, Internal Table은 INITIAL SIZE 구문으로 테이블 크기만 선언할 뿐 미리 메모리에 Load하지 않는다. 따라서 APPEND구문을 사용하여 Line이 추가될 때마다 메모리에 Load 해야 한다. 이러한 측면에서 Internal Table을 동적인 구조체 배열이라고 정의.

*Internal Table은 항상 할당과 추가구문이 쌍으로 움직여야 함.

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

[Internal Table 생성]

: 구조체 타입을 정의한 후 그 타입을 참고하여 생성하는 것이 일반적

# Local Table Type : 프로그램 내에서 Local Table Type을 생성하여, Internal Table 생성 시 참고

# lmplicit Table Type : ABAP Dictionary Table을 참고하여 Internal Table을 생성

# Global Table Type : ABAP Dictionary Table Type을 참고하여 Internal Table을 생성

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

[Internal Table의 라인 Type]

#Line Type

#Key

: Internal Table의 Row를 구분. Standard, User-defined Key 두 가지의 테이블 키가 존재.

: 키값은 Unique, Non-unique 하게 정의(Unique Key를 가지는 경우 중복된 값을 APPEND 할 수 없다.)

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

[Table Type]

Table 종류

#Standard Table

: 순차적인 인덱스를 가지는 테이블.

: Index를 이용하여 테이블 Entry를 찾을 때 가장 바람직한 테이블 구조.

: 키는 항상 Non-unique로 선언하여야 한다.


#Sorted Table

: Index 테이블

: 항상 정렬된 테이블

: Unique / Non-unique를 반드시 명시


#Hashed Table

: Index (x)

: hash 값으로 계산된 Key 값으로만 탐색

: 반드시 Unique하게 선언되어야 한다.

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

[Header Line]

= Work Area.

= Internal Table 선언 시 WITH HEADER LINE 구문을 추가하면 생성

= Internal Table을 LOOP 처리하면서 개별 Line이 Header Line으로 옮겨 가는 과정.


#헤더라인을 선언한 경우

ex) LOOP AT itab

WRITE : ITAB-RCEPNO.

    ENDLOOP.

ex) READ TABLE itab INDEX 2 // 2번째 라인이 헤더 라인으로 올라옴

#헤더라인을 선언하지 않은경우

ex)LOOP AT itab INTO work_area.

WRITE : work_area-carrid.

   ENDLOOP.

ex) READ TABLE itab INDEX 2 INTO work_area // 정보를 옮긴후 사용

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

ex) 헤더 라인이 존재하는 Internal Table 예제

REPORT Z07_001.


//line구조체생성

TYPES : BEGIN OF line,

col1 TYPE I,

col2 TYPE I,

END OF line.


//line구조체를 타입으로하는 HASHED TABLE itab 선언 ( 유니크 키는 col1, 헤더라인 사용)

DATA itab TYPE HASHED TABLE OF line WITH UNIQUE KEY col1 WITH HEADER LINE.


//4번의 반복 col1(index번호) col2(index번호의 제곱) , itab에 삽입

DO 4 TIMES.

itab-col1 = sy-index.

itab-col2 = sy-index ** 2.

INSERT Table itab.

ENDDO.


//col1변수가 2인 라인을 읽음

itab-col1 = 2.

READ TABLE itab FROM itab.


//col2변수를 100으로 수정

itab-col2 = 100.

MODIFY TABLE itab.


//col1변수가 4인 라인은 지움

itab-col1 = 4.

DELETE TABLE itab.


//루프를 돌려 출력

LOOP AT itab.

WRITE : / itab-col1, itab-col2.

ENDLOOP.

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

ex) Header Line을 사용하지 않는 경우 예제

REORT Z07_005.


TYPES : BEGIN OF line,

col1 TYPE I,

col2 TYPE I,

END OF  line,


DATA itab TYPE HASHED TABLE OF line WIHT UNIQUE KEY col1.

//Work Area 생성

DATA wa LIKE LINE OF itab.


DO 4 TIMES.

wa-col1 = sy-index.

wa-col2 = sy-index ** 2.

INSERT wa INTO TABLE itab. // Work Area에 삽입하고 itab으로 옮김

ENDDO.


wa-col1 = 2.

READ TABLE itab FROM wa INTO wa. // itab에 wa으로 col1변수가 2인것을 wa로 옮겨 읽음


wa-col2 = 100.

MODIFY TABLE itab FROM wa. // wa로부터 itab을 col2변수를 변경


wa-col1 = 4.

DELETE TABLE itab FROM wa. // wa로부터 col4인 것을 table에서 찾아 삭제


LOOP AT itab INTO wa.

WRITE : / wa-col1, wa-col2.

ENDLOOP



|구조화된 언어 SQL

DBMS는 데이터와 관계된 모든 일련의 작업들을 처리하며, 특히 데이터의 조회, 저장, 삭제와 같은 작업을 SQL(Structured Query Language)을 통해 처리

일반적인 프로그래밍 언어들은 절차적 언어의 특징을 갖고 있지만 SQL은 절차적 언어처럼 처리과정을 일일이 기술할 필요가 없다.


|SQL특징

1. 배우고 사용하기 쉬운 언어

2. 절차적언어가 아닌 선언적 언어이기 때문에 세부적인 과정을 신경쓰지않아도됨

3. DBMS의 종류에 얽매이지 않고 사용


[ SQL의 그 역할에 따라 크게 DML과 DDL 두 가지로 구분된다.]

- DML(데이터 조작어) : 데이터를 추출, 저장, 삭제 등 데이터를 조작

- DDL(데이터 정의어) : 데이터가 저장되는 테이블이나 각종 객체들을 생성하는 역할


|데이터 조작하기(DML)

기본 패턴

- 데이터 조회 : SELECT

- 데이터 삭제 : DELETE

- 데이터의 저장 : INSERT(신규 데이터 입력)

UPDATE(기존 데이터 수정)



1. SELECT 문

[기본패턴]

SELECT  컬럼1, 컬럼2, ......         //선택하고자 하는 컬럼 이름

 FROM  테이블1, 테이블2, ......   //선택하고자 하는 테이블 명

WHERE  조건들;                    //조건식(생략가능) 


EX) 2006년 이후에 입사한 직원들 이름 조회

SELECT last_name, first_name

 FROM employees

WHERE hire_data >= '2006-01-01';

// 직원(employees)테이블에서 2006/1/1일 이후에 입사한 조건을 가진 직원의 이름(last_name, first_name)을 추출


2. INSERT 문

[기본패턴1]

INSERT INTO 테이블명1(컬럼1, 컬럼2, .....)

VALUES(컬럼1 값, 컬럼2 값, ....);


[기본패턴2]     // 테이블에 있는 모든 컬럼에 데이터를 넣는다.

INSERT INTO 테이블명2

VALUES(컬럼1 값, 컬럼2 값);


* 컬럼 리스트와 컬럼에 들어갈 값의 순서는 정확히 맞아야 한다.

* 두 번째 유형을 사용했을 경우 VALUES절에 컬럼의 값 중 단 하나라도 없으면 오류


[기본패턴3]

INSERT INTO 테이블명1(컬럼1, 컬럼2, ... )

SELECT 컬럼1, 컬럼2, ....

 FROM 테이블2

WHERE .... ;


3.UPDATE 문

[기본패턴]

UPDATE 테이블명

      SET 변경컬럼1 = 변경하고자 하는 값,

변경컬럼2 = 변경하고자 하는 값,

........

WHERE 조건절 .... ;


4. DELETE 문

[기본패턴]

DLETE [FROM] 테이블

WHERE 조건....;


5. COMMIT 문

실제 데이터의 변경은 데이터 파일에 변경사항이 반영될 때 발생하게 된다. 그 전에는 변경된 데이터들은 오직 오라클 메모리 상에만 존재하게 된다.

최종적으로 데이터 파일에 적용하는 시점은 COMMIT문장을 실행했을 때

[기본패턴]

COMMIT [WORK] [TO SAVEPOINT savepoint_name];


6. ROLLBACK 문

COMMIT과 반대의 개념, 변경된 데이터들을 변경 전 상태로 되돌리는 역할

[기본패턴]

ROLLBACK [WORK] [TO SAVEPOINT savepoint_name];


|객체 조작하기(DDL)

1. CREATE 문

데이터베이스 객체들을 생성할 때 사용

[기본패턴]

CREATE 객체종류 객체명...

EX) CREATE TABLE 테이블명

     CREATE INDEX 인덱스명


2. DROP 문

이미 생성된 객체들을 삭제할 때 사용

[기본패턴]

DROP 객체종류 객체명....


3. ALTER 문

기존에 생성된 객체를 변경할 때 사용


4. TURNCATE 문

DELETE문과 동일한 역할을 한다. 그러나 TURNCATE 문을 사용하여 데이터를 삭제했을 경우 ROLLBACK을 사용하여 데이터를 복구할 수 없다. TRUNCATE가 실행되면 자동 COMMIT이 되기 때문에...

테이블과 클러스터에만 적용이 가능

[기본패턴1]

TRUNCATE TABLE 테이블명,,,,,

[기본패턴2]

TRUNCATE CLUSTER 클러스터명......


*클러스터 : 하나 이상의 컬럼을 공유하여 동일한 값을 가진 하나 이상의 테이블의 로우들을 인접한 장소에 함께 저장하는 객체

* DCL(데이터 제어어) : GRANT( 허용권한제공) REVOKE( 허용권한 없애기)



자바와 데이터베이스

JDBC(Java Database Connectivity)는 자바 API의 하나로서 데이터베이스에 연결하여서 데이터베이스 안의 데이터에 대하여 검색하고 데이터를 변경할 수 있게 한다. 따라서 JDBC를 사용하면 자바 프로그램으로 회사같은 곳에서 사용하는 데이터베이스에 접그하여서 여러가지 작업을 할 수 있게 된다.


|데이터베이스 프로그램 개발 절차

1. DBMS(DataBase Management System) 설치( 오라클, MySQL)

2. DBMS에 필요한 JDBC 드라이버를 설치

3. JDBC가 제공하는 기능을 이용하여 데이터베이스 응용 프로그램을 개발


MySQL 과 JDBC드라이버를 설치합시다.

MySQL : http://dev.mysql.com/downloads/file/?id=463530

JDBC : http://dev.mysql.com/downloads/connector/j/


|JDBC를 이용한 데이터베이스 사용 절차

1. URL로 지정된 JDBC 드라이버를 적재

ex) forName( )이라는 메소드를 사용

try{

Class.forName("com.mysql.jdbc.Driver");

}

catch(ClassNotFoundException e){
    System.out.println("드라이버를 찾을 수 없습니다.");

}


2. 사용자 이름과 패스워드를 가지고 데이터베이스에 연결

ex) getConnection( )을 호출

String url = "jdbc:mysql://localhost/book_db"; // jdbc:서브프로토콜:서브내임

String user = "root";

String password = "password";

con = DriverManager.getConnection(url, user, password);

출력결과

3. SQL문장을 작성하여서 전공하고 실행. SQL명령어의 결과로 생성되는 결과 집합을 얻는다.

사용되는 것

- Connection 객체 : 자바와 데이터베이스 사이의 연결을 담당

- Statement 객체 : SQL 문장을 실행합니다.

EX) Statement s = con.createStatement();    // 문장객체 생성

     String select = "SELECT * FROM books ORDER BY jaehyeok; // SQL 문장 생성

     ResultSet rows = s.executeQuery(select);    // SQL 문장 실행

4. 결과 집합을 화면에 표시하거나 겨로가 집합을 처리한다. 사용이 끝나면 연결을 해제.

'Programming Language > Java' 카테고리의 다른 글

9. 네트워크 프로그래밍  (0) 2016.06.10
8. 입출력 - 형식 입출력  (0) 2016.06.10
7. 입출력 - 문자스트림  (2) 2016.06.09
6. 입출력-바이트스트림  (0) 2016.06.08
5. 스레드  (0) 2016.06.08

네트워크 프로그래밍의 개요


|서버와 클라이언트

네트워크에는 서버와 클라이언트가 존재한다. 이들은 미리 정의된 프로토콜을 이용하여서 서로 간에 통신을 한다.


|자바와 네트워킹

자바에서 네트워크 프로그래밍을 위한 패키지는 java.net이다.


URL클래스

자바에서는 URL 객체를 이용하여 URL의 주소를 나타낸다.

 URL java = new URL("http://java.sun.com/"); // 절대 경로

 URL reference = new URL(java, "reference.html"); // 상대경로


<예제>

URL문자열로부터 각가의 요소 파싱

출력결과


|URL클래스를 이용한 읽기

URL 클래스 메소드인 openStream( )을 이용하면 인터넷상의 URL에서 직접 그 내용을 입력 스트림처럼 읽을 수 있다.


<예제>

출력결과


|URLConnection 클래스

URL 객체를 생성한 후에 URL 클래스의 openConnection( ) 메소드를 호출하면 URLConnection 객체를 반환한다. 이 객체를 이용하여 외부 URL에 의하여 표현되는 서버에 접속할 수 있으며 또한 접속에 앞서서 여러 가지 통신 파라미터들을 설정할 수 있다.

try{

URL java = new URL("http://java.sun.com/");

URLConnection javac = java.openConnection( );

javac.connect = java.openConnection( );

} catch (MalformedURLException e){

} catch (IOException e){

}


TCP를 이용한 통신

 URL과 URLConnections 클래스는 인터넷상의 자원을 접근하는데 상대적으로 고수준의 메카니즘. 그러나 가끔은 저수준의 네트워크 통신 기능이 필요한 경우도 있다. 예를 들면 클라이언트-서버 응용 프로그램을 만드는 경우


|소켓이란?

하나의 포트에 하나의 소켓을 만들어 결합 


TCP를 이용한 서버 제작


서버 제작 5단걔

1. ServerSocket 객체 생성 

ex) ServerSocket server = new ServerSocket(portNumber, queueLength);

-> 포트 번호가 portNumber인 포트를 기반으로 하는 소켓을 생성

-> queueLenght : 서버에 연결되기를 기다리는 클라이언트의 최대 개수


2. accept( ) 메소드 호출

ex) Socket clientSocket = server.accept( );

-> accept( ) 메소드는 클라이언트와 연결이 되면 새로운 Socket 객체를 반환

-> 이 새로운 Socket 객체를 이용하여서 서버는 클라이언트와 상호 대화


3. 소켓으로부터 스트림 객체를 얻는다.

ex) InputStream input = clientSocket.getInputStream( );

    OutputStream output = cliendtSocket.getOutputSt

4. 상호 대화 단계

서버와 클라이언트는 스트림을 이용하여서 상호 대화한다.


5. 종료

close( ) 메소드를 호출




'Programming Language > Java' 카테고리의 다른 글

10. 데이터베이스 프로그래밍  (0) 2016.06.10
8. 입출력 - 형식 입출력  (0) 2016.06.10
7. 입출력 - 문자스트림  (2) 2016.06.09
6. 입출력-바이트스트림  (0) 2016.06.08
5. 스레드  (0) 2016.06.08

Scanner 클래스

: 형식이 있는 입력을 토큰으로 쪼개고 각각의 토큰을 자료형에 따라 변환한다. 스캐너는 공백 문자를 이용하여 각각의 토큰을 분리

(공백문자 : 공백, 탭, 줄마침 기호)


<예제>

출력결과


<예제>

출력결과


|PrintStream 클래스와 PrintWriter 클래스

PrintStream : 바이트 입력을 받아서 텍스트 형태로 출력(ex, System.out)

PrintWriter : 문자 입력을 받아서 텍스트 형태로 출력


|print( )와 println( ) 메소드

print( ) 나 println( )을 호출하면 먼저 값을 toString( ) 메소드를 호출하여 변환한 후에 출력

간단하게 값들을 포맷할 수 있지만 결과를 세밀하게 제어할 수는 없다.


|format( ) 메소드

형식 제어 문자열에 기초하여 다수의 인수를 포맷


<예제>

출력결과

->format( ) 메소드를 이용해 값을 세밀하게 제어할 수 있다.





'Programming Language > Java' 카테고리의 다른 글

10. 데이터베이스 프로그래밍  (0) 2016.06.10
9. 네트워크 프로그래밍  (0) 2016.06.10
7. 입출력 - 문자스트림  (2) 2016.06.09
6. 입출력-바이트스트림  (0) 2016.06.08
5. 스레드  (0) 2016.06.08
문자스트림

문자 스트림은 입출력 단위가 문자가 된다.


|Reader와 Writer 클래스

Reader클래스의 메소드

int read( ) : 한 바이트를 읽어서 int 타입으로 반환, 읽을 값이 없으면 -1을 반환

int read(byte[] buf) : buf의 크기만큼 데이터를 읽어서 buf에 저장하고 읽은 바이트 수를 반환

int read(byte[] buf, int offset, int length) : length만큼의 데이터를 읽어서 buf의 offset 위치에 저장하고 읽은 바이트 수를반환

void mark(int readAheadLimit) : 스트림의 현재 위치를 표시해 놓는다.

boolean markSupported( ) : 마크 기능이 지원되는지 여부를 반환

abstract void close( ) : 스트림을 닫고 모든 자원을 반납

boolean ready( ) : 스트림이 읽을 준비가 되었는지 여부를 반환

void reset( ) : 스트림을 리셋

long skip(long n) : n개의 문자를 건너뛴다.


Writer클래스의 메소드

void write(int data) : data의 하위 8비트를 출력

void write(byte[] buf) : buf[]에 저장된 바이트들을 출력

void write(byte[] buf, int offset, int length) : buf의 offset 위치에 length만큼의 바이트를 출력

void mark(int readAheadLimit) : 스트림의 현재 위치를 표시해 놓는다.

abstract void flush( ) : 스트림 버퍼의 데이터를 모두 출력

abstract void close( ) : 스트림을 닫고 모든 자원을 반납

Writer append(char c) : 문자 c를 스트림에 추가

void write(String str) : 문자열을 출력

void write(String str, int off, int len) : 문자열에서 지정된 범위를 출력


|FileReader와 FileWriter 클래스

파일로부터 텍스트 데이터를 읽고 쓰는데 사용


FileReader의 생성자

FileReader(File file) : 주어진 file을 이용하여 새로운 FileReader 객체를 생성

FileReader(String fileName) : 주어진 파일의 이름을 이용하여 새로운 FileReader 객체를 생성

FileWriter의 생성자

FileWriter(File file) : 주어진 File 객체를 이용하여서 새로운 FileWriter 객체를 생성

FileWriter(String fileName) : 주어진 파일 이름을 이용하여서 새로운 FileWriter 객체를 생성

FileWriter(Stirng fileName, boolean append) : append가 true이면 주어진 파일의 끝에 텍스트를 추가


<예제>

출력결과

->문자열을 파일에 저장할 때는 write( ) 메소드를 호출하고 문자열 객체를 매개 변수로 주면된다.

->문자를 하나씩 읽을 때는 int 타입 변수를 char로 형변환


|InputStreamReader와 OutputStreamWriter 클래스

바이트 스트림과 문자 스트림을 연결하는 두 개의 범용 브릿지 스트림.

InputStreamReader는 바이트 스트림을 문자 스트림으로 변환. 효율성을 위해 InputStreamReader를 BufferedReader로 감싸는것이 좋다

ex) BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

OutputStreamWriter는 문자 스트림을 바이트 스트림으로 변환. 효율성을 위해 BufferedWriter로 감싸는것이 좋다.

ex) BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));


|BufferedReader와 BufferedWriter 클래스



'Programming Language > Java' 카테고리의 다른 글

9. 네트워크 프로그래밍  (0) 2016.06.10
8. 입출력 - 형식 입출력  (0) 2016.06.10
6. 입출력-바이트스트림  (0) 2016.06.08
5. 스레드  (0) 2016.06.08
4. 예외처리  (0) 2016.06.08

스트림(stream)

"순서가 있는 데이터의 연속적인 흐름"


|바이트 스트림과 문자 스트림

바이트 스트림 : 8비트의 바이트 단위로 입출력하는 클래스, 이진 데이터를 읽고 쓰기 위하여 사용.

문자 스트림 : 문자 단위로 입출력하는 클래스, 기본적으로 유니코드를 저장.


|데이터 싱크와 데이터 처리

데이터 싱크 스트림 : 소스나 목적지에 데이터를 입출력(메모리, 파이프, 파일)

데이터 처리 스트림 : 데이터 가공(그 외) 


바이트 스트림

모든 바이트 스트림은 InputStream과 OutputStream에서 파생


|InputStream과 OutputStream 클래스

int read( ) : 한 바이트를 읽어서 int 타입으로 반환, 읽을 값이 없으면 -1을 반환

int read(byte[] buf) : buf의 크기만큼 데이터를 읽어서 buf에 저장하고 읽은 바이트 수를 반환

int read(byte[] buf, int offset, int length) : length만큼의 데이터를 읽어서 buf의 offset위치에 저장하고 읽은 바이트 수를 반환

void write(int data) : data의 하위 8비트를 출력

void write(byte[] buf) : buf[]에 저장된 바이트들을 출력

void write(byte[] buf, int offset, int length) : buf의 offset 위치에 length만큼의 바이트를 출력


|FileInputStream과 FileOutputStream 클래스

FileInputStream 클래스는 파일에서 바이트를 읽고 FileOutputStream 클래스는 파일에다가 바이트를 쓴다.


FileInputStream의 생성자

1. FileInputStream(File file) : File 객체에 연결된 파일로부터 바이트를 읽는 객체를 생성한다.

2. FileInputStream(String name) : 파일의 경로 이름이 name인 파일과 연결된 입력 담당 객체를 생성한다.


FileOutputStream의 생성자

1. FileOutputStream(File file) : File 객체가 나타내는 파일에 바이트를 쓰는 객체를 생성한다.

2. FileOutputStream(String name) : 파일의 경로 이름이 name인 파일과 연결된 출력 담당 객체를 생성한다.

3. FileOutputStream(String name, boolean append) : append가 true이면 파일의 끝에 바이트를 추가하고 false이면 바이트를 기존의 바이트 위에 겹쳐서                                                                     쓴다. 

<예제>

출력결과

->read( )가 int 값을 반환하는 이유는 입력 스트림의 끝을 표시하는데 -1을 사용하기 위해

->더 이상 사용하지 않는 스트림을 닫는 것이 중요. 소스에서 만약 오류가 발생했을 경우에도 finally 블록을 사용하여 스트림을 닫고 있다. 만약 스트림을 닫지 않으면 심각한 자원 누출이 발생한다.


|BufferedInputStream과 BufferedOutputStream 클래스

각 read나 write 요청은 운영체제에 의하여 요청하는 즉시 처리된다. 이것은 매우 비효율적인 방법이다. 왜냐하면 입출력 요청은 디스크 접근이나 네트워크 접근같은 매우 시간이 많이 걸리는 동작을 요구하기 때문이다. 따라서 오버헤드를 줄이기 위하여 버퍼링된 스트림을 제공


BufferedInputStream(InputStream in) : 입력 스트림 in을 감싸는 버퍼 입력 스트림 객체를 생성

BufferedInputStream(InputStream in, int size) : 버퍼 크기가 size인 버퍼를 가진 버퍼 입력 스트림을 생성


버퍼가 없는 스트림을 버퍼가 있는 스트림으로 변경

inputStream = new BufferedInputStream(new FileInputStream("data.txt"));

outputStream = new BufferedOutputStream(new FileOutputStream("data.txt"));


<예제>

출력결과

->여기서 만약 flush( )가 실행되지 않으면 출력이 나오지 않는다. 그 이유는 아직 버퍼가 다 차지 않았기 때문에 버퍼를 파일에 쓰지 않는다.


|DataInputStream과 DataOutputStream 클래스

기초 자료형 단위로 데이터를 읽고 쓸 수 있다.

<예제>

출력결과

->입력순서와 출력순서의 데이터타입을 동일하게 맞쳐야한다.


|ObjectInputStream과 ObjectOutputStream 클래스

객체의 입출력을 지원. 객체를 파일에 저장할 수 있고 또 반대로 파일에 저장된 객체를 읽어 들일 수 있다.

객체를 파일에 저장하려면 객체가 가진 데이터들을 순차적으로 데이터로 변환하는 절차가 필요 , 이것

직렬화(serialization)라고 한다. 어떤 클래스가 직렬화를 지원하려면 Serializable이라는 인터페이스를 구현해야 된다.


<예제 >

현재 날짜 객체를 저장하였다가 다시 읽어서 콘솔에 표시하기

출력결과

문자스트림은 다음 포스팅~

'Programming Language > Java' 카테고리의 다른 글

8. 입출력 - 형식 입출력  (0) 2016.06.10
7. 입출력 - 문자스트림  (2) 2016.06.09
5. 스레드  (0) 2016.06.08
4. 예외처리  (0) 2016.06.08
3. Collections클래스  (0) 2016.06.08

스레드란?

병렬작업(multi-tasking)은 여러 개의 작업을 동시에 실행시켜서 컴퓨터 시스템의 성능을 높이기 위한 기법이다.

다중 스레딩(multi-threading)은 이 병렬 작업의 아이디어를 프로그램 안으로 가져온 것, 즉 하나의 프로그램이 동시에 여러 가지 작업을 할 수 있다. 

이들작업을 스레드(thread)라고 부른다.


|프로세스와 스레드

프로세스는 자신만의 데이터를 가지는 데 반하여 스레드들은 동일한 데이터를 공유한다.(스레드는 하나의 프로세스 안에 존재)

프로세스 : 독자적으로 실행이 가능한 환경, 프로그램이 실행되면 프로세스가 된다.

스레드 : 경량 프로세스라고도 불림, 스레드들은 프로세서 안에서 존재, 메모리와 파일을 포함하여 프로세스의 모든 자원을 공유한다.

      모든 자바 프로그램은 적어도 하나의 스레드를 가지고있다. 즉 main( ) 스레드라고 부르는 하나의 스레드로 출발.


스레드 생성과 실행

스레드를 만드는 방법에는 다음의 두 가지가 있다.

1. Thread 클래스를 상속하는 방

2. Runnable 인터페이스를 구현하는 방법


Thread 클래스

Thread( ) : 매개 변수가 없는 기본 생성자

Thread(String name) : 이름이 name인 Thread 객체를 생성

Thread(Runnable target, String name) : Runnable을 구현하는 객체로부터 스레드를 생성

static int activeCount( ) : 현재 활동 중인 스레드의 개수를 반환

String getName( ) : 스레드의 이름을 반환

int getPriority( ) : 스레드의 우선 순위를 반환

void interrupt( ) : 현재의 스레드를 중단한다.

boolean isInterrupted( ) : 현재의 스레드가 중단될 수 있는지를 검사

void setPriority(int priority) : 스레드의 우선 순위를 지정

void setName(String name) : 스레드의 이름을 지정

static void sleep(int milliseconds) : 현재의 스레드를 지정된 시간만큼 재운다.

void run( ) : 스레드가 시작될 때 이 메소드가 호출

void start( ) : 스레드를 시작

static void yield( ) : 현재 스레드를 다른 스레드에 양보


Thread 클래스를 상속하기

class Counting extends Thread{

public void run(){

for(int i=0;i<10;i++)

{

System.out.println(i);

}

}

}

-> Thread 클래스를 상속받아 서브 클래스를 만들고 run( ) 메소드를 오버라이드하는 방법. run( ) 메소드에 스레드가 수행하여야 할 작업 내용이 들어감. 이 서브 클래스의 인스턴스를 생성하고 start( ) 메소드를 호출하면 스레드가 실행

public class Test{

public static void main(String args[ ]){

Thread t = new Counting();

t.start();

}

}


|Runnable 인터페이스를 구현하는 방법( 추천 )

Thread 클래스를 확장하는 방법은 하나의 큰 단점이 존재, 자바에서는 단일 상속만이 가능하므로 다른 클래스를 이미 상속한 클래스는 스레드로 만들 수 없다. 따라서 Runnabel 인터페이스를 구현.

1. Runnable을 구현하는 클래스를 생성

2. Runnable 클래스에 run( ) 메소드를 작성

3. Thread 클래스의 객체를 생성, Runnable 객체를 Thread 생성자의 매개 변수로 넘김

4. Thread객체의 start( ) 메소드를 호출


< 1, 2에 따라 Runnable을 구현하는 클래스를 작성>

class Counting implements Runnable{

public void main( )

{

for(int i =0;i<10;i++)

{

System.out.println(i);

}

}

}

<3, 4에 따라 Counting의 객체를 만들고 Thread 클래스의 객체도 생성>

public class Test{

public static void main(String args[ ] ){

Counting c = new Counting( );

Tread t = new Tread( c );

t,start( );

}

}


<예제-1>

0부터 9까지 세는 스레드 두 개 만들기!

 

출력결과


<예제-2>

경마 게임 : 난수를 매개 변수로 하여 sleep( )을 호출하는 스레드를 여러 개 작성. sleep( ) 메소드는 지정도니 시간 동안 현재 스레드의 실행을 중단.

출력결과


스레드 상태


스레드의 스케줄링

스케줄링 : 어떤 순서로 스레드를 수행시킬 것인가를 결정( 자바 런타임 시스템은 우선 순위 스케줄링을 이용 , 만일 같은 우선 순위를 가진 스레드들이 있다면 이들은 라운드로빈 방식(스레드 각각에게 균등하게 CPU 시간을 분배하는 것)으로 수행 )

자바의 스케줄링 방식은 선점 형식( 더 높은 우선 순위를 가지는 스레드가 들어오면 수행되고 있는 스레드를 강제로 중단시키고 새로운 스레드를 수행)


|스레드의 우선순위

스레드는 생성될 때 자신을 생성한 스레드로부터 우선 순위를 상속 받음.


|sleep( )

현재 스레드의 실행을 지정된 시간 동안 중단( CPU의 시간을 다른 스레드에게 양보하는 효과적인 수단 )

 <1초 간격으로 메시지를 출력>

출력결과



|인터럽트

스레드로 하여금 현재 실행하고 있는 것을 멈추고 다른 것을 하도록함( 스레드가 수시로 인터럽트 검사를 하는 메소드를 호출하여야 한다)

<sleep()상태에서 인터럽트를 검사>


|조인

join( ) 메소드는 하나의 스레드가 다른 스레드의 종료를 기다리게 하는 메소드.( t가 현재 실행 중인 스레드 객체이면 다음 문장은 t가 끝날 때까지 현재의 스레드의 실행을 중단)

ex) t.join( );


동기화

한 번에 하나의 스레드만이 공유 데이터를 접근할 수 있도록 제어하는 방법

<동기화 문제 예시 - 저금,인출>

-> 하나의 은행 계좌를 생성하고 두 개의 스레드에게 매개 변수로 넘긴다. 상식적으로는 저금이 먼저 이루어지기 때문에 절대 마이너스가 될 수 없다. 그러나 실제 결과를 돌리면 "오류발생"을 출력하게 된다.


|동기화 문제의 이유

동시에 실행되는 스레드 사이에 있는 공유되는 데이터( 공유되는 데이터를 조작하는 코드를 임계 영역), 즉 임계영역에는 항상 하나의 스레드만이 존재하여야 한다.


|동기화된 메소드 이용

synchronized 키워드를 사용하면 어떤 한 순간에는 하나의 스레드만이 임계 영역 안에서 실행하는 것이 보장



스레드간의 조정

ex) 소비자 객체는 생산가자 데이터를 배달하기 전에 데이터를 가져오려고 시도하면 안된다. 또한 생산자도 소비자가 아직 이전 데이터를 가져가지 않았는데 새로운 데이터를 생산하면 안된다.

<생산자 소비자 문제>

출력결과

-> 생산자 스레드가 더 빠른 경우 이전에 생산된 케익을 소비자 스레드가 가져가기 전에 덮어쓰거나/ 소비자 스레드가 더 빠른 경우 똑같으 케익을 두 번 가져가는 경우가 발행


해결방법

1.동기화된 메소드를 사용하여 두 개의 스레드가 동시에 버퍼 객체에 접근하는 것을 막는다.

2.wait(), notify()메소드를 이용하여 명시적으로 알린다.


|wait( )와 notify( )를 사용하는 방법





'Programming Language > Java' 카테고리의 다른 글

7. 입출력 - 문자스트림  (2) 2016.06.09
6. 입출력-바이트스트림  (0) 2016.06.08
4. 예외처리  (0) 2016.06.08
3. Collections클래스  (0) 2016.06.08
2. 컬렉션  (0) 2016.06.07

예외처리?

오류가 발생하게 되면 프로그램이 종료하게 되는데 무조건 종료하는 것보다 프로그램의 오류를 감지하여 프로그램을 종료하거나 오류를 처리한 후에 계속 실행


<예제 - 0으로 나누기>

 

출력결과

-> 산술오류(0으로나누기)


예외처리 기본형식

try{

// 예외가 발생할 수 있는 코드

} catch( 예외종류 참조변수 ){

// 예외를 처리하는 코드

}


<예제1>

출력결과


<예제2>

출력결과


<사용자 정의 예외>

사용자가 예외 객체를 정의

출력결과







'Programming Language > Java' 카테고리의 다른 글

6. 입출력-바이트스트림  (0) 2016.06.08
5. 스레드  (0) 2016.06.08
3. Collections클래스  (0) 2016.06.08
2. 컬렉션  (0) 2016.06.07
1. 제네릭  (0) 2016.06.07


Collection클래스는 여러 유용한 알고리즘을 구현한 메소드들을 제공한다.

1. 정렬(Sorting)

2. 섞기(Shuffling)

3. 탐색(Searching)


|정렬

Collection 클래스의 정렬은 속도가 비교적 빠르고 안정성이 보장되는 합병 정렬을 이용한다.

Collection 클래스의 sort( ) 메소드는 List 인터페이스를 구현하는 컬렉션에 대하여 정렬을 수행한다.

ex)

List<String> list = new LinkedList<String>( );

list.add("김철수");

list.add("김영희");

Collections.sort(list);


<정렬 예제1>

 

출력결과

->정렬 알고리즘을 실행하기 위하여 asList( ) 메소드를 이용하여 배열을 리스트로 변환

->sort( )를 호출하여 정렬한다.


<정렬 예제2>

 

출력결과


|섞기

정렬의 반대 동작을 한다. 즉 원소들의 순서를 랜덤하게 만든다. 게임을 구현할 때 유용하다.(카드 게임에서 카드를 랜덤하게 섞을 때 사용

<섞기 예제>

 

출력결과



|탐색

리스트 안에서 원하는 원소를 찾는 것.

<탐색 예제>

 

출력결과



'Programming Language > Java' 카테고리의 다른 글

6. 입출력-바이트스트림  (0) 2016.06.08
5. 스레드  (0) 2016.06.08
4. 예외처리  (0) 2016.06.08
2. 컬렉션  (0) 2016.06.07
1. 제네릭  (0) 2016.06.07

+ Recent posts