[Java] List , Set, Map
- 동적배열
- 과거에는 '벡터'라고 불림, 현재는 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
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로 검색이 가능
}
}
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
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.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("실패");
}
}
}
}