서술형

문제해결 시나리오


프로그램의 유형

  • CLI : Command Line Interface
  • GUI : Graphic User Interface , 윈도우부터

 


JDK와 JRE차이

JDK : Java Development Kit , 자바를 이용한 개발 도구, 개발자를 위한 도구

  • JRE : Java Runtime Environment, 자바 실행 환경, 자바로 개발된 프로그램을 실행하기 위한 목적
  • api
  • document

Database : 효율적인 데이터 저장을 위한 데이터 파일

네트워크atm, 로그인 프로그램 > 하드디스크로 복사(자기력으로 저장하여 데이터 유지)

데이터파일보 보관 ~.dat : 비효율 안전성낮음 성능낮음

효율적 저장, 검색, 무결성 > DBMS

DBMS에 의해 관리되는 파일


문제 해결 시나리오

~~한 작업을 했는데 에러가 발생

>왜 에러가 발생했는지?

>해결답안을 쓰시오


자바 개발자는 IDE(통합개발환경)로 개발

만약 이클립스가 없다면 Ctrl + F11 대신

컴파일과 실행을 직접해야함

 

 

 

Project > Properties , 소스코드가 있는 위치 찾기
cd : change directory
javac : C:에 위치 1)cd로 그위치로 가서 명령을 내린다 2)환경변수(기억해둘 경로)

 

 

 

 

 

내pc > 속성 > 고급 시스템 설정 > 환경변수
환경변수 창 밑의 시스템변수 Path에서 새로만들기로 javac 경로 추가
cmd창 재시작 하면 javac를 찾을 수 있다.
컴파일 후 실행

 

 


평가에 네트워크 관련 코드 및 쓰레드관련 코드는 나오지 않습니다

서술형으론 나올수 있습니다
쓰레드란 무엇인가 처럼

지난번 시험에 나온 내용은 시험에 다시 나오지 않습니다


서술형 예상 문제

 

Q1. CLI와 GUI에 대해 설명

  • CLI는 커맨드 라인 인터페이스를 의미하며 명령어를 통해 시스템을 제어하는 인터페이스를 말하며
  • GUI는 그래픽 유저 인터페이스를 의미하며 그래픽 환경으로 시스템을 제어하는 인터페이스를 말한다

 

Q2. JDK와 JRE의 차이점 설명

  • JRE는 Java Runtime Environment이며 자바 프로그램을 실행 시킬 수 있는 자바 환경을 의미한다
  • JDK는 Java Development Kit이며 자바를 이용한 개발 도구이며 개발자를 위한 도구들이다. 여기에 JRE도 포함이 된다.

 

Q3. Database란 무엇인가?

  • 효율적인 데이터 저장을 위한 데이터 파일

 

Q4. 쓰레드란 무엇인가?

  • 쓰레드는 프로세스(자원을 할당받고 실행중인 프로그램)라는 작업공간에서 작업을 처리하는 일꾼으로
  • 모든 프로세스에는 최소한 하나의 쓰레드가 존재하며 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스 라고 한다
  • 프로세스의 성능이 단순히 쓰레드의 개수에 비례하는 것은 아니지만 멀티쓰레딩은 사용자의 응답성이 향상되고 작업이 분리되어 코드가 간결해지는 등의 장점이 있다.

 

Q5. 네트워크란?

  • 네트워킹이란 두대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는 것을 말한다.
  • 소켓이란 프로세스간의 통신에 사용되는 양쪽 끝단을 의미한다. 소켓을 이용한 통신 프로그래밍을 소켓프로그래밍이라고 한다.
  • TCP는 이기종 시스템간의 통신을 위한 표준 프로토콜이다. 그중 TCP는 연결 기반의 연결방식이다.
  • 소켓은 프로세스간의 통신을 담당하며 InputStream과 OutputStream을 가지고 있다.
  • 서버 소켓은 포트와 연결되어 외부의 연결요청을 기다리다 연결요청이 들어오면, 소켓을 생성해서 소켓과 소켓간의 통신이 이루어지도록 한다. 한포트에 하나의 서버소켓만 연결할 수 있다.

스트림(파일I/O) : 데이터를 운반하는데 이용되는 연결 통로

스트림(자바8) : 데이터 소스를 추상화하고 데이터를 다루는데 자주 사용되는 메서드들을 정의해 놓았다.

 

메소드(method)

  • 자바에서 클래스는 멤버(member)로 속성을 표현하는 필드(field)와 기능을 표현하는 메소드(method)를 가집니다.
  • 그중에서 메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라 할 수 있습니다.

메소드의 사용 목적

  • 클래스에서 메소드를 작성하여 사용하는 이유는 중복되는 코드의 반복적인 프로그래밍을 피할 수 있기 때문입니다.
  • 또한, 모듈화로 인해 코드의 가독성도 좋아집니다.
  • 그리고 프로그램에 문제가 발생하거나 기능의 변경이 필요할 때도 손쉽게 유지보수를 할 수 있게 됩니다.

문제해결

  • 코드 중복도                 - 상속(IS-A) 문법으로 해결
  • 클래스 간 결합도 문제   - 다형성 문법으로 해결
  • 저장소 문제                - Collection Framework로 해결

Collection Framework

  • 자바에서는 다양한 상황에서 사용할 수 있는 다양한 컨테이너를 제공하는데 이것을 컬렉션즈 프래임워크라고 부른다. 

문제 해결 시나리오

 

  • 이클립스 없이 컴파일&실행
  • 코드 (네트워크 및 쓰레드 제외)


 

Java에서 Thread를 구현하는 5-Step

 

  1. Thread 클래스를 상속받는 사용자 정의 클래스를 생성한다.
  2. Thread 클래스로부터 상속받은 public void run 메서드를 오버라이딩 한다.
  3. public void run 메서드 내에 병행처리 할 코드를 작성한다.
  4. 작성된 사용자 정의 클래스를 바탕으로 인스턴스를 생성한다.
  5. 생성된 인스턴스로부터 start() 메서드를 호출한다.
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);
		}
		
	}
}

  1. static
  2. call by reference
  3. 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;
	}
}

 

자바언어 소개&특성 -  https://www.tiobe.com/

 

Home | TIOBE - The Software Quality Company

Request Proof of Concept Request a proof of concept to have your product measured by TICS.

www.tiobe.com

범용성 문법

  • 변수 / 연산자 - 자료형 promotion casting size 등... + - * / =
  • 기본 입력 - Scanner
  • 제어문 - if / for / while / switch / break / continue
  • 난수 - 업앤다운 / 베스킨 / 경마게임 / 가위바위보
  • 배열 - 다량의 변수를 일괄 통제하는 문법 (반복문과 밀접)
  • 메서드 - 오버로딩 / 메서드의 구조

객체지향

  • 클래스 (설계도) / 인스턴스 (객체) / new
  • 초급 : 정보은닉 / getter&setter / Constuctor / this / static(병행처리 취약, 필요한 경우에만 : 프로그램 전체에서 사라지지않으며 대부분에서 쓰이는 경우)
  • 활용 : 라이브러리 활용하기 ( FTP4J / JLayer / JavaMail )
  • 중급 : 상속 (extends / 오버라이딩) / 다형성 / 추상화 (Abstract / Interface)
    • 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

  1. Thread 클래스를 상속받는 사용자 정의 클래스를 생성한다.
  2. Thread 클래스로부터 상속받은 public void run 메서드를 오버라이딩 한다.
  3. public void run 메서드 내에 병행처리 할 코드를 작성한다.
  4. 작성된 사용자 정의 클래스를 바탕으로 인스턴스를 생성한다.
  5. 생성된 인스턴스로부터 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);
		}
	}
}

 

로그인, UserInfo 클래스로 더 많은 정보 담기

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Server {
	public static void send(DataOutputStream dos, String msg) {
		try {
			dos.writeUTF(msg);
			dos.flush();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		
		Map<String, UserInfo> userInfo = new HashMap<>();
		userInfo.put("tom",new UserInfo("tom@naver.com","1234"));
		userInfo.put("susan",new UserInfo("susan@nate.com", "1324"));
		userInfo.put("jane",new UserInfo("jane@gmail.com", "5342"));
		userInfo.put("jack",new UserInfo("jack@daum.net", "9123"));
		
		try {
			ServerSocket server = new ServerSocket(30000);
			System.out.println("서버를 가동했습니다.");
			Socket sock = server.accept();
			
			DataInputStream dis = 
					new DataInputStream(sock.getInputStream());
			DataOutputStream dos = 
					new DataOutputStream(sock.getOutputStream());
			
			System.out.println(sock.getInetAddress() + " 에서 연결");
			
			String id = dis.readUTF();
			String pw = dis.readUTF();
			
			Set<String> ids = userInfo.keySet();
			if(!ids.contains(id)) {
				send(dos,"fail");
			}else {
				String checkPw = userInfo.get(id).getPw();
				if(checkPw.contentEquals(pw)) {
					send(dos,"success");
				}else {
					send(dos,"fail");
				}
			}
			
			
			
		}catch(Exception e) {
			e.printStackTrace();
			System.exit(0);
		}
	}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		try {
			Socket client = new Socket("127.0.0.1",30000);
			
			DataInputStream dis = 
					new DataInputStream(client.getInputStream());
			DataOutputStream dos = 
					new DataOutputStream(client.getOutputStream());
			
			System.out.print("아이디 : ");
			String id = sc.nextLine();
			System.out.print("패스워드 : ");
			String pw = sc.nextLine();
			
			dos.writeUTF(id);
			dos.writeUTF(pw);
			dos.flush();
			
			String resp = dis.readUTF();
			System.out.println(resp);
			
			
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}

public class UserInfo{
	private int account;
	private String email;
	private String pw;


	public UserInfo() {
		super();
	}
	public UserInfo(int account, String email, String pw) {

		this.account = account;
		this.email = email;
		this.pw =pw;
	}
	
	public int getAccount() {
		return account;
	}
	public void setAccount(int account) {
		this.account = account;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Server {
	
	public static void send(DataOutputStream dos, String msg) {
		try {
			dos.writeUTF(msg);
			dos.flush();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {

		Map<String, UserInfo> userInfo = new HashMap<>();
		userInfo.put("tom", new UserInfo(1000,"tom@naver.com","1234"));
		userInfo.put("susan",new UserInfo(1000,"susan@nate.com", "1324"));
		userInfo.put("jane",new UserInfo(1000, "jane@gmail.com", "5342"));
		userInfo.put("jack",new UserInfo(1000, "jack@daum.net", "9123"));

		try {
			ServerSocket server = new ServerSocket(30000);
			
			System.out.println("서버를 가동했습니다.");
			Socket sock = server.accept();

			DataInputStream dis = 
					new DataInputStream(sock.getInputStream());
			DataOutputStream dos = 
					new DataOutputStream(sock.getOutputStream());

			System.out.println(sock.getInetAddress() + " 에서 연결");

			
			String id = dis.readUTF();
			String pw = dis.readUTF();

			Set<String> ids = userInfo.keySet();
			if(!ids.contains(id)) {
				send(dos,"없는 아이디 입니다.");
		
			}else {
				String checkPw = userInfo.get(id).getPw();
				if(checkPw.contentEquals(pw)) {
					send(dos,"로그인 되었습니다.");
				}else {
					send(dos,"비밀번호를 잘못 입력하셨습니다.");
				}
			}

			while(true) {
				String menu = dis.readUTF(); // 메세지 받기
	
				if(menu.contentEquals("account")) {	//잔액조회

					String msg = ""+userInfo.get(id).getAccount();
					send(dos, msg);

				}else if(menu.contentEquals("deposit")) {//입금

					int deposit = Integer.parseInt(dis.readUTF());
					userInfo.get(id).setAccount(userInfo.get(id).getAccount() + deposit);
					String msg = ""+userInfo.get(id).getAccount();
					send(dos, msg);

				}else if(menu.contentEquals("withdraw")) {//출금

					int withdraw = Integer.parseInt(dis.readUTF());
					userInfo.get(id).setAccount(userInfo.get(id).getAccount() - withdraw);
					String msg = ""+userInfo.get(id).getAccount();
					send(dos, msg);

				}else {

				}
			}
		}catch(Exception e) {
			e.printStackTrace();
			System.exit(0);
		}
	}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.Scanner;

import javax.swing.JOptionPane;

public class Client {

	public static void send(DataOutputStream dos, String msg) {
		try {
			dos.writeUTF(msg);
			dos.flush();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		try {
			Socket client = new Socket("192.168.60.19",30000);//192.168.60.19
			//127.0.0.1

			DataInputStream dis = 
					new DataInputStream(client.getInputStream());
			DataOutputStream dos = 
					new DataOutputStream(client.getOutputStream());

		

				System.out.print("아이디 : ");
				String id = sc.nextLine();
				System.out.print("패스워드 : ");
				String pw = sc.nextLine();

				dos.writeUTF(id);
				dos.writeUTF(pw);
				dos.flush();

				String resp = dis.readUTF();
				System.out.println(resp); //성공 실패 표시

				while(true) {
					System.out.print("account / deposit / withdraw : ");
					String menu = sc.nextLine();

					send(dos,menu); // 보내기


					if(menu.contentEquals("account")) {//account

						String msg = dis.readUTF();
						System.out.println("잔액 : "+msg);

					}else if(menu.contentEquals("deposit")) {//deposit

						System.out.print("입금할 금액을 입력하세요 : ");
						String  deposit= sc.nextLine();
						send(dos,deposit);

						String msg = dis.readUTF();
						System.out.println("잔액 : "+msg);

					}else if(menu.contentEquals("withdraw")) {//withdraw

						System.out.print("출금할 금액을 입력하세요 : ");
						String  withdraw= sc.nextLine();
						send(dos,withdraw);

						String msg = dis.readUTF();
						System.out.println("잔액 : "+msg);
					}
				}
			

		}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 java.util.HashMap;
import java.util.Map;
import java.util.Set;


public class Server3 {


   public static void send(DataOutputStream dos, String message) {
      try {
         dos.writeUTF(message);
         dos.flush();
      }catch(Exception e) {
         e.printStackTrace();
      }
   }


   public static void main(String[] ar) {

      //아이디,비번,메일 저장
      Map<String, UserInfo> map = new HashMap<>();
      map.put("aaa", new UserInfo("1111", "aaa@naver.com", 0));
      map.put("bbb", new UserInfo("2222", "bbb@naver.com", 0));
      map.put("ccc", new UserInfo("3333", "ccc@naver.com", 0));

      Set <String> ids = map.keySet();

      try {
         ServerSocket server = new ServerSocket(10000);  //포켓번호

         System.out.println("서버가 구동되었습니다.");
         System.out.println("클라이언트가 연결을 대기중입니다...");
         Socket sock = server.accept();  //내 짝의 연결정보가들어있음

         System.out.println(sock.getInetAddress() + " 에서 연결하였습니다.");

         OutputStream os = sock.getOutputStream();
         DataOutputStream dos = new DataOutputStream(os);

         InputStream is = sock.getInputStream();
         DataInputStream dis = new DataInputStream(is);


         a:while(true) {

            //로그인
            String id = dis.readUTF();
            String pw = dis.readUTF();


            if(!ids.contains(id)) {
               send(dos, "false1");
               dis.readUTF();
               continue a;
            }else if(map.get(id).getPw().contentEquals(pw)) {
               send(dos,"true");
            }else {
               send(dos,"false2");
               dis.readUTF();
               continue a;
            }

            //메뉴에 따라 실행
            while(true) {
               String menu = dis.readUTF();

               if(menu.equals("1")) {

                  send(dos, menu);
                  send(dos,""+map.get(id).getAccount());
                  dis.readUTF();

               }else if(menu.equals("2")) {

                  send(dos, menu);
                  int input = Integer.parseInt(dis.readUTF());
                  send(dos,""+input);
                  map.get(id).setAccount(map.get(id).getAccount()+input);
                  dis.readUTF();

               }else if(menu.equals("3")) {

                  send(dos, menu);
                  int output = Integer.parseInt(dis.readUTF());

                  if(map.get(id).getAccount()<output) {
                     send(dos,"false");
                     dis.readUTF();
                  }else {
                     send(dos,"true");
                     send(dos,""+output);
                     map.get(id).setAccount(map.get(id).getAccount()-output);
                     dis.readUTF();
                  }

               }else if(menu.equals("4")) {
                  send(dos, menu);
                  send(dos,"시뮬레이터를 종료합니다.");
                  System.exit(0);
               }

            }

         }

      }catch(Exception e) {
         e.printStackTrace();
         System.exit(0);
      }


   }
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

import javax.swing.JOptionPane;

public class Client3 {
   public static void main(String[] ar) throws Exception {
      Scanner sc = new Scanner(System.in);

      Socket sock = new Socket("127.0.0.1", 10000);  //"127.0.0.1" 나혼자할때!

      InputStream is = sock.getInputStream();
      DataInputStream dis = new DataInputStream(is);

      OutputStream os = sock.getOutputStream();
      DataOutputStream dos = new DataOutputStream(os);

      a:while(true) {

         dos.writeUTF(JOptionPane.showInputDialog("    ***ATM 시뮬레이터***\n로그인 ID를 입력해주세요."));
         dos.flush();
         dos.writeUTF(JOptionPane.showInputDialog("    ***ATM 시뮬레이터***\n로그인 비밀번호를 입력해주세요."));
         dos.flush();

         String msg = dis.readUTF();  //로그인 성공여부

         if(msg.contentEquals("false1")) {
            dos.writeUTF(JOptionPane.showInputDialog("입력하신 아이디가 존재하지 않습니다."));
            dos.flush();
            continue a;
         }else if(msg.contentEquals("false2")) {
            dos.writeUTF(JOptionPane.showInputDialog("입력하신 비밀번호가 일치하지 않습니다."));
            dos.flush();
            continue a;
         }else if(msg.contentEquals("true")) {
            dos.writeUTF(JOptionPane.showInputDialog("로그인에 성공했습니다."));
         }


         //메뉴 실행
         while(true) {

            dos.writeUTF(JOptionPane.showInputDialog("    ***ATM 시뮬레이터***\n"
                  + "1. 잔액조회\n2. 입금하기\n3. 출금하기\n4. 종료하기"));
            dos.flush();


            String menu = dis.readUTF();
            if(menu.equals("1")) {

               dos.writeUTF(JOptionPane.showInputDialog("잔액조회를 선택하셨습니다.\n"
                     + "잔액 : " + dis.readUTF()));

            }else if(menu.equals("2")) {

               dos.writeUTF(JOptionPane.showInputDialog("입금하기를 선택하셨습니다."
                     + "\n얼마를 입금하시겠습니까?"));
               dos.flush();
               dos.writeUTF(JOptionPane.showInputDialog(dis.readUTF()+"원이 입금되었습니다."));

            }else if(menu.equals("3")) {

               dos.writeUTF(JOptionPane.showInputDialog("출금하기를 선택하셨습니다."
                     + "\n얼마를 출금하시겠습니까?"));
               dos.flush();

               String tf = dis.readUTF();  //출금 가능 여부 판단
               if(tf.contentEquals("false")) {
                  dos.writeUTF(JOptionPane.showInputDialog("잔액이 부족합니다."));

               }else if(tf.contentEquals("true")) {
                  dos.writeUTF(JOptionPane.showInputDialog(dis.readUTF()+"원이 출금되었습니다."));
               }


            }else if(menu.equals("4")) {

               dos.writeUTF(JOptionPane.showInputDialog("시뮬레이터를 종료합니다."));
               System.exit(0);
            }

         }


      }

   } //main 끝
}
public class UserInfo {
   private String pw;
   private String email;
   private int account;
   
   public UserInfo () {
      super();
   }
   
   public UserInfo(String pw, String email, int account) {
      this.pw = pw;
      this.email = email;
      this.account = account;
   }

   public int getAccount() {
      return account;
   }

   public void setAccount(int account) {
      this.account = account;
   }

   public String getPw() {
      return pw;
   }

   public void setPw(String pw) {
      this.pw = pw;
   }

   public String getEmail() {
      return email;
   }

   public void setEmail(String email) {
      this.email = email;
   };
   
   
}
  • 동적배열

 

  • 과거에는 '벡터'라고 불림, 현재는 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("실패");
				
			}

		}
	}
}

 


1. 객체지향프로그래밍(OOP)의 상속에 대하여 서술하시오 (10점)


2. 자동형변환이란 무엇인지 서술하시오. (20점) 


3. 자바 소스 코드 컴파일 시 명시적으로 코딩하지 않을 경우 컴파일러에 의해 자동으로 생성되는 코드를 5가지 이상 서술하시오. (35점)


4. 객체지향프로그래밍(OOP)의 다형성에 대하여 서술하시오 (35점)

 


package kr.or.iei;

import java.util.Scanner;

public class Question1 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		int[] data = new int[5];
		for(int i = 0; i<5; i++) {
			System.out.print((i+1) + "번째 정수 입력 : ");
			data[i] = Integer.parseInt(sc.nextLine());
		}
		for(int i= data.length-1; i>=0 ;i--) {
			for(int j = 0; j<i; j++) {
				if(data[j]>data[j+1]) {
					int tmp = data[j];
					data[j] = data[j+1];
					data[j+1] = tmp;
				}
			}
		}
		System.out.print("정렬된 결과 : ");
		for(int i = 0;i<data.length;i++) {
			System.out.print(data[i]+" ");
		}
		System.out.println();
		System.out.println("정렬 후 첫번째 수와 마지막수의 합 : "+(data[0]+data[4]));

	}

}

1.객체지향프로그래밍(OOP)의 상속에 대하여 서술하시오 (10점)결과 | 점수 (10.0점)

수강생 답 객체 지향 프로그래밍이란 절차 지향 프로그램에 비해 기능과 데이터들을 독립적으로 운용하기 위한 기법이다.

상속은 객체 지향 프로그래밍의 큰 특징 중 하나로 상위클래스의 기능을 하위 클래스가 상속받아 사용 할 수 있도록 하는 기법이다​.

답안첨삭  
모범답안 상속 : 다른 클래스가 가지고 있는 멤버들을 새로 만들 클래스에서 직접 만들지 않고 상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있게 만든 기술
평가기준 프로그래밍 언어별 특성에 대한 이해
수행준거

프로그래밍 언어별 득성을 파악하고 설명할 수 있다.

애플리케이션을 최적화하기 위해 프로그래밍 언의의 특성을 활용할 수 있다.

2.자동형변환이란 무엇인지 서술하시오. (20점)결과 | 점수 (15.0점)

수강생 답 자동형변환이란 자료형이 다른 데이터가 스스로 자료형을 변환하는 현상이다. 자료형이 변환 될때 데이터의 손실이 없는 경우에 자동형변환이 일어난다.

그 예로 String형과 다른 숫자를 표현하는 기본 자료형이 같이 출력되는 코드를 작성하면 String형으로 자동으로 변환된다.

또 소수점이 없는 int형과 소수점이 있는 double이 연산될때 명시적으로 캐스팅 해주지 않아도 int​형이 double​형으로 형변환되어 연산된다.

답안첨삭 자동형변환이란 자료형이 다른 데이터가 스스로 자료형을 변환하는 현상이다. 자료형이 변환 될때 데이터의 손실이 없는 경우에 자동형변환이 일어난다.

그 예로 String형과 다른 숫자를 표현하는 기본 자료형이 같이 출력되는 코드를 작성하면 String형으로 자동으로 변환된다.

또 소수점이 없는 int형과 소수점이 있는 double이 연산될때 명시적으로 캐스팅 해주지 않아도 int​형이 double​형으로 형변환되어 연산된다.

 

​- 업캐스팅에 대한 내용도 포함되면 더 좋겠습니다.

모범답안 연산시 컴파일러가 자동으로 형을 변환하는 것을 의미하며, 일반적으로 갑의 범위가 작은데이터 타입에서 값의 범위가 큰데이터 타입으로 변환될 때 자동형변환이 일어난다.
평가기준 데이터 타입의 형변환에 대한 이해도 평가
수행준거

프로그래밍 언어별 특성을 파악하고 설명할 수 있다.

파악된 프로그래밍 언어의 특성을 적용하여 애플리케이션을 구현할 수 있다.

3.자바 소스 코드 컴파일 시 명시적으로 코딩하지 않을 경우 컴파일러에 의해 자동으로 생성되는 코드를 5가지 이상 서술하시오. (35점)결과 | 점수 (35.0점)

수강생 답 1. 하위클래스에서 상위클래스의 기능을 상속 받는 경우 : super();

 

2. 기본적으로 모든 클래스는 Object을 상속받음 : expends Object​​

 

3. import java.lang.*

 

4. 매개변수가 없는 컨스트럭터

 

5. 접근제한자를 입력하지 않았을 때 : package접근제한자 

답안첨삭  
모범답안

import java.lang.*;

default constructor,

return;

.toString()

this.

super()

자동 upcasting

평가기준 애플리케이션 최적화를 위한 프로그래밍 언어의 컴파일러에 대한 이해
수행준거

파악된 프로그래밍 언어의 특성을 적용하여 애플리케이션을 구현할 수 있다.

애플리케이션을 최적화하기 위해 프로그래밍 언어의 특성을 활용할 수 있다.

4.객체지향프로그래밍(OOP)의 다형성에 대하여 서술하시오 (35점)결과 | 점수 (35.0점)

수강생 답 다형성은 다양한 형태를 가진 성질을 말한다.

이런 성질을 가진 기능들은 서로 다른 참조자료형을 받아서 쓸수 있다.

 

일반적으로 같은 이름이어도 매개변수의 자료형과 개수에 따라 내부적으로는 다르게 인식한다. 

하나의 이름에 기능이 많이 담겨있는 경우 오버로드라고도 한다.

 

 

답안첨삭  
모범답안 상속을 이용한 기술로 하나의 부모 타입의 참조변수로 상속 관계에 있는 여러 자식 타입 객체를 다루는 기술
평가기준 프로그래밍 언어별 특성에 대한 이해
수행준거

프로그래밍 언어별 득성을 파악하고 설명할 수 있다.

애플리케이션을 최적화하기 위해 프로그래밍 언의의 특성을 활용할 수 있다.


//2. 자동형변환 : 기본타입 프로모션, 참조형 업캐스팅

//3. 프로모션은 따로 코드가 생성되는 것은 아님

//4. 오버라이딩이 다형성은 아님, 오버로딩도 다형성이긴 하지만 자바에서의 다형성은 상위 클래스를 상속 받는것(OOP), 기능과 장점


다음 아래의 요구사항에 맞도록 Java 프로그램을 제작하시오

1. 구현 클래스

Package명 클래스명 메소드 설명

kr.or.iei Question1 +main(args:String []):void main 함수 안에서 모든 코드 작업 진행

 

2. 구현 내용

주제 : 5개의 정수를 입력후 입력한 값들이 오름차순 정렬로 표현 되도록 구현하시오

- 요구사항

1) 패키지명, 클래스명, 메소드명을 모두 요구사항에 맞게 제작

2) 입력은 반복문, Scanner 객체를 사용하여 5번 입력 받아야 함 (정수 5개 입력받는 배열 사용)

3) 정렬 기법은 버블정렬을 이용하여 오름차순 정렬 되어야 함

4) 정렬된 결과 출력은 반복문을 이용하여 출력 되어야 함

5) 마지막에 첫번째 수와 마지막수를 합한 값을 출력할 수 있어야 함

 

3. 실행 결과

ex1)

1번째 정수 입력 : 7

2번째 정수 입력 : 4

3번째 정수 입력 : 8

4번째 정수 입력 : 5

5번째 정수 입력 : 1

정렬된 결과 : 1 4 5 7 8

정렬 후 첫번째 수와 마지막수의 합 : 9

ex2)

1번째 정수 입력 : 5

2번째 정수 입력 : 4

3번째 정수 입력 : 3

4번째 정수 입력 : 2

5번째 정수 입력 : 1

정렬된 결과 : 1 2 3 4 5

정렬 후 첫번째 수와 마지막수의 합 : 6

전체 코드를 올려주세요
 
1) 패키지명, 클래스명, 메소드명을 모두 요구사항에 맞게 제작
 
2) 입력은 반복문, Scanner 객체를 사용하여 5번 입력 받아야 함 (정수 5개 입력받는 배열 사용)
 
3) 정렬 기법은 버블정렬을 이용하여 오름차순 정렬 되어야 함 (반복 코드 포함)
 
4) 정렬된 결과 출력은 반복문을 이용하여 출력 되어야 함
 
5) 마지막에 첫번째 수와 마지막수를 합한 값을 출력할 수 있어야 함
 

평가항목

평가내용평가기준배점평가결과

객체 기능 활용 능력 객체의 기능을 알맞게 사용하였는가? (ex. Length) 15.0 아니오
변수 활용 능력 주어진 요구사항에 맞도록 배열의 개수를 알맞게 설정하였는가? 10.0
반복문 활용 능력 주어진 요구사항에 맞도록 반복문(for)을 적절하게 사용하였는가? 10.0
분기문 활용 능력 주어진 요구사항에 맞도록 분기문(if)을 적절하게 사용하였는가? 10.0
알고리즘 이해 능력 주어진 요구사항에 맞도록 정렬기법을 적절하게 사용하였는가? 15.0
연산법 이해 능력 주어진 요구사항에 맞도록 마지막 연산의 결과값을 계산하고 표현하였는가? 15.0
패키지 작성 능력 주어진 요구사항에 맞도록 패키지 명을 알맞게 작성하였는가? 5.0
클래스 작성 능력 주어진 요구사항에 맞도록 클래스 명을 알맞게 작성하였는가? 5.0
입력 기능 활용 능력 주어진 요구사항에 맞도록 입력 객체(Scanner)를 표현하였는가? 5.0
출력 기능 활용 능력 예시에 표현되는것처럼 출력시 라인 정리가 깔끔하게 표현되었는가? 10.0

추상화 / 상속 / 다형성 ?

> 개념설명 가능해야

 

상속은 실제 상위 클래스로부터 기능들을 다른 클래스로 물려주는 기법

 

다형성은 ~~

 

추상화는 앱스트랙트 추상메서드를 만들어서 실행되기 위한 메서드가 아닌 설계 목적의 메서드를 작성하는 기법

 

> 인터페이스 : 완전 추상체

 

 

 

추상클래스와 인터페이스의 차이?

 

추상 클래스는 기능의 확장(extends) 및 implements 가능하다.

 

추상클래스는 멤버, 추상메서드 상속시켜서 내용 구현 강제, 설계(20%)와 확장(80%) 목적

기능의 확장이 목적, 일부 기능을 채우는 것을 강제

 

인터페이스는 100% 설계 목적, 추상체만 가질 수 있다.

프로젝트 리드, 다형성 목적, call back패턴

기능의 확장 없이 설계 목적, 다형성 목적, call back패턴

 

인터페이스를 상속 받을 때에는 extends가 아니라 implements를 사용

implements는 한번에 여러개도 가능 (extends는 한번에 하나씩만)

public interface USB {
	
	public final int a = 10;//상수값만 만들 수 있음	public final
	
	public void func(); //추상화되어있음	abstract
}

접근제한자 4가지 순서

public > protected > package > private(자기 클래스 내부에서만 접근 가능)

 

자바에서 package는 클래스를 카테고리별로 분류한 폴더

컨벤션 - 3레벨로 나눈다 // 회사.팀or프로젝트명.분류

파일

 

package 접근제한자

접근제한자를 안쓰면 package 접근제한자 (=디폴트 접근제한자)

같은 패키지에서는 자유롭게 접근, 다른 패키지에서는 프라이빗

 

 

protected 접근제한자

기본적으로 같은 패키지 내의 접근만 가능

다른 패키지에 있는 상황인데 다른 패키지의 클래스에서 extends해서 상속을 받은경우 접근 가능

>다른 용도로 사용, 오버라이드 하도록 권유 (cf. 추상은 implement를 해야 쓸수 있도록 강제)

 

정보은닉을 하는 이유

클래스의 안전성

사용자의 편의성

 

캡슐화

반드시 사용해야 되는 부분만 외부에 노출시키는 방식

 

손코팅 

selection sort 선택정렬

https://gmlwjd9405.github.io/2018/05/06/algorithm-selection-sort.html

 

[알고리즘] 선택 정렬(selection sort)이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

Bubble sort 거품정렬

https://bowbowbow.tistory.com/10

 

Bubble Sort : 거품 정렬

Bubble Sort : 거품 정렬 Bubble Sort : 거품 정렬 Bubble Sort : 거품 정렬 소개 정렬과정 알고리즘 분석 애니매이션 예시 구현 정리 끝 소개 Bubble Sort 는 인접한 두 수를 비교하여 큰 수를 뒤로 보내는 간단..

bowbowbow.tistory.com


코드 짤때 중요한것

매서드

셋터 겟터

컬렉션

 

 


추상화란엇인가?

  • Abstract 추 매서드 만들어서 실제로행되는 코드가 아 설계 목적의 코드성하는 

 

상속이란엇인가?

  • 상위 클래스의능들을 클래스로 물려주는

 

다형성이란엇인가?

  • 변수 하나가 여러가지 자료형을 담을 있는 상태

 

추상클래스와 인터페이스의 차이

  • 상클래스는 메서드가 하나 이함되거나 abstract 정의 경우
  • 인터페이스는 메소드가 추 메소드
  • 추상클래스는 클래스를 상속 받아서능을 확장시키는 것이 목적(extends)
  • 인터페이스는 메소드현을 강제하는 것이 목적, (implements) 뒤에 여러개 가
  • 추상 클래스의 상속은 슈퍼클래스의능을용하거나 확장하기 위해서 사용되고중상속의 모호문에 하나 상속 받을 있다.
  • 인터페이스는 해당 인터페이스를 구현한 객체들에 대해서 동일한 동작을 약속하기 위해 존재

 

접근제한자 public < protected < package < private

 

package 접근제한자

  • 접근제한자를 안쓰면 package접근제한자, 디폴트 접근제한자 라고도 한다.
  • 같은 패키지에서는 자유롭게 접근, 다른 패키지에서는 프라이빗

 

protected 접근 제한자

  • 기본적으로 같은 패키지 내에서만 접근 가능
  • 다른 패키지에 있어도 상속받은 경우 접근 가능
  • 본래 용도 보다는 오버라이드(재정의) 하도록 권유하는 용도로 주로 쓰인다

 

정보 은닉을 하는 이유

  • 클래스의 안전성과 사용자의 편의성을 위해

 

캡슐화

  • 반드시 사용해야 되는 부분만 외부에 노출시키는 방식
  • 내부 데이터를 외부에 노출하지 않고 은닉
  • 유지보수성 향상
  • 외부에 불필요한 정보를 노출하지 않고 보호

 

선택 정렬 Selection Sort


public class Selection {

	public void sort(int[] data){
		int size = data.length;
		int min; //최소값을 가진 데이터의 인덱스 저장 변수
		int temp;

		for(int i=0; i<size-1; i++){ // size-1 : 마지막 요소는 자연스럽게 정렬됨
			min = i;
			for(int j=i+1; j<size; j++){
				if(data[min] > data[j]){
					min = j;
				}
			}

			temp = data[min];
			data[min] = data[i];
			data[i] = temp;

		}
	}

	public static void main(String[] args) {

		Selection selection = new Selection();

		int data[] = {66, 10, 1, 99, 5};

		selection.sort(data);

		for(int i=0; i<data.length; i++){
			System.out.println("data["+i+"] : " + data[i]);
		}

	}
}

 

 

 

 

버블 정렬 Bubble sort

public class Bubble {

    public void sort(int [] data){

        int temp = 0;
        for(int i=data.length-1; i>=0; i--){

            for(int j=0; j<i; j++){
                if(data[j] > data[j+1]){
                    temp = data[j];
                    data[j] = data[j+1];
                    data[j+1] = temp;
                }               

            }
        }
    }

    public static void main(String[] args) {

        Bubble bubble = new Bubble();

        int data[] = {66, 10, 1, 34, 5};

        bubble.sort(data);


        for(int i=0; i<data.length; i++){
            System.out.println("data["+i+"] : " + data[i]);
        }

    }
}

 

 

 

출처: https://hahahoho5915.tistory.com/6?category=653519 [넌 잘하고 있어]

코드 중복도                 - 상속(IS-A) 문법으로 해결

클래스 간 결합도 문제   - 다형성 문법으로 해결

저장소 문제                - Collection Framework로 해결

 

//다형성 활용 예, 동적 배열
public class Manager {

	private Member[] members = new Member[10];

	private int index = 0 ;

	public void addMember(Member m) {  
		try {
			members[index++] = m;		//인덱스가 10을 넘어가면 오류발생!
		}catch(Exception e) {
			Member[] tmp = new Member[members.length*2]; //오류 발생하면 2배크기 배열 만듦
			for(int i = 0; i< members.length; i++) { 
				tmp[i] = members[i];//기존 배열을 새로만들어진 배열에 옮겨 담는다.
//*문제발생 : 데이터 1개를 넣었거나 제거할때 옮겨담으면 복사다 다 일어남 > 버벅임
//*비순차적 데이터 삭제에 비효율성
			}
			members = tmp;	// 동적 배열
			// Vector  >  ArrayList
		}
	}

	public void printMember() {
		System.out.println("=== 회원 목록 ===");
		System.out.println("아이디\t이름\t포인트\t보너스");

		for(int i=0; i< index ; i++) {
			System.out.println(members[i].getId()+"\t"
					+members[i].getName()+"\t"
					+members[i].getPoint()+"\t"
					+members[i].getBonus()); 
		}
	}
}

 

동적 배열 (Vector > ArrayList)

  • 인덱스가 10을 넘어가면 오류발생!
  • 오류 발생하면 2배크기 배열 만듦
  • 기존 배열을 새로만들어진 배열에 옮겨 담는다.
  • *문제발생 : 데이터 1개를 넣었거나 제거할때 옮겨담으면 복사다 다 일어남 > 버벅임
  • = 비순차적 데이터 삭제에 비효율성
    • 배열은 연산이라는 작업 없이 배열에 넣기만 하면 된다.
    • 순차적 입력에 빠르다 
    • 비순차적 삭제가 없다면 ArrayList가 LinkedList보다 약간 좋다

Collection

  • 변수가 하나이상 뭉쳐있는 구조
  • 배열, 리스트...

 

Collection Framework

  • 다양한 상황에서 사용할 수 있는 다양한 컨테이너를 제공하는데 이것을 컬렉션즈 프래임워크라고 부른다.
  • ArrayList는 그중의 하나

 

링크드 리스트 Linked List

  • 동적 배열에 비해 비순차적 데이터 삭제에 효율적
  • 명시적 사이즈가 없다.
  • 데이터 초과되는 경우가 생기지 않음
  • 무조건 어레이리스트 보다 좋다고 할 수는 없다
    • 인스턴스를 만들고 인스턴스의 주소를 링크하는 연산
    • 순차적 데이터 입력에 관해서는 ArrayList에 비해 약간 불리
    • 비순차적 삭제가 있다면 Linked List가 ArrayList에 비해 매우 좋다.

 

*입력과 삭제 뿐 아니라 검색은?

  • 링크를 순차적으로 검색하는 경우 비효율적
  • 2중 링크로 역행 리스트를 만들자 > 정중앙에 있는 데이터면 앞으로 세나 뒤로 세나 비효율
  • 검색을 극대화 시켜보자 : 해쉬알고리즘, 트리알고리즘 

 

트리 알고리즘

  • 입력속도 포기, 검색속도 극대화
  • 이런걸 만드는 분야 자료구조

 


public class Exam_01 {

	public static void main(String[] args) {
		String[] str = new String[10]; //스트링을 모아놓은 배열이다
		str[0] = "Hello";
		str[1] = 100";
		str[2] = "Java";
		//10칸이면 에러

		System.out.println(str[1]);	//world

		str[1] = str[2];
		str[2] = null;
		System.out.println(str[1]);	//Java
	
		str[2] = str[1];
		str[1] = "World";
		
		System.out.println(str[1]);	//world
		System.out.println(str[2]);	//Java
		
		
		
	}

}
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;
	}

}

+ Recent posts