public class Exam_01 {
public static void main(String[] args) {
// Worker w = new Worker();
// Worker2 w2 = new Worker2();
// Worker3 w3 = new Worker3();
// w.start();
// w2.start();
// w3.start();
new Worker().start();
new Worker2().start();
new Worker3().start();
for(int i =0; i<=99; i++) {
System.out.print("%");
}
}
}
public class Worker extends Thread{
public void run() {
for(int i =0; i<=99; i++) {
System.out.print("+");
}
}
}
같은 변수를 여러 스레드가 처리하도록 하는 방법
파라미터를 넣으면 오버라이딩 안된다.
설사 넣어도 콜바이밸류로 실제 값이 변하지 않음(같은이름의 다른 지역변수)
public static
스태틱 멤버필드는 클래스 멤버필드
class PlusTarget extends Thread{
public void run() {
while(true) {
Quiz_02.target++;
}
}
}
class MinusTarget extends Thread{
public void run() {
while(true) {
Quiz_02.target--;
}
}
}
public class Quiz_02 {
public static int target = 0;
public static void main(String[] args) {
// while(true) {
// target++;
// }
// while(true) { //Unreachable code : 위의 반복문에서 벗어날수 없으므로 도달할수 없는 코드
// target--;
// }
//파라미터를 넣으면 오버라이딩 안된다.설사 넣어도 콜바이밸류로 실제 값이 변하지 않음(같은이름의 다른 지역변수)
//public static
//스태틱 멤버필드는 클래스 멤버필드
new PlusTarget().start();
new MinusTarget().start();
while(true) {
System.out.println(target);
}
}
}
static
call by reference
inner class 방식 , nested class 방식 : 클래스를 안에다
public class Quiz_02 {
public static void main(String[] args) {
int target=0;
// class A{ //1.내부에 선언
// }
// Thread th = new Thread(); //2.인스턴스는 있지만 오버라이드 안되어있음
Thread th = new Thread() { //3.Thread 클래스를 바탕으로 인스턴스를 만들건데 수정해서 만들것이다.
int a;
};
// th.a // .으로 접근 못함, 자바에서 스레드형식이 a를 갖고 있다고 보지는 않음
while(true) {
System.out.println(target);
}
}
}
에러발생
Local variable target defined in an enclosing scope must be final or effectively final
public class Quiz_02 {
public static void main(String[] args) {
int target=0;
Thread th = new Thread() {
public void run() {
target++; //Local variable target defined in an enclosing scope must be final or effectively final
}//지역변수 target은 상수이거나 상수와 동일한 상태여야 한다
};
while(true) {
System.out.println(target);
}
}
}
상수로 만들어도
The final local variable target cannot be assigned, since it is defined in an enclosing type
public class Quiz_02 {
public static void main(String[] args) {
final int target=0;
Thread th = new Thread() {
public void run() {
target++; //The final local variable target cannot be assigned, since it is defined in an enclosing type
}
};
while(true) {
System.out.println(target);
}
}
}
스테틱을 사용하지 않는 경우
변수는 상수가 아니면서 상수와 같이 존재하도록 멤버필드로 위치 시키기
public class Quiz_02 {
public int target=0; // 스테틱 매서드 내에서는 넌스테틱을 쓰지 못함, 콜되었을 때 인스턴스 호출될지 확신 못함
public void func() {
Thread th1 = new Thread() {
public void run() {
while(true) {
target++;
}
}
};
Thread th2 = new Thread() {
public void run() {
while(true) {
target--;
}
}
};
th1.start();
th2.start();
while(true) {
System.out.println(target);
}
}
public static void main(String[] args) {
new Quiz_02().func();
}
}
//callback 패턴
public class Quiz_02 {
public int target=0; // 스테틱 매서드 내에서는 넌스테틱을 쓰지 못함, 콜되었을 때 인스턴스 호출될지 확신 못함
public void func() {
new Thread() {
public void run() {
while(true) {
target++;
}
}
}.start(); //익명 inner 클래스
new Thread() {
public void run() {
while(true) {
target--;
}
}
}.start();
while(true) {
System.out.println(target);
}
}
public static void main(String[] args) {
new Quiz_02().func();
}
}
쌍방 채팅
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public void func() {
try {
ServerSocket server = new ServerSocket(50000);
System.out.println("서버를 가동했습니다.");
Socket sock = server.accept();
System.out.println(sock.getInetAddress() + " 에서 연결"); //127.0.0.1
DataInputStream dis =
new DataInputStream(sock.getInputStream());
DataOutputStream dos =
new DataOutputStream(sock.getOutputStream());
new Thread() {
public void run() {
try {
while(true) {
Scanner sc = new Scanner(System.in);
dos.writeUTF(sc.nextLine());
dos.flush();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}.start();
new Thread() {
public void run() {
try {
while(true) {
System.out.println(sock.getInetAddress()+" : "+dis.readUTF());
}
}catch(Exception e) {
e.printStackTrace();
}
}
}.start();
}catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args){
new Server().func();
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public void func() {
try {
Socket sock = new Socket("192.168.60.19", 50000); //127.0.0.1 //192.168.60.19
DataInputStream dis =
new DataInputStream(sock.getInputStream());
DataOutputStream dos =
new DataOutputStream(sock.getOutputStream());
new Thread() {
public void run() {
try {
while(true) {
Scanner sc = new Scanner(System.in);
dos.writeUTF(sc.nextLine());
dos.flush();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}.start();
new Thread() {
public void run() {
try {
while(true) {
System.out.println(sock.getInetAddress()+" : "+dis.readUTF());
}
}catch(Exception e) {
e.printStackTrace();
}
}
}.start();
}catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args){
new Client().func();
}
}
값공유
1. 스태틱
2. call by reference
3. inner class : 코드가 짧을 때 클래스를 나누지 않고 그안에
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
class WriteThread extends Thread{
private DataOutputStream dos;
public WriteThread(DataOutputStream dos) {
this.dos = dos;
}
public void run() {
while(true) {
try {
dos.writeUTF(JOptionPane.showInputDialog("메세지 입력"));
dos.flush();
}catch(Exception e) {
e.printStackTrace();
System.exit(0);
}
}
}
}
class ReadThread extends Thread{
private DataInputStream dis;
public ReadThread(DataInputStream dis) {
this.dis = dis;
}
public void run() {
while(true) {
try {
System.out.println(dis.readUTF());
}catch(Exception e) {
e.printStackTrace();
System.exit(0);
}
}
}
}
public class Server3 {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(20000);
Socket sock = server.accept();
DataInputStream dis = new DataInputStream(sock.getInputStream());
DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
WriteThread wt = new WriteThread(dos);
ReadThread rt = new ReadThread(dis);
wt.start();
rt.start();
}catch(Exception e) {
e.printStackTrace();
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Client3 {
public static void main(String[] args) {
try {
Socket sock = new Socket("127.0.0.1",20000);
DataInputStream dis = new DataInputStream(sock.getInputStream());
DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
WriteThread wt = new WriteThread(dos);
ReadThread rt = new ReadThread(dis);
wt.start();
rt.start();
}catch(Exception e) {
e.printStackTrace();
}
}
}
다중 접속 메세지
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server2 {
public static void main(String[] args){
try {
ServerSocket server = new ServerSocket(20000);
while(true) {
Socket sock = server.accept();
new SocketThread(sock).start();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
import java.net.Socket;
public class SocketThread extends Thread{
private Socket sock;
public SocketThread(Socket sock) {
this.sock =sock;
}
public void run() {
try {
System.out.println(sock.getInetAddress() + " 에서 연결");
Thread.sleep(3000);
}catch(Exception e){
}
}
}
import java.io.DataOutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Client2 {
public static void main(String[] args) {
try {
Socket sock = new Socket("192.168.60.57", 20000);
while(true) {
DataOutputStream dos =
new DataOutputStream(sock.getOutputStream());
dos.writeUTF(JOptionPane.showInputDialog("메세지 입력"));
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.HashSet;
import java.util.Set;
//다대일 서비스 프로그램
public class Server4 {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(50000);
System.out.println("서버가 구동되었습니다.");
System.out.println("클라이언트 연결을 대기중입니다...");
while(true) {//여러명의 클라이이언트 받아서 쓰레드를 생성.소켓&스레드 공장
try {
Socket sock = server.accept();
new SocketThread(sock).start();
}catch(Exception e) {
}
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.HashSet;
import java.util.Set;
public class SocketThread extends Thread{
private Socket sock;
DataInputStream dis;
DataOutputStream dos;
public SocketThread(Socket sock) {
this.sock = sock;
}
public void run() {
System.out.println(sock.getInetAddress() + "에서 연결하였습니다.");
try {
dis = new DataInputStream(sock.getInputStream());
} catch (IOException e1) {
e1.printStackTrace();
}
try {
dos = new DataOutputStream(sock.getOutputStream());
} catch (IOException e1) {
e1.printStackTrace();
}
while(true) {
try {
dos.writeUTF("Time/lotto/wise 중 하나를 입력해주세요");
String msg = dis.readUTF();
//축약하면 안됨. 그러면 if문에서 아닐때 else if 문으로 가는데 그러면 2번 이상 utf를 받아야하고 클라이언트에서는 자신의 답을 듣기 위하여 몇번을 입력해야할지 모른다.
//if(msg.contentEquals(dis.readUTF())){
// }else if(msg.contentEquals(dis.readUTF())) {}
//매우 위험
if(msg.contentEquals("Time")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy"+"년 " + "MM" + "월 " + "dd" + "일 " + "HH:mm:ss");
String strTime = sdf.format(System.currentTimeMillis());
dos.writeUTF("현재시간 : " + strTime);
}else if(msg.contentEquals("lotto")) {
Set<Integer> set = new HashSet<>();
while(set.size() < 7) {
set.add((int) (Math.random() *45+1));
}
String strLotto = set.toString();
dos.writeUTF("오늘의 로또 : " + strLotto);
}else if(msg.contentEquals("wise")) {
String[] wise = new String[] {"Seeing is believing.",
"Whatever you do, make it pay.",
"You will never know until you try.",
" No sweat, no sweet.",
"Let bygones be bygones."};
int index = (int)Math.random()*5;
String strWise = wise[index];
dos.writeUTF("오늘의 운세 : " + strWise);
}else {
dos.writeUTF("다시 입력해주세요.");
}
dos.flush();
}catch(Exception e){
}
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Client4 {
public static void main(String[] args) {
try {
Socket sock = new Socket("192.168.60.28", 50000); //192.168.60.28 //127.0.0.1
DataInputStream dis = new DataInputStream(sock.getInputStream());
DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
while(true) {
System.out.println(dis.readUTF());
dos.writeUTF(JOptionPane.showInputDialog("입력창"));
dos.flush();
System.out.println(dis.readUTF());
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Server4 {
public static void main(String[] args) throws Exception { //실습하는 동안만 throws
ServerSocket server = new ServerSocket(50000);
System.out.println("서버가 구동되었습니다.");
while(true) {
try {
Socket sock = server.accept();//accept리턴값을 받을 변수 만들기
new TLWThread(sock).start();
}catch(Exception e) {
}
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.text.SimpleDateFormat;
public class TLWThread extends Thread {
private Socket sock;
DataInputStream dis;
DataOutputStream dos;
public TLWThread(Socket sock) {
this.sock = sock;
}
public void run() {
System.out.println(sock.getInetAddress() + " 에서 연결하였습니다.");///192.168.60.19 에서 연결하였습니다.
try {
dis = new DataInputStream(sock.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
try {
dos = new DataOutputStream(sock.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
while(true) {
try {
dos.writeUTF("time/lotto/wise 중 하나를 입력해주세요");
String msg = dis.readUTF(); // 축약시 if문 조건 넘어 갈때마다 값 입력 받아야함
if(msg.contentEquals("time")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년MM월dd일 hh시mm분ss초");
String strTime = sdf.format(System.currentTimeMillis());
dos.writeUTF("현재시간 : "+ strTime);
}else if(msg.contentEquals("lotto")) {
int[] lotto = new int[45];
for(int i=0; i<lotto.length; i++) {
lotto[i]=i+1;
}
for(int i =0; i< 500; i++) {
int x = (int)(Math.random()*45);
int y = (int)(Math.random()*45);
int tmp = lotto[x];
lotto[x] = lotto[y];
lotto[y] = tmp;
}
String printLt =
"("+lotto[0]+") ("+lotto[1]+") ("+lotto[2]+") ("+lotto[3]+") ("+lotto[4]+") ("+lotto[5]+")";
dos.writeUTF("로또번호 : "+printLt);
}else if(msg.contentEquals("wise")) {
String[] str =new String[] {
"To be conscious that you are ignorant is a great step to knowledge. -Benjamin Disraeli-",
"Paradise is where I am. -Voltaire-",
"You may be disappointed if you fail, but you are doomed if you don't try. -Beverly Sills-"
};
dos.writeUTF("오늘의명언 : "+str[(int)(Math.random()*3)]);
}else {
dos.writeUTF("입력값을 확인해 주세요");
}
dos.flush();
}catch(Exception e){
}
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Client4 {
public static void main(String[] args) {
try {
Socket sock = new Socket("127.0.0.1", 50000); //192.168.60.28 //127.0.0.1
DataInputStream dis = new DataInputStream(sock.getInputStream());
DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
while(true) {
System.out.println(dis.readUTF());
dos.writeUTF(JOptionPane.showInputDialog("입력창"));
dos.flush();
System.out.println(dis.readUTF());
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
질의응답
import java.util.Scanner;
class A{
}
public class Temp {
public static void main(String[] args) {
A a = new A(); // 인스턴스의 주소를 담는다
System.out.println(a); //A@15db9742, 자바는 주소를 숨김, 그 대신에 고유값을 보여줌
System.out.println(a.toString());//암묵적문법,결과는 같은 문법
//.toString은 Object에서 상속받은 기능
//만드는 사람이 오버라이드를 어떻게 했느냐에 따라 달라짐
Scanner sc = new Scanner(System.in);
System.out.println(sc);
int[] arr = new int[3];
System.out.println(arr);
// List<Integer> li = new ArrayList;
}
}
Collection Framework ( List (소량데이터, 중복허용, 순서유지) / Set (검색성능 뛰어남, 중복허용안함, 순서유지안함) / Map (Set+key) )
API < Library < Framework
API : 웹api 네이버지도, 프라이빗한 부분 보이지 않음
Library : 기능을 포함한 도구
Framework : 라이브러리가 다수 포함된 규약
네트워크
TCP / Socket / ServerSocket / IP / PORT / Stream / Server & Client
강사님 서버에 클라이언트로 접속
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Client {
public static void main(String[] args) {
try {
Socket sock = new Socket("192.168.60.57", 50000);
OutputStream os= sock.getOutputStream(); //보내기 통로 만들기
DataOutputStream dos = new DataOutputStream(os); //통로 업그레이드
dos.writeUTF("스트링상수");
dos.flush();
}catch(Exception e) {
e.printStackTrace();
}
}
}
채팅하기
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Server {
public static void main(String[] args) {
String msg = null;
try {
ServerSocket server = new ServerSocket(50000);
System.out.println("서버를 가동했습니다.");
Socket sock = server.accept();
System.out.println(sock.getInetAddress() + " 에서 연결");
DataInputStream dis =
new DataInputStream(sock.getInputStream());
DataOutputStream dos =
new DataOutputStream(sock.getOutputStream());
while(true) {
dos.writeUTF(JOptionPane.showInputDialog("보낼 메세지를 입력하세요"));
dos.flush();
System.out.println("나 : "+dos);
System.out.println(sock.getInetAddress()+" : "+dis.readUTF());
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Client {
public static void main(String[] args) {
try {
Socket sock = new Socket("192.168.60.19", 50000);
DataInputStream dis =
new DataInputStream(sock.getInputStream());
DataOutputStream dos =
new DataOutputStream(sock.getOutputStream());
while(true) {
dos.writeUTF(JOptionPane.showInputDialog("보낼 메세지를 입력하세요"));
dos.flush();
System.out.println("나 : "+dos);
System.out.println(sock.getInetAddress()+" : "+dis.readUTF());
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
File
인자값을 넣어라
import java.io.File;
//File class
public class Exam_01 {
public static void main(String[] args) {
//하드디스크의 특정 파일
File file = new File("d:/연습폴더/jl1.0.1.jar");
System.out.println("파일 존재 여부 : "+file.exists());
System.out.println("파일 사이즈 : "+file.length());
System.out.println("파일인가? : "+file.isFile());
System.out.println("폴더인가? : "+file.isDirectory());
System.out.println("파일의 경로 : "+file.getAbsolutePath());
System.out.println("파일의 이름 : "+file.getName());
System.out.println("파일의 상위 폴더 : "+file.getParent());
// file.delete();
File folder = new File("d:/연습폴더");
File[] files = folder.listFiles();
for(File f: files) { //컬렉션 대상으로는 for-each 문 사용가능
System.out.println(f.getName()+" : "+f.length());
// f.delete();
}
}
}
결과
파일 목록 읽어오기
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Server {
public static void main(String[] args) {
String msg = null;
try {
ServerSocket server = new ServerSocket(50000);
System.out.println("서버를 가동했습니다.");
Socket sock = server.accept();
System.out.println(sock.getInetAddress() + " 에서 연결");
DataInputStream dis =
new DataInputStream(sock.getInputStream());
DataOutputStream dos =
new DataOutputStream(sock.getOutputStream());
File root = new File("D:/연습폴더");
File[] files = root.listFiles();
dos.writeInt(files.length); // filse배열사이즈(개수) 알려주기
for(File f: files) { //컬렉션이므로 for-each문으로 반복
dos.writeUTF(f.getName());
System.out.println(f.getName());
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Client {
public static void main(String[] args) {
try {
Socket sock = new Socket("192.168.60.57", 50000);
DataInputStream dis =
new DataInputStream(sock.getInputStream());
DataOutputStream dos =
new DataOutputStream(sock.getOutputStream());
int filesLength =dis.readInt(); // int로 읽어오기
System.out.println("파일 개수 : "+filesLength);
List<String> list = new ArrayList<>();
for(int i=0; i<filesLength; i++) {
list.add(dis.readUTF());
}
System.out.println(list);
}catch(Exception e) {
e.printStackTrace();
}
}
}
파일 목록 받고 특정 파일 선택하기
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
String msg = null;
try {
ServerSocket server = new ServerSocket(50000);
System.out.println("서버를 가동했습니다.");
Socket sock = server.accept();
System.out.println(sock.getInetAddress() + " 에서 연결");
DataInputStream dis =
new DataInputStream(sock.getInputStream());
DataOutputStream dos =
new DataOutputStream(sock.getOutputStream());
File root = new File("D:/연습폴더");
File[] files = root.listFiles();
dos.writeInt(files.length); //files배열사이즈(개수) 알려주기
for(File f: files) { //컬렉션이므로 for-each문으로 반복
dos.writeUTF(f.getName());
System.out.println(f.getName());
}
String fileName = dis.readUTF();
System.out.println(sock.getInetAddress()+ " 님의 선택 파일 : "+fileName);
}catch(Exception e) {
e.printStackTrace();
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
public class Client {
public static void main(String[] args) {
try {
Socket sock = new Socket("192.168.60.57", 50000);
DataInputStream dis =
new DataInputStream(sock.getInputStream());
DataOutputStream dos =
new DataOutputStream(sock.getOutputStream());
int filesLength =dis.readInt(); // int로 읽어오기
System.out.println("파일 개수 : "+filesLength);
List<String> list = new ArrayList<>();
for(int i=0; i<filesLength; i++) {
list.add(dis.readUTF());
}
System.out.println(list);
dos.writeUTF(JOptionPane.showInputDialog("파일명을 입력하세요"));
dos.flush();
}catch(Exception e) {
e.printStackTrace();
}
}
}
파일 전송
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
String msg = null;
try {
ServerSocket server = new ServerSocket(50000);
System.out.println("서버를 가동했습니다.");
Socket sock = server.accept();
System.out.println(sock.getInetAddress() + " 에서 연결");
DataInputStream dis =
new DataInputStream(sock.getInputStream());
DataOutputStream dos =
new DataOutputStream(sock.getOutputStream());
while(true) {
File root = new File("D:/연습폴더");
root.listFiles(); //파일형 배열이 리턴타입. 폴더안에있는 파일들을 배열에 담음*
File[] files = root.listFiles();
dos.writeInt(files.length); //files배열사이즈(개수) 알려주기
dos.flush();//*
for(File f: files) { //컬렉션이므로 for-each문으로 반복
dos.writeUTF(f.getName());
dos.flush();//*
}
String fileName = dis.readUTF();
System.out.println(sock.getInetAddress()+ " 님의 선택 파일 : "+fileName);
//여기서 오류?
File target = new File("d:/연습폴더/"+fileName);
//파일 스트림 만들기 (하드디스크 내용을 램으로 불러오기, 기준점은 램)
FileInputStream fis = new FileInputStream(target); // FileInputStream은 빨대
DataInputStream fileDis = new DataInputStream(fis); // 업그레이드
//파일 사이즈 보내주기
dos.writeLong(target.length());
dos.flush();
//가져온 파일을 담을 장소 필요, 파일은 이진수이므로 바이트 배열이 적합
byte[] fileContents = new byte[(int)target.length()];//파일의 사이즈 만큼의 바이트배열 만들기
//배열을 만들때 사이즈는 int로만 만들 수 있음
fileDis.readFully(fileContents);//한번에 읽어오기
//하드디스크 내용을 램으로 불어오는 과정 끝
dos.write(fileContents);
dos.flush();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Client {
public static void main(String[] args) throws Exception{
Socket sock = new Socket("192.168.60.19", 50000);//"127.0.0.1" 나혼자할때!
DataInputStream dis =
new DataInputStream(sock.getInputStream());
DataOutputStream dos =
new DataOutputStream(sock.getOutputStream());
int filesLength =dis.readInt(); // int로 읽어오기
System.out.println("파일 개수 : "+filesLength);
for(int i=0; i<filesLength; i++) {
System.out.println(dis.readUTF());
}
dos.writeUTF(JOptionPane.showInputDialog("서버로부터 받을 파일명을 입력하세요"));
dos.flush();
//파일을 받으려면 바이트배열 생성, 바이트배열 만들려면 파일사이즈 알아야
long fileSize = dis.readLong();
System.out.println("파일 사이즈 : "+fileSize);
byte[] fileContents = new byte[(int)fileSize];
dis.readFully(fileContents);//여기부터 오류
FileOutputStream fos = new FileOutputStream("d:/연습폴더/전송완료.txt"); //저장할 위치
DataOutputStream fileDos = new DataOutputStream(fos);
fileDos.write(fileContents);
fileDos.flush();
fileDos.close();
}
}
*서버측에서 도중에 연결 끊기지 않도록 while문 사용
*데이터 보내줄 때마다 잊지말고 .flush()
병행처리 : 쓰레드
Thread - 컴퓨터 내에서 일을 처리하는 단위 범용성문법, 운영체제에 의해 관리되는 일의 단위 싱글 스레드 프로세스 하나의 프로세스 안에 여러개의 스레드 : 멀티 스레드 프로세스 운영 체제의 스케쥴링 알고리즘 우선순위에 따라 스레드에 배정하는 시간 달라짐
Java에서 Thread를 구현하는 5-Step
Thread 클래스를 상속받는 사용자 정의 클래스를 생성한다.
Thread 클래스로부터 상속받은 public void run 메서드를 오버라이딩 한다.
public void run 메서드 내에 병행처리 할 코드를 작성한다.
작성된 사용자 정의 클래스를 바탕으로 인스턴스를 생성한다.
생성된 인스턴스로부터 start() 메서드를 호출한다.
class Worker extends Thread{ // 오버라이딩 등을 하라는 에러 없음 > 추상메서드를 포함하지 않음
//디폴트 컨스트럭터안에 super();> 인자값이 없음 > 인자를 갖지 않는 생성자 존재
public void run() {// 초록색 화살표, 오버라이딩 되었다.
for(int i =0; i<=10; i++) {
System.out.println(i);
}
}
}
public class Exam_02 {
public static void main(String[] args) {
// Thread - 컴퓨터 내에서 일을 처리하는 단위
// 범용성문법, 운영체제에 의해 관리되는 일의 단위
// 싱글 스레드 프로세스
// 하나의 프로세스 안에 여러개의 스레드 : 멀티 스레드 프로세스
// 운영 체제의 스케쥴링 알고리즘 우선순위에 따라 스레드에 배정하는 시간 달라짐
Worker w = new Worker();
w.start(); //start와 동시에 스레드 추가, 싱글스레드로 시작했다가
for(int i =0; i<=10; i++) {
System.out.println(i);
}
}
}
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Exam_01 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
// 데이터 입력 순서가 존재
// 종복을 허용
list.add("Hellow");
list.add("World");
list.add("Java");
list.add("World");
System.out.println(list);
Set<String> set = new HashSet<>();
// 입력된 데이터에 순서 존재 X
// 중복 허용 X
//
set.add("Hellow");
set.add("World");
set.add("Java");
set.add("Hellow");
System.out.println(set);
}
}
List
중복허용
데이터 보관용으로 많이 쓰임
Set
자체적인 알고리즘 적용으로 순서 꼬임
중복허용하지 않음
나중에 들어온 데이터가 원래 데이터를 빼냄
중복을 허용하지 않기 때문에 범용성 잇게 쓰이진 않음
데이터 검색 및 중복 제거용으로 많이 쓰임
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Exam_01 {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
while(set.size() < 7) {
set.add((int)(Math.random()*45+1));
}
System.out.println(set);
//Set은 순서가 없기 때문에 get매서드가 없다
for(Integer tmp : set) {
System.out.println(tmp);
}
}
}
Map
Map
public class Exam_01 {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Hundred", 100);
map.put("Two", 2);
map.put("Three", 3);
map.put("Four", 4);
map.put("Five", 5);
map.put("Three", 100);
System.out.println(map);
//key set 순서가 없고 중복허용 X
//set은 중복시 나중에 들어간 값을 살린다. {Five=5, Four=4, Hundred=100, Two=2, Three=100}
//Key로 검색이 가능
}
}
Port : 장치 내에서 서비스를 식별하는 고유 번호 값 , 1~1024(Well Known Port)는 피하는게 좋다.
TCP (Transmission Control Protocol)
보내는 사람이 받는 사람에게 계속 확인 받음
안전성을 중시하고 상대적으로 성능이 떨어지는 방식
UDP (User Datagram Protocol)
성능을 중시하고 상대적으로 데이터 안전성이 떨어지는 방식
스트리밍 서비스
Socket
네트워크 프로그램 내에서 통신을 위해 필수적으로 필요한 논리적 단말기
데이터 통신을 제외한 세션의 연결 (통신 정보의 교환)까지만을 담당.
Stream : 네트워크 프로그램에서 실질적 데이터 통신을 담당하는 논리적 통로
ServerSocket : 서버측 네트워크 프로그램이 n대의 클라이언트와 통신하기 위해 Socket을 생성하게 이용하는 객체
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception { //실습하는 동안만 throws
ServerSocket server = new ServerSocket(10000);
//Lan카드로부터 데이터가 들어오는 것을 감시
//while(true)무한루프가 누군가 접속하면 break를 타고 나감
//public Socket accept()
//클라이언트 접속 시 콘솔창 빨간불 꺼짐
//안될경우 서버측컴퓨터 방화벽 문제일 경우가 많음
System.out.println("서버가 구동되었습니다.");
System.out.println("클라이언트 연결을 대기 중 입니다...");
Socket sock = server.accept(); //accept리턴값을 받을 변수 만들기
System.out.println(sock.getInetAddress() + " 에서 연결하였습니다.");
//
}
}
실행중인데 또 실행버튼 누를 경우 : 포트번호가 겹치면서 에러 : Address
firewall.cpl
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
Socket sock = new Socket("192.168.60.19",10000); // ("서버측 ip",포트번호)
}
}
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception { //실습하는 동안만 throws
ServerSocket server = new ServerSocket(10000);
//Lan카드로부터 데이터가 들어오는 것을 감시
//while(true)무한루프가 누군가 접속하면 break를 타고 나감
//public Socket accept()
//클라이언트 접속 시 콘솔창 빨간불 꺼짐
//안될경우 서버측컴퓨터 방화벽 문제일 경우가 많음
System.out.println("서버가 구동되었습니다.");
System.out.println("클라이언트 연결을 대기 중 입니다...");
Socket sock = server.accept(); //accept리턴값을 받을 변수 만들기
System.out.println(sock.getInetAddress() + " 에서 연결하였습니다.");///192.168.60.19 에서 연결하였습니다.
OutputStream os= sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
//DataOutputStream 단독으로 생성되는게 아니라 OutputStream을 업그레이드
dos.writeUTF("접속 성공!"); //택배차에 실리기만 함
dos.flush(); //택배차 출발 명령
}
}
import java.io.OutputStream; // io는 input output 관련
OutputStream과 DataOutputStream의 기능 차이
import java.io.DataInputStream;
import java.io.InputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
Socket sock = new Socket("192.168.60.19",10000); // ("서버측 ip",포트번호)
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
String msg = dis.readUTF();
System.out.println(msg);
}
}
프로토콜 : 통신하는 두 주체가 어떻게 통신할지 정해놓은 약속
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Server {
public static void main(String[] args) throws Exception { //실습하는 동안만 throws
ServerSocket server = new ServerSocket(10000);
//Lan카드로부터 데이터가 들어오는 것을 감시
//while(true)무한루프가 누군가 접속하면 break를 타고 나감
//public Socket accept()
//클라이언트 접속 시 콘솔창 빨간불 꺼짐
//안될경우 서버측컴퓨터 방화벽 문제일 경우가 많음
System.out.println("서버가 구동되었습니다.");
System.out.println("클라이언트 연결을 대기 중 입니다...");
Socket sock = server.accept(); //accept리턴값을 받을 변수 만들기
System.out.println(sock.getInetAddress() + " 에서 연결하였습니다.");///192.168.60.19 에서 연결하였습니다.
OutputStream os= sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
//DataOutputStream 단독으로 생성되는게 아니라 OutputStream을 업그레이드
dos.writeUTF(JOptionPane.showInputDialog("보낼 메세지를 입력하세요.")); //택배차에 실리기만 함
dos.flush(); //택배차 출발 명령
}
}
import java.io.DataInputStream;
import java.io.InputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
Socket sock = new Socket("192.168.60.19",10000); // ("서버측 ip",포트번호)
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
while(true) {
String msg = dis.readUTF();
System.out.println(msg);
}
}
}
받은 메세지
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Server {
public static void main(String[] args) throws Exception { //실습하는 동안만 throws
ServerSocket server = new ServerSocket(10000);
//Lan카드로부터 데이터가 들어오는 것을 감시
//while(true)무한루프가 누군가 접속하면 break를 타고 나감
//public Socket accept()
//클라이언트 접속 시 콘솔창 빨간불 꺼짐
//안될경우 서버측컴퓨터 방화벽 문제일 경우가 많음
System.out.println("서버가 구동되었습니다.");
System.out.println("클라이언트 연결을 대기 중 입니다...");
Socket sock = server.accept(); //accept리턴값을 받을 변수 만들기
System.out.println(sock.getInetAddress() + " 에서 연결하였습니다.");///192.168.60.19 에서 연결하였습니다.
OutputStream os= sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
while(true) {
dos.writeUTF(JOptionPane.showInputDialog("보낼 메세지를 입력하세요."));
dos.flush();
String msg = dis.readUTF();
System.out.println(msg);
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Client {
public static void main(String[] args) throws Exception {
Socket sock = new Socket("192.168.60.19",10000); // ("서버측 ip",포트번호)
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
OutputStream os= sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
while(true) {
String msg = dis.readUTF();
System.out.println(msg);
dos.writeUTF(JOptionPane.showInputDialog("보낼 메세지를 입력하세요."));
dos.flush();
}
}
}
메세지 주고 받기
현재 시간
import java.text.SimpleDateFormat;
public class Temp {
public static void main(String[] args) {
System.out.println(System.currentTimeMillis());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String strTime = sdf.format(System.currentTimeMillis());
System.out.println(strTime);
}
}
client가 "time"보내면 시간 알려주기
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
public class Server {
public static void main(String[] args) throws Exception { //실습하는 동안만 throws
ServerSocket server = new ServerSocket(10000);
//Lan카드로부터 데이터가 들어오는 것을 감시
//while(true)무한루프가 누군가 접속하면 break를 타고 나감
//public Socket accept()
//클라이언트 접속 시 콘솔창 빨간불 꺼짐
//안될경우 서버측컴퓨터 방화벽 문제일 경우가 많음
System.out.println("서버가 구동되었습니다.");
System.out.println("클라이언트 연결을 대기 중 입니다...");
Socket sock = server.accept(); //accept리턴값을 받을 변수 만들기
System.out.println(sock.getInetAddress() + " 에서 연결하였습니다.");///192.168.60.19 에서 연결하였습니다.
OutputStream os= sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
while(true) {
// dos.writeUTF(JOptionPane.showInputDialog("time"));
// dos.flush();
String msg = dis.readUTF();
if(msg.contentEquals("time")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년MM월dd일 hh시mm분ss초");
String strTime = sdf.format(System.currentTimeMillis());
dos.writeUTF(strTime);
dos.flush();
}
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Client {
public static void main(String[] args) throws Exception {
Socket sock = new Socket("192.168.60.19",10000); // ("서버측 ip",포트번호)
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
OutputStream os= sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
while(true) {
dos.writeUTF(JOptionPane.showInputDialog("time"));
dos.flush();
String msg = dis.readUTF();
System.out.println(msg);
}
}
}
기능 추가
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
public class Server {
public static void main(String[] args) throws Exception { //실습하는 동안만 throws
ServerSocket server = new ServerSocket(10000);
//Lan카드로부터 데이터가 들어오는 것을 감시
//while(true)무한루프가 누군가 접속하면 break를 타고 나감
//public Socket accept()
//클라이언트 접속 시 콘솔창 빨간불 꺼짐
//안될경우 서버측컴퓨터 방화벽 문제일 경우가 많음
System.out.println("서버가 구동되었습니다.");
System.out.println("클라이언트 연결을 대기 중 입니다...");
Socket sock = server.accept(); //accept리턴값을 받을 변수 만들기
System.out.println(sock.getInetAddress() + " 에서 연결하였습니다.");///192.168.60.19 에서 연결하였습니다.
OutputStream os= sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
while(true) {
// dos.writeUTF(JOptionPane.showInputDialog("time"));
// dos.flush();
String msg = dis.readUTF(); //상대가 보낸 dis읽어서 msg에 넣기
//if-else if문 조건마다 넣어준는 경우 매번 받아야하나? > 한번만 받도록 코드짤것!
if(msg.contentEquals("time")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년MM월dd일 hh시mm분ss초");
String strTime = sdf.format(System.currentTimeMillis());
dos.writeUTF(strTime);
dos.flush(); //시간 보내기
}else if(msg.contentEquals("lotto")) {
int[] lotto = new int[45];
for(int i=0; i<lotto.length; i++) {
lotto[i]=i+1;
}
for(int i =0; i< 500; i++) {
int x = (int)(Math.random()*45);
int y = (int)(Math.random()*45);
int tmp = lotto[x];
lotto[x] = lotto[y];
lotto[y] = tmp;
}
String printLt =
"로또번호 : ("+lotto[0]+") ("+lotto[1]+") ("+lotto[2]+") ("+lotto[3]+") ("+lotto[4]+") ("+lotto[5]+")";
dos.writeUTF(printLt);
dos.flush();
}else if(msg.contentEquals("wiseword")) {
String[] str =new String[] {
"To be conscious that you are ignorant is a great step to knowledge. -Benjamin Disraeli-",
"Paradise is where I am. -Voltaire-",
"You may be disappointed if you fail, but you are doomed if you don't try. -Beverly Sills-"
};
dos.writeUTF(str[(int)(Math.random()*3)]);
dos.flush();
}
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Client {
public static void main(String[] args) throws Exception {
Socket sock = new Socket("192.168.60.19",10000); // ("서버측 ip",포트번호)
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
OutputStream os= sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
while(true) {
dos.writeUTF(JOptionPane.showInputDialog("time/lotto/wiseword")); //아웃풋창 열기
dos.flush(); // 보내기
String msg = dis.readUTF(); //dis 받아서 msg 출력
System.out.println(msg);
}
}
}
로그인
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JOptionPane;
public class Server {
public static void main(String[] args) throws Exception { //실습하는 동안만 throws
ServerSocket server = new ServerSocket(10000);
System.out.println("서버가 구동되었습니다.");
System.out.println("클라이언트 연결을 대기 중 입니다...");
Socket sock = server.accept(); //accept리턴값을 받을 변수 만들기
System.out.println(sock.getInetAddress() + " 에서 연결하였습니다.");///192.168.60.19 에서 연결하였습니다.
OutputStream os= sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
Map<String, String> map = new HashMap<>();
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
map.put("d", "4");
map.put("e", "5");
while(true) {
String id = dis.readUTF(); //반복문 안에
String pw = dis.readUTF();
String a = "";
if(map.get(id).contentEquals(pw)) {
a = "성공";
}else {
a = "실패";
}
dos.writeUTF(a);
dos.flush();
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Client {
public static void main(String[] args) throws Exception {
Socket sock = new Socket("192.168.60.19",10000); // ("서버측 ip",포트번호)
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
OutputStream os= sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
while(true) {
dos.writeUTF(JOptionPane.showInputDialog("아이디를 입력하세요")); //아웃풋창 열기
dos.flush();
dos.writeUTF(JOptionPane.showInputDialog("비밀번호를 입력하세요"));
dos.flush(); // 보내기
String msg = dis.readUTF(); //상대가 보내는 dis 받아서 msg 출력
System.out.println(msg);
}
}
}
boolean, writeBoolean
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JOptionPane;
public class Server {
public static void main(String[] args) throws Exception { //실습하는 동안만 throws
ServerSocket server = new ServerSocket(10000);
System.out.println("서버가 구동되었습니다.");
System.out.println("클라이언트 연결을 대기 중 입니다...");
Socket sock = server.accept(); //accept리턴값을 받을 변수 만들기
System.out.println(sock.getInetAddress() + " 에서 연결하였습니다.");///192.168.60.19 에서 연결하였습니다.
OutputStream os= sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
Map<String, String> map = new HashMap<>();
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
map.put("d", "4");
map.put("e", "5");
while(true) {
String id = dis.readUTF(); //반복문 안에
String pw = dis.readUTF();
boolean b ;
if(map.get(id).contentEquals(pw)) {
b = true;
}else {
b = false;
}
dos.writeBoolean(b);
dos.flush();
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Client {
public static void main(String[] args) throws Exception {
Socket sock = new Socket("192.168.60.19",10000); // ("서버측 ip",포트번호)
InputStream is = sock.getInputStream();
DataInputStream dis = new DataInputStream(is);
OutputStream os= sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
while(true) {
dos.writeUTF(JOptionPane.showInputDialog("아이디를 입력하세요")); //아웃풋창 열기
dos.flush();
dos.writeUTF(JOptionPane.showInputDialog("비밀번호를 입력하세요"));
dos.flush(); // 보내기
// String msg = dis.readUTF(); //상대가 보내는 dis 받아서 msg 출력
// System.out.println(msg);
boolean b = dis.readBoolean();
if(b) {
System.out.println("성공");
}else{
System.out.println("실패");
}
}
}
}
import java.util.ArrayList;
public class Exam_02 {
public static void main(String[] args) {
ArrayList str = new ArrayList(); //무슨형 배열인지? 다형성을 가진 배열 Object형
str.add("Hello"); //메서드
str.add(100); //ArrayList는 사이에 자료가 비어있는것을 용납하지 않음
str.add("Java");//앞을 비워놓고 자료를 넣어도 동적으로 자료를 땡겨오기 떄문에 번호를 명시할 이유가 없음
//자료를 많이 넣던 적게 넣던 알아서 늘어나기 때문에 신경 쓸 필요 없음
System.out.println(str.get(1)); //world
str.remove(1);
System.out.println(str.get(1)); //Java
str.add(1,"world");
System.out.println(str.get(1)); //world
System.out.println(str.get(2)); //Java
((String)str.get(1)).length();
//하나의 저장소에 서로 다른 타입을 묶는 경우 많지 않음
//다른 타입이 있어도 그걸 클래스에서 배열로 저장
//str.size() //ArrayList 몇개 들었나 확인
}
}
ArrayList는 다형성을 가진다. String도 숫자도 다 들어감
ArrayList는 Object형
Object형이 무조건 좋지는 않다.
Object에 넣을 경우. Object형 기능만 접근가능. 하위 기능(본래)을 쓸수 없다.
꺼내서 쓸때마다 매번 다운 캐스팅을 해야함
하나의 저장소에 서로 다른 타입을 묶는 경우 많지 않음
다른 타입이 있어도 클래스에서 별도 배열로 저장해서 사용
import java.util.ArrayList;
public class Manager {
private ArrayList members = new ArrayList();
public void addMember(Member m) {
members.add(m);
}
public void printMember() {
System.out.println("=== 회원 목록 ===");
System.out.println("아이디\t이름\t포인트\t보너스");
for(int i=0; i< members.size() ; i++) {
System.out.println(
((Member)members.get(i)).getId() +"\t"
+((Member)members.get(i)).getName()+"\t"
+((Member)members.get(i)).getPoint()+"\t"
+((Member)members.get(i)).getBonus()
);
}
}
}
Generic
Java 1.5 부터 추가된 기능
ArrayList<String>ArrayList str = new ArrayList();
import java.util.ArrayList;
//Generic
public class Exam_02 {
public static void main(String[] args) {
ArrayList<String> str = new ArrayList<String>();
str.add("Hello");
str.add("World");
str.add("Java");
}
}
import java.util.ArrayList;
public class Manager {
private ArrayList<Member> members = new ArrayList<Member>();
public void addMember(Member m) {
members.add(m);
}
public void printMember() {
System.out.println("=== 회원 목록 ===");
System.out.println("아이디\t이름\t포인트\t보너스");
for(int i=0; i< members.size() ; i++) {
System.out.println(
(members.get(i)).getId() +"\t"
+(members.get(i)).getName()+"\t"
+(members.get(i)).getPoint()+"\t"
+(members.get(i)).getBonus()
);
}
}
}
Foreach
( 담을 변수 : 컬렉션 )
자동으로 요소가 바닥나면 멈춘다.
.get()을 입력하지 않아도 나옴
반복문 구동 뿐 아니라 활용과 통제에도 쓰이는 i값이 없다.
전체는 반복하는 경우 더 간결하므로 foreach문이 쓰인다
import java.util.ArrayList;
public class Exam_02 {
public static void main(String[] args) {
ArrayList<String> str = new ArrayList<String>(); //Generic
str.add("Hello");
str.add("World");
str.add("Java");
// for(int i = 0 ; i< str.size(); i++) {
// System.out.println(str.get(i));
// }
// foreach //오른쪽에 컬렉션
for(String tmp : str) {
System.out.println(tmp);
}
}
}
import java.util.ArrayList;
//Foreach문
public class Manager {
private ArrayList<Member> members = new ArrayList<Member>();
public void addMember(Member m) {
members.add(m);
}
public void printMember() {
System.out.println("=== 회원 목록 ===");
System.out.println("아이디\t이름\t포인트\t보너스");
for(Member tmp : members) {
System.out.println(tmp.getId() + "\t" + tmp.getName() + "\t" +
tmp.getPoint() + "\t" + tmp.getBonus());
}
}
}
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayListMain {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Student> std = new ArrayList<Student>();
int id = 1001;
while(true) {
try {
System.out.println(" ===== 학생 관리 시스템 ===== ");
System.out.println("1. 신규 정보 등록");
System.out.println("2. 학생 정보 조회");
System.out.println("3. 학생 정보 검색 (이름)");
System.out.println("4. 학생 정보 삭제 (학번)");
System.out.println("5. 종료하기");
System.out.print(">>>");
String menu = sc.nextLine();
if(menu.contentEquals("1")) {
System.out.print("학생 이름 : ");
String name = sc.nextLine();
System.out.print("국어 점수 : ");
int kor = Integer.parseInt(sc.nextLine());
System.out.print("영어 점수 : ");
int eng = Integer.parseInt(sc.nextLine());
System.out.print("수학 점수 : ");
int math = Integer.parseInt(sc.nextLine());
Student tmp = new Student(String.valueOf(id++),name,kor,eng,math);
std.add(tmp);
}else if(menu.contentEquals("2")) {
Manager.printStudent(std);
}else if(menu.contentEquals("3")) {
System.out.print("검색할 학생 이름 : ");
String search = sc.nextLine();
Manager.searchStudent(search,std);
}else if(menu.contentEquals("4")) {
System.out.print("삭제할 학생 학번 : ");
String delect = sc.nextLine();
Manager.removeStudent(delect,std);
}else if(menu.contentEquals("5")) {
System.out.println("시스템을 종료합니다.");
System.exit(0);
}else {
System.out.println("메뉴를 다시 확인하세요");
}
}catch(Exception e) {
}
}
}
}
import java.util.ArrayList;
public class Manager {
private ArrayList<Student> std = new ArrayList<Student>();
public void addStudent(Student s) {
std.add(s);
}
public static void printStudent(ArrayList<Student> std) {
System.out.println(" ===== 학생 정보 목록 ===== ");
System.out.println("이름\t국어\t영어\t수학\t합계\t평균");
for(Student tmp : std) {
System.out.println(tmp.getName()+"\t"+
tmp.getKor()+"\t"+
tmp.getEng()+"\t"+
tmp.getMath()+"\t"+
tmp.getSum()+"\t"+
tmp.getAvg());
}
}
public static void searchStudent(String search, ArrayList<Student> std){
boolean checkFlag = false;
for(Student tmp : std) {
if(tmp.getName().equals(search)) {
System.out.println("이름\t국어\t영어\t수학\t합계\t평균");
System.out.println(tmp.getName()+"\t"+
tmp.getKor()+"\t"+
tmp.getEng()+"\t"+
tmp.getMath()+"\t"+
tmp.getSum()+"\t"+
tmp.getAvg());
checkFlag = true;
}
}
if(!checkFlag) {System.out.println("등록된 정보가 없습니다.");}
}
public static void removeStudent(String delect, ArrayList<Student> std){
boolean checkFlag = false;
for(Student tmp : std) {
int i = 0;
if(tmp.getId().equals(delect)) {
std.remove(i);
checkFlag = true;
System.out.println(tmp.getName()+" 학생 정보가 삭제되었습니다.");
i++;
}
}
if(!checkFlag) {System.out.println("삭제할 정보가 없습니다.");}
}
}
//1)저장소 형태의 클래스 VO(밸류오브젝트 값개체) 또는 DTO(데이터 트랜스퍼 오브젝트)
//2)막강한 기능의 라이브러리
public class Student {
private String id;
private String name;
private int kor;
private int eng;
private int math;
public Student() {}
public Student(String id, String name, int kor, int eng, int math) {
super();
this.id = id;
this.name = name;
this.kor = kor;
this.eng = eng;
this.math = math;
}
public int getSum() {
return this.kor + this.eng + this.math;
}
public double getAvg() {
return getSum() / 3.0;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
}