반응형
정렬
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
네트워크
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문 내에서 수행되는것
반응형
'Spring 사전 준비 > JAVA' 카테고리의 다른 글
내부 클래스의 종류 (0) | 2022.03.17 |
---|---|
[JAVA 간단정리 5] API(Timer)/Wrapper/예외처리/Collections (0) | 2020.11.17 |
JAVA Collections 시간복잡도 총정리(타 블로그 링크) (0) | 2020.11.17 |
[JAVA 간단정리 4] 인터페이스/싱글톤/API(문자열,날짜,랜덤) (0) | 2020.11.16 |
[JAVA 간단정리 3] 패키지/접근제한자/static/상속/추상클래스 (0) | 2020.11.13 |
댓글