디지털 컨버전스/JAVA

[Java] List , Set, Map

gimyeondong 2020. 2. 24. 10:04
  • 동적배열

 

  • 과거에는 '벡터'라고 불림, 현재는 ArrayList
  • 로직상 거의 유사
  • cost, 기능에서 약간 차이

 

  • 코드를 일일히 다운캐스팅을 해야 한다는 불편함
  • java1.5 에서 제너릭 문법 업데이트
  • ArrayList<자료형>자료형을 명시하여 오브젝트 배열이 자료형으로 변환
  • 단 자료형을 명시하면 다형성을 잃음. but 다형성을 필요로 하는 경우가 많지 않음

 

  • List : 추상매서드, add, remove, get
    • ArrayList
    • LinkedList
    • Vector

 

  • 같은 인터페이스를 상속 받았다.
  • 모듈화 코딩이 가능하다.

 

  • List라는 이름으로 만들고 임포트하면
  • java.awt.List : class , 그래픽
  • java.util.List L interface, 데이터저장


https://docs.oracle.com/javase/8/docs/api/

 

Java Platform SE 8

 

docs.oracle.com

자바 메뉴얼 문서

 


try{

}catch(Exception e){

}

 

try{

}catch(ArrayIndexOutOfBounds e){

}catch(NumberFormatException nfe){

}

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로 검색이 가능
	}
}

map.get(Object key)

import java.util.HashMap;
import java.util.Map;

public class Exam_01 {
	public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
		map.put("one", 1);
		map.put("Two", 2);
		map.put("Three", 3);
		map.put("Four", 4);
		map.put("Five", 5);
		map.put("Three", 100);
		
		System.out.println(map.get("one")); //1
		System.out.println(map.keySet()); // [Five, one, Four, Two, Three]
		System.out.println(map.values()); // [5, 1, 4, 2, 100]

	}
}

 

웹개발에서는 별도로 네트워크를 짤 필요 없지만 네이티브(로컬)개발에는 필요

 

네트워크 프로그래밍

 

서버 : 특정 서비스를 네트워크 상에서 오픈 시킨 서비스 제공자(장치)

클라이언트 : 서비스를 제공받는 장치

 

IP : 네트워크 상에서 장치를 식별하는 고유 주소 값

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("실패");
				
			}

		}
	}
}