본문 바로가기
  • 실행력이 모든걸 결정한다
Spring 사전 준비/JAVA

[JAVA 간단정리 6] 정렬/입출력/스레드/GUI/네트워크

by 김코더 김주역 2020. 11. 20.
반응형

정렬

1) 일반적인 정렬

ArrayList<Integer> arrayList = new ArrayList<Integer>();
//... 데이터 추가 작업
Collections.sort(arrayList); //정렬
Collections.reverse(arrayList); //필요 시, 정렬 후 역정렬

 

2) 객체 정렬

- Comparator의 compare 메소드를 구현하여 객체를 정렬할 수 있다. compare 메소드가 음수를 반환하면 첫 번째 요소를 앞세우고, 양수를 반환하면 두 번째 요소를 앞세운다.

import java.util.*;
class User {
    private String name;
    private int point;
    public User(String name, int point){
        this.name=name;
        this.point=point;
    }
    public String getName(){
        return this.name;
    }
    public int getPoint(){
        return this.point;
    }
}
public class Main
{
    public static void main(String[] args) {
        Comparator<User> comparator = new Comparator<User>(){
            @Override
            public int compare(User a, User b){
                return b.getPoint()-a.getPoint();
            }
        };
        ArrayList<User> arr = new ArrayList<User>();
        arr.add(new User("A", 1000));
        arr.add(new User("B", 3000));
        arr.add(new User("C", 2000));
        Collections.sort(arr, comparator);
        for(User u : arr){
            System.out.println(u.getName()+", "+u.getPoint());
        }
    }
}

 

결과

B, 3000
C, 2000
A, 1000

 

 

입출력(I/O)

1) InputStream

- Input 추상클래스
- read(), read(byte[] b) 메소드 사용

※ read() : 1byte씩 읽음, 읽은 바이트 값 리턴
※ read(byte[] b) : byte[] 만큼씩 읽음, 속도 빠름, 읽은 바이트 수 리턴, 읽은 바이트 값은 byte[] b에 저장
-> 리턴 값 차이 : byte값 vs byte수

InputStream is = null;
try{
    is = new FileInputStream("파일 경로");
    byte[] b = new byte[5]; //5byte 묶음씩 처리
    while(true){
        int cnt = is.read(b); //b에 byte값들 저장, 읽은 byte 수 리턴
        if(cnt==-1) break; //END
        //b배열로 원하는 작업 수행
    }
} catch (Exception e) {
    //예외처리
} finally {
    try {
        if(is != null) is.close();
    } catch (IOException e) {
        //예외처리
    }
}

 

2) OutputStream

- Output 추상클래스
- write(), write(byte[] b), write(byte[] b,int off,int len) 메소드 사용

※ write(byte[] b, int off, int len) : 데이터를 원하는 위치에서 원하는 숫자만큼 쓴다.

OutputStream os = null;
try{
    os = new FileOutputStream("파일 경로");
    String s = "Hello, Java!";
    byte[] b = s.getBytes(); //b에 s의 각 byte값들 저장
    os.write(b);
} catch (Exception e) {
    //예외처리
} finally {
    try {
        if(os != null) os.close(); //연결 끊기
    } catch (IOException e) {
        //예외처리
    }
}

※ 실행결과 : 파일에 Hello, Java! 가 적힌다.

 

3) DATA I/O Stream

- DataInputStream, DataOutputStream 이 있는데, InputStream과 OutputStream 보다 편리하게 고안된 클래스이다.

InputStream is = null;
OutputStream os = null;
DataInputStream dis = null;
DataOutputStream dos = null;
try{
    is = new FileInputStream("파일 경로1");
    dis = new DataInputStream(is);
    String s = dis.readUTF(); //읽은 데이터를 문자열로 만들어서 확인 가능
    
    os = new FileOutputStream("파일 경로2");
    dos = new DataOutputStream(os);
    dos.writeUTF(s); //파일 경로2에 문자열 s를 작성
} ...//catch, finally문은 1,2번과 같은 원리로 작성

 

 

스레드(Thread)

- 여러가지 작업을 동시에 할 수 있게 해주는 것

1. Thread 문법 종류

1) Runnable 인터페이스 구현
public class Thread1 implements Runnable {
    @Override
    public void run(){
        //작업
    }
}

<메인 클래스>
Thread1 thread1 = new Thread1();
Thread thread = new Thread(thread1,"task1"); //2번째 인자 : 스레드명 지정가능
thread.start();



2) Thread 클래스 상속
puvlic class Thread1 extends Thread {
    @Override
    public void run(){
        //작업
    }
}

<메인 클래스>
Thread1 thread1 = new Thread1();
thread1.setName("task1");
thread1.start();


------------------------------------------------------------------------------


2. 하나의 객체를 n개의 스레드가 공유
(Runnable 인터페이스 구현 방식을 이용한다고 가정)

<메인 클래스>
Thread1 thread1 = new Thread1();
Thread thread1_a = new Thread(thread1,"task1");
Thread thread1_b = new Thread(thread1,"task2");
Thread thread1_c = new Thread(thread1,"task3");
//thread1 이라는 하나의 작업을 thread1_a, thread1_b, thread1_c 셋이서 수행
//thread1를 하나 생성한 걸로 3개의 스레드 클래스를 만들었으므로 작업 내용(변수 등)은 모두 공유됨


------------------------------------------------------------------------------


3. 하나의 객체를 하나의 스레드가 수행
(Runnable 인터페이스 구현 방식을 이용한다고 가정)

<메인 클래스>
Thread1 thread1 = new Thread1();
Thread2 thread2 = new Thread2();
Thread3 thread3 = new Thread3();
thread thread1_a = new Thread(thread1,"task1");
thread thread2_a = new Thread(thread2,"task2");
thread thread3_a = new Thread(thread3,"task3");
//thread1, thread2, thread3 이라는 작업을 thread1_a, thread2_a, thread3_a 가 각각 하나씩 수행

* Thread.currentThread().getName() : 현재 수행 중인 해당 스레드의 명을 반환


------------------------------------------------------------------------------


4. synchronized
여러 스레드가 하나의 객체를 공유하여 작업을 수행할 때, 인스턴스 변수의 값은 스레드에 의해 수시로 바뀌게 된다.
스레드들이 이 변수에 거의 동시에 접근하는 경우에 문제가 생길 수 있다.
이를 해결해주는 것이 동기화이다.
동기화를 해준 곳에서는, 먼저 수행되는 스레드의 모든 작업이 끝날 때 까지 다른 스레드에서는 접근을 하지 못하게 된다.
스레드의 run 메소드 선언부에 synchronized 를 추가 작성해주면 된다.

public synchronized void run(){
    //코드
}

 

 

GUI

Graphic User Interface : 사용자가 컴퓨터를 사용하기 쉽게 만든것
AWT : 버튼, 체크박스처럼 그래픽 요소를 만들기 위한 컴포넌트들

예제) JAVAFX로 구현한 기차표 예매 GUI

kimcoder.tistory.com/65?category=879352

 

[구현 완료] Java로 만든 기차표 예매 시스템

<실행 영상> https://youtu.be/X0YxceEF3FE Github 링크 (소스 코드) https://github.com/jooyeokkim/TrainTicketReservation jooyeokkim/TrainTicketReservation Contribute to jooyeokkim/TrainTicketReservatio..

kimcoder.tistory.com

 

 

네트워크

1. InetAddress

IP주소같은 네크워크상의 정보들을 얻어오는 클래스

import java.net.InetAddress;

InetAddress inetAddress = InetAddress.getByName("도메인 주소");
inetAddress.getHostName() : 도메인 주소 반환
inetAddress.getHostAddress() : ip주소 반환

------------------------------------------------------------------------------

2. URLConnection

DNS를 통한 IP정보를 이용하여 URL객체를 만드는 클래스
* DNS : Domain Network System, 도메인 이름을 호스트의 네트워크 주소로 변환해주는 시스템 

아래 프로그램 설명 : 입력한 "도메인 주소"의 웹 소스 스트림을 FileWriter에 지정한 html파일로 옮겨준다.
도메인 주소에 www.google.com을 작성하고 아래 프로그램을 실행한 뒤 지정한 html파일을 열어보면
디자인 되지 않은 www.google.com이 열린다. 

import.io.BufferedReader;

String code = null;
try{
    URL url = new URL("도메인 주소");
    URLConnection con = url.openConnection(); //접속
    BufferedReader webData = new BufferedReader(new InputStreamReader(con.getInputStream()));
    FileWriter fw = new FileWriter("html 파일 주소",false); //true:붙이기, false:덮어쓰기
    
    while((code = webData.readLine()) != null){
        fw.write(code);
    }
    
    fw.close();
    webData.close();
} catch (Exception e) {
	//예외처리
}

------------------------------------------------------------------------------

3. Socket
네트워크상에서 서로 다른 호스트 사이의 통신을 위한 수단

소켓 통신 절차
1) 서버에서 ServerSocket을 만들고, 클라이언트의 요청을 기다림
2) Client에서 Socket을 만들고, I/O Stream을 만들어 Server로 요청을 함
3) Server에서 Client의 요청을 받아 Socket을 만들고, I/O Stream을 만듦
4) 통신
5) Socket 닫음

------------------------------------------------------------------------------

4. 채팅 프로그래밍 - 서버 사이드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

<MakeServerSocket 클래스>

ServerSocket serverSocket = null;
Socket socket = null;
PrintWriter writer = null;
BufferedReader reader = null;
String lineStr;

public MakeServerSocket(){ //생성자
    try{
        serverSocket = new ServerSocket(2000); //2000번 포트 이용, (전화기 생성같은 개념)
        while(true){
            socket = serverSocket.accept();//요청이 오면 바로 수락
            
            //입출력 객체 만들어 놓기
            writer = new PrintWriter(socket.getOutputStream(),true); //true : 붙이기
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); //여기에서 대기
            
            while((lineStr = reader.readLine()!=null){
                writer.write(lineStr); //클라이언트쪽으로 메세지를 다시 넘김 
                System.out.println("input : " + lineStr);
            }
            
            writer.close();
            reader.close();
            socket.close();
        }
    } catch (Exception e) { //예외처리 }
}

public static void main(String[] args){
    new MakeServerSocket();
}

------------------------------------------------------------------------------

4-2. 채팅 프로그래밍 - 클라이언트 사이드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

<MakeCilentSocket 클래스>

Socket socket = null;
PrintWriter writer = null;
BufferedReader reader = null;

public MakeClientSocket(){ //생성자
    try{
        socket = new Socket("localhost",2000); //로컬 ip사용
        writer = new PrintWriter(socket.getOutputStream(), true); //붙이기
        reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        
        String s = null;
        
        //사용자 입력 객체
        BufferedReader sReader = new BufferedReader(new InputStreamReader(System.in));
        
        while((s = sReader.readLine())!=null){
            writer.println(s);
            System.out.println("output : " + s);
        }    
        writer.close();
        reader.close();
        sReader.close();
        socket.close();            
    } catch (Exception e) {
            //예외처리
    }
}

public static void main(String[] args){
    new MakeClientSocket();
}
    
※ 본격적인 소통은 while문 내에서 수행되는것

 

 

반응형

댓글