자바와 데이터베이스

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

컬렉션이란?

자바에서 자료 구조를 구현한 클래스들을 칭하는 용어.( 리스트, 스택, 큐, 집합, 해쉬 테이블)


|컬렉션의 종류

자바는 컬렉션 인터페이스와 컬렉션 클래스로 나누어서 제공.


인터페이스

1. Collection : 모든 자료 구조의 부모 인터페이스로서 객체의 모임을 나타낸다.

2. Set : 집합을 나타내는 자료 구조

3. List : 순서가 있는 자료 구조로 중복된 원소를 가질 수 있다.

4. Map : 키와 값들이 연관되어 있는 사전과 같은 자료 구조

5. Queue : 극장에서의 대기줄과 같이 들어온 순서대로 나가는 자료구조


ArrayList

|List 인터페이스

리스트는 순서를 가지는 원소들의 모임으로 중복된 원소를 가질 수 있다.

ArrayList, Vector : List를 배열로 구현한 것

LinkedList : List를 연결 리스트로 구현한 것


|ArrayList

사용 이유 : 배열의 문제점은 배열을 생성할 때 배열의 크기가 고정된다는 점, 반면 ArrayList는 자동적으로 크기가 변경.


#기본생성    ex) ArrayList<String> list = new ArrayList<String>( );

#데이터 저장    ex) list.add("milk");

#인데스 위치에 저장    ex) list.add( 1, "APPLE");

#특정한 위치에 있는 원소 바꿈    ex) list.set( 2, "GRAPE");

#데이터를  삭제     ex) list.remove( 3 );

#인덱스 위치의 값 가져옴    ex) String s = list.get( 1 );

#현재 저장된 원소의 개수    ex) list.size( );

#특정한 데이터가 저장된 위치    ex) int index = list.indexOf("APPLE");


|반복자 사용하기

#hasNext( ) : 아직 방문하지 않은 원소가 있으면 true를 반환

#next( ) : 다음 원소를 반환

#remove( ) : 최근에 반환된 원소를 삭제


반복자를 사용하기 위해서는 먼저 ArrayList의 iterator( ) 메소드를 호출하여서 반복자 객체를 얻는다.

ex)    Iterator e = list.iterator( );


LinkedList

사용 이유 : ArrayList의 경우 중간에서 데이터의 삽입이나 삭제가 발생하는 경우 원소를 이동시켜야 한다. 따러서 연결 리스트로 구현된LinkedList가 사용됨

메소드는 ArrayList와 동일 


|배열을 리스트로 변경하기

List<String> list = Arrays.asList(new String[size]);



SET

 집합은 순서가 없고 중복을 허용하지 않음.

 가장 잘 알려진 방법이 해쉬 테이블

 해쉬 테이블 : 각각의 원소에 대하여 해쉬 코드란 정수를 계산한다. 만약 클래스 작성자라면 반드시 hashCode( )도 구현해야됨

HashSet : 해쉬 테이블에 원소를 저장

TreeSet : 레드 - 블랙 트리에 원소를 저장

LinkedHashSet : 해쉬 테이블과 연결 리스트를 결합


<HashSet 예제>

 

출력결과 


<집합을 이용한 중복된 단어 검출>

 

출력결과


|대량 연산 메소드

s1.containsAll(s2) :  만약 s2가 s1의 부분 집합이면 참

s1.addAll(s2) : s1을 s1과 s2의 합집합

s1.retainAll(s2) : s1을 s1과 s2의 교집합

s1.removeAll(s2) : s1을 s1과 s2의 차집합


집합 연산을 할 때 중요한 점은 원집합이 파괴되면 안되다는 것이다. 따라서 집합 연산을 수행하기 전에 복사본을 만들어야 한다.

<집합 연산을 이용한 예제>

 

출력결과


Queue

: 후단에서 원소를 추가하고 전단에서 원소를 삭제한다. Queue 인터페이스는 LinkedList 클래스와 PriorityQueue 클래스로 구현

: 디큐(deque)는 전단과 후단에서 모두 원소를 추가하거나 삭제할 수 있다. deque 인터페이스는 ArrayDeque와 LinkedList 클래스들로 구현


|Queue 인터페이스

public interface Queue<E> extends Collection<E>{

E element( ); // 처음에 있는 원소 가져옴(삭제하지않음) 

boolean offer(E e);

E peek( ); // 처음에 있는 원소 가져옴(삭제하지않음)

E poll( ); // 처음에 있는 원소 가져옴(삭제)

E remove( );  //처음에 있는 원소 가져옴(삭제)

}


<큐에 저장된 정수값을 1초간격으로 출력>

 

->LinkedList클래스로 큐를 생성하고 0~10까지 큐에 저장한다.

->큐가 비었는지 확인하고 비어있지 않다면 뒤에서 부터 하나씩 삭제해서 출력한다.


|우선순위큐

: 원소들이 무작위로 삽입되었더라도 정렬된 상태로 원소들을 추출, 즉 remove()를 호출할 때마다 가장 작은 원소가 추출된다.(ex, 작업스케줄링)

: 히프라고 하는 자료 구조를 내부적으로 사용


<우선순위 큐 예제>

 

출력결과

->PriorityQueue클래스로 큐객체를 생성한후 30, 80, 20을 추가

->우선순위 큐의 원소를 출력

->큐가비어있을때까지 우선순위 큐의 원소를 삭제하면서 출력 이때 가장 작은 원소 순으로 출력


Map

: 많은 데이터 중에서 원하는 데이터를 빠르게 찾을 수 있는 자료구조. 사전관 같은 자료구조이다. 즉 사전처럼 단어가 있고(키) 단어에 대한 설명(값)이있다. Map은 중복된 키를 가질 수 없다. 각 키는 오직 하나의 값에만 매핑될 수 있다.

:HashMap, TreeMap, LinkedHashMap 3가지의 클래스가 제공. 만약 키들을 정렬된 순서로 방문할 필요가 없다면 HashMap.

ex)

Map<String, Student> freshman = new HashMap<String, Student>( ); //생성

Student kim = new Student("구준표");

freshman.put("20090001", kim); // 저장


String s = "20090001";

st = freshman.get(s); // 구준표 반환


<맵을 이용한 학생자료 예제>

 

출력결과

 

->HashMap클래스를 이용해 st라는 맵객체를 만들었다 ( 키 - 문자열, 값 - Student)

->"201113511"라는 키를 가진 정보를 삭제하고 새로 삽입하였다.

->Map에 저장된 데이터를 방문하기 위해 Map.Entry라는 인터페이스를 사용하였고 모든 값을 출력하였다.


<Map 기본적인 연산 예제>

출력결과

 


-> HashMap클래스를 이용해서 Map객체 m생성

-> sample배열에 있는 값을 가져와 m객체의 빈도를 가져온다 빈도가 null이면 1 아니면 1증가시킨다.

-> MAP m의 값 출력


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

6. 입출력-바이트스트림  (0) 2016.06.08
5. 스레드  (0) 2016.06.08
4. 예외처리  (0) 2016.06.08
3. Collections클래스  (0) 2016.06.08
1. 제네릭  (0) 2016.06.07

제네릭 프로그래밍(generic programming)이란 ? 

일반적인 코드를 작성하고 이 코드를 다양한 타입의 객체에 대하여 재사용하는 객체 지향 기법.


제네릭 클래스에서는 타입을 변수로 표시한다. 이것을 타입 매개변수라고 하는데 타입 매개 변수는 객체 생성 시에 프로그래머에 의해 결정된다.

ex)

class Store<T>{

private T data;

public void set(T data)

{
    this.data = data;

}

public T get()

{
    return data;

}

}


-> Store<String> store = new Store<String>( ); //문자열을 저장하는 Store객체

-> Store<Integer> store = new Store<Integer>( ); //정수를 저장하는 Store객체


타입 매개 변수의 표기

E - Element

K - Key

N - Number

T - Type

V - Value

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

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

+ Recent posts