2022.08.08 - Java, JSP

sofia·2022년 8월 9일
0

JAVA

목록 보기
15/27
post-thumbnail

JSP 들어감.
JAVA 카테고리에 작성함


복습 문제

복습문제 1

package chapter10;

class PointTwo {
   private int x, y;
   public PointTwo(int x, int y) { this.x = x; this.y = y; }
   public int getX() { return x; }
   public int getY() { return y; }
   protected void move(int x, int y) { this.x = x; this.y = y; }
}

public class ColorPointTwo extends PointTwo {
   private String color;
   public ColorPointTwo() {
      this(0, 0);
   }
   public ColorPointTwo(int x, int y) {
      super(x, y);
      this.color = "BLACK";
   }
   public void setXY(int x, int y) { move(x, y); }
   public void setColor(String color) { this.color = color; }
   @Override
   public String toString() {
      return color+"색의 ("+getX()+","+getY()+")의 점";
   }
   public static void main(String[] args) {
      ColorPointTwo zeroPoint = new ColorPointTwo();
      System.out.println(zeroPoint.toString()+"입니다.");
      
      ColorPointTwo cp = new ColorPointTwo(10, 10);
      cp.setXY(5, 5);
      cp.setColor("RED");
      System.out.println(cp.toString()+"입니다.");
   }
}

복습문제 2

package chapter11;

class PointThree {
	   private int x, y;
	   public PointThree(int x, int y) { this.x = x; this.y = y; }
	   public int getX() { return x; }
	   public int getY() { return y; }
	   protected void move(int x, int y) { this.x = x; this.y = y; }
	}

public class Point3D  extends PointThree {
	   private int z;
	   
	   public Point3D (int x, int y, int z) {
		   super(x,y);
		   this.z=z;
	   }//생성자

	   @Override
	   public String toString() {
		   return "("+getX()+","+getY()+","+getZ()+")의 점";
	   }
	   public int getZ() {
		   return z; 
	   }	   
	   
	   public void moveUp() {
		   z++;
	   }
	   
	   public void moveDown() {
		   z--;
	   }
	   
	   public void move(int x, int y, int z) {
		   move(x,y);
		   this.z = z;
	   }
	   
	   public static void main(String[] args) {
		  Point3D p = new Point3D(1,2,3);//1,2,3은 각각 x,y,z 축의 값
		  System.out.println(p.toString()+"입니다.");
		  
		  p.moveUp();//z축으로 위로 이동
		  System.out.println(p.toString()+"입니다.");
		  
		  p.moveDown();//z축으로 아래쪽 이동
		  p.move(10,10);// x,y 축으로 이동
		  //PointThree 에 move 메소드 존재함
		  System.out.println(p.toString()+"입니다.");
		  
		  p.move(100,200,300);//x,y,z 축으로 이동
		  System.out.println(p.toString()+"입니다.");
		   
	   }
	}

복습문제 3

package chapter11;

class PointFour {
	private int x, y;

	public PointFour(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public int getX() {
		return x;
	}

	public int getY() {
		return y;
	}

	protected void move(int x, int y) {
		this.x = x;
		this.y = y;
	}
}

public class PositivePoint extends PointFour {
	public PositivePoint() {
		super(0, 0);
	}//기본생성자

	public PositivePoint(int x, int y) {
		super(x, y);
		if (x <= 0 || y <= 0) {
			super.move(0, 0);
		}
	}// 생성자

	@Override
	public String toString() {
		return "(" + getX() + "," + getY() + ")의 점";
	}

	protected void move(int x, int y) {
		if (x > 0 && y > 0) {
			super.move(x, y);
		}
	}

//	 protected void move(int x, int y) { this.x = x; this.y = y; }

	public static void main(String[] args) {
		PositivePoint p = new PositivePoint();
		p.move(10, 10);
		System.out.println(p.toString() + "입니다.");

		p.move(-5, 5);// 객체 p는 음수공간으로 이동되지 않음
		System.out.println(p.toString() + "입니다.");

		PositivePoint p2 = new PositivePoint(-10, -10);
		System.out.println(p2.toString() + "입니다.");
	}

}

복습문제 4

//내방법
package chapter11;
import java.util.Scanner;

abstract class Calc{
	public int a,b;
	public void setValue(int a, int b) {
		this.a=a;
		this.b=b;
	}
	public abstract int calculate();
}
class Add extends Calc{

	@Override
	public int calculate() {
		return a+b;
	}
	
}

class Sub extends Calc{

	@Override
	public int calculate() {
		return a-b;
	}
	
}
class Mul extends Calc{

	@Override
	public int calculate() {
		return a*b;
	}
	
}
class Div extends Calc{

	@Override
	public int calculate() {
		return a/b;
	}
	
}

public class Calculator {

	public static void main(String[] args) {
		System.out.println("두 정수와 연산자를 입력하시오>>");
		Scanner scanner = new Scanner(System.in);
		int a = scanner.nextInt();
		int b = scanner.nextInt();
		char operator = scanner.next().charAt(0);
		
		switch (operator) {
		case '+':
			Add add = new Add();
			add.setValue(a, b);
			System.out.println(add.calculate());
			break;
		case '-':
			Sub sub = new Sub();
			sub.setValue(a, b);
			System.out.println(sub.calculate());
			break;
		case '*':
			Mul mul = new Mul();
			mul.setValue(a, b);
			System.out.println(mul.calculate());
			break;
		case '/':
			Div div = new Div();
			div.setValue(a, b);
			System.out.println(div.calculate());
			break;
			
		default:
			System.out.println("잘못된 연산자입니다.");
			break;
		}
	}

}
//강사님 방법
package chapter11;
import java.util.Scanner;

abstract class Calc{
	protected int a,b;
	public void setValue(int a, int b) {
		this.a=a;
		this.b=b;
	}
	public abstract int calculate();
}
class Add extends Calc{

	@Override
	public int calculate() {
		return a+b;
	}
}

class Sub extends Calc{

	@Override
	public int calculate() {
		return a-b;
	}
	
}
class Mul extends Calc{
	@Override
	public int calculate() {
		return a*b;
	}
	
}
class Div extends Calc{
	@Override
	public int calculate() {
		return a/b;
	}
	
}

public class Calculator {

	public static void main(String[] args) {
		System.out.println("두 정수와 연산자를 입력하시오>>");
		Scanner scanner = new Scanner(System.in);
		int a = scanner.nextInt();
		int b = scanner.nextInt();
		char operator = scanner.next().charAt(0);
		
		Calc exp = null;
		switch (operator) {
		case '+':
			exp = new Add(); //업캐스팅
			break;
		case '-':
			exp = new Sub(); //업캐스팅
			break;
		case '*':
			exp = new Mul(); //업캐스팅
			break;
		case '/':
			exp = new Div(); //업캐스팅
			break;
			
		default:
			System.out.println("잘못된 연산자입니다.");
			break;
		}
		exp.setValue(a, b);
		if (exp instanceof Div && b == 0) {//instanceof 다시 공부하기
			
			System.out.println("계산 할 수 없습니다.");
		} else {
			System.out.println(exp.calculate());
		}
		scanner.close();
	}

}

복습문제 5


package chapter11;

interface Shapes {//인터페이스는 추상 클래스(추상메소드)
	final double PI = 3.14;
	void draw();//추상 메소드
	double getArea();//추상 메소드
	default public void redraw() {
		System.out.print("---다시 그립니다.");
		draw();
	}

}
public class Circle implements Shapes{
	private int r;
	public Circle(int r) {
		this.r=r;
	}//생성자

	@Override
	public void draw() {
		System.out.println("반지름이 "+r+"인 원입니다.");
	}
	
	@Override
	public double getArea() {
		return PI*r*r;
	}

	public static void main(String[] args) {
		Shapes donut = new Circle(10);//반지름이 10인 원 객체
		donut.redraw();
		System.out.println("면적은 "+donut.getArea());
	}

}

복습문제 6

package chapter11;

interface Shapes2{//인터페이스는 추상 클래스(추상메소드)
	final double PI = 3.14;
	void draw();//추상 메소드
	double getArea();//추상 메소드
	default public void redraw() {
		System.out.print("---다시 그립니다.");
		draw();
	}
}


class Rect implements Shapes2 {
	private int a,b;
	public Rect(int a, int b) {
		this.a = a;
		this.b = b;

	}

	@Override
	public void draw() {
		System.out.println(a+"x"+b+"크기의 사각형 입니다.");

	}

	@Override
	public double getArea() {
		return a*b;
	}
}

class Oval implements Shapes2 {
	private int a,b;


	public Oval(int a, int b) {
		this.a = a;
		this.b = b;
//		System.out.println((a/2)*(b/2)*PI);
	}//생성자

	@Override
	public void draw() {
		System.out.println(a+"x"+b+"에 내접하는 타원입니다.");

	}

	@Override
	public double getArea() {
		// TODO Auto-generated method stub
		return PI*a*0.5*b*0.5;
	}

}


public class Circle2 implements Shapes2{
	private int r,a,b;
	public Circle2(int r) {
		super();
		this.r = r;
	}

	public void Circle2(int r) {
		this.r=r;
	}//생성자
	
	public void Oval(int a, int b) {
		this.a = a;
		this.b = b;
		System.out.println((a/2)*(b/2)*PI);
	}//생성자
	
	
	@Override
	public void draw() {
		System.out.println("반지름이 "+r+"인 원입니다.");
	}
	
	@Override
	public double getArea() {
		return PI*r*r;
	}
	public static void main(String[] args) {
		Shapes2 [] list = new Shapes2[3];
		list[0] = new Circle2(10);
		list[1] = new Oval(20,30);
		list[2] = new Rect(10,40);
		
		for (int i = 0; i < list.length; i++) {
			list[i].redraw();
		}

		for (int i = 0; i < list.length; i++) {
			System.out.println("면적은 "+list[i].getArea());
		}
	}
}

네트워크 (PPT Chapter 11)

TCP/IP 프로토콜

TCP(Transmission Control Protocol)

:두 시스템(서버와 클라이언트)간에 신뢰성 있는 데이터의 전송을 관장하는 프로토콜

  • TCP에서 동작하는 응용프로그램 사례 : e-mail,FTP,웹(HTTP)등

IP(Internet Protocol)

: 패킷 교환 네트워크에서 송신 호스트와 수신 호스트가 (네트워크)데이터를 주고 받는 것을 관장하는 프로토콜

-TCP 보다 하위 레벨의 프로토콜

IP주소

  • 네트워크 상에서 유일하게 식별될 수 있는 컴퓨터 주소

    • 숫자로 구성됨
    • 4개의 숫자가'.'으로 연결
      (EX 192.156.11.15......
  • 숫자로 된 주소를 기억하기 어려움으로 www.naver.com과 같은 문자열로 구성된 도메인 이름으로 바꿔 사용

    • DNS(Domain Name System)
      문자열로 구성된 도메인 이름을 숫자로 구성된 IP 주소로 자동 변환
  • 현재는 32비트의 IP 버전 4(IPv4)가 사용되고 있음

    • IP 주소 고갈로 인해 128비트의 IP 버전 6(IPv6)이 점점 사용되는 추세
  • 내컴퓨터에서 확인하려면 CMD 창에 ipconig 명령 수행

포트(PORT)(0~65535)

  • 통신하는 프로그램 간에 가상의 연결단 포트 생성
    • IP 주소는 네트워크 상의 컴퓨터 또는 시스템을 식별하는 주소
    • 포트 번호를 이용하여 통신할 응용프로그램 식별
  • 모든 응용프로그램은 하나 이상의 포트 생성 가능
    • 포트를 이용하여 상대방 응용프로그램과 데이터 교환
  • 잘 알려진 포트(well-known ports)
    :시스템이 사용하는 포트 번호
    • 잘 알려진 응용프로그램에서 사용하는 포트 번호
    • 0부터 1023 사이의 포트 번호
      ex) SSH 23, HTTP 80, FTP 21
      -잘 알려진 포트 번호는 개발자가 사용하지 않는 것이 좋음
      충돌 가능성 있음

포트를 이용한 통신

소켓 프로그래밍

(최소한 예제 이해를 위해선 숙지하고 있어야함)

소켓(Socket)

: TCP/IP 네트워크를 이용하여 쉽게 통신 프로그램을 작성하도록 지원하는 기반 기술

  • 소켓끼리 데이터를 주고 받으면서 특정 IP 포트 번호와 결합됨
  • 소켓 종류 : 서버 소켓과 클라이언트 소켓

소켓을 이용한 서버 클라이언트 통신 프로그램의 전형적인 구조

ServerSocket 클래스, 서버 소켓

  • 서버 소켓에 사용되는 클래스로, java.net패키지에 포함됨

  • 생성자

  • 주요메소드

서버에 클라이언트가 연결되는 과정

  1. 서버는 서버 소켓으로 들어오는 연결 요청을 기다림(listen)

  2. 클라이언트가 서버에게 연결 요청

3.서버가 연결 요청 수락(accept)

  • 새로운 클라이언트 소켓을 만들어 클라이언트와 통신, 다른 클라이언트의 연결을 기다림

서버에 클라이언트가 통신하는 과정

  1. 서버 소켓 생성
    ServerSocket serverSocket = new ServerSocket(포트번호);
    접속을 기다리는 포트 번호 입력

  2. 클라이언트로부터 접속 기다림
    Socket socket = serverSocket.accept();

  • accept() 메소드는 연결 요청이 오면 새로운 Socket 객체 반환
  • 접속 후 새로 만들어진 Socket 객체를 통해 클라이언트와 통신
  1. 네트워크 입출력 스트림 생성
BufferedReader in = new BufferedReader(
		new InputStreamReader(socket.getInputStream()));
`BufferedWriter out = new BufferedWriter(
		new OutputStreamWriter(socket.getOutputStream()));`
  • Socket 객체의 getInputStream()과 getOutputStream() 메소드를 이용하여 입출력 데이터 스트림 생성

Socket 클래스, 클라이언트 소켓

  • Socket 클래스

  • 클라이언트 소켓에 사용되는 클래스

  • java.net 패키지에 포함

  • 주요 생성자

  • 주요 메소드

클라이언트에서 소켓으로 서버에 접속하는 코드

  1. 클라이언트 소켓 생성 및 서버에 접속
    Socket clientSocket = new Socket("IP 주소", 포트번호);
    -Socket 객체의 생성되면 곧 바로 IP 주소의 포트(번호)에 자동 접속

  2. 소켓으로부터 데이터를 전송할 입출력 스트림 생성

BufferedReader in = new BufferedReader(
		new InputStreamReader(clientSocket.getInputStream()));
BufferedWriter out = new BufferedWriter(
		new OutputStreamWriter(clientSocket.getOutputStream()));
  1. 서버로 데이터 전송
    out.write("hello"+"\n");
    out.flush()
  • flush()를 호출하면 스트림 속에
    데이터를 남기지 않고 모두 전송
  1. 서버로부터 데이터 수신
    String line = in.readline();
    //서버로부터 한 행의 문자열 수신

  2. 네트워크 접속 종료
    clientSocket.close();

###소켓을 이용한 서버/클라이언트 채팅예제

package chapter11;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class ServerEx {
	public static void main(String[] args) {
		BufferedReader in = null;
		BufferedWriter out = null;
		
		ServerSocket listener = null;
		Socket socket = null;
		Scanner scanner = new Scanner(System.in);
		
		// 클라이언트가 아닌 서버 먼저 시작해야함
		
		try {
			listener = new ServerSocket(9999);
			System.out.println("연결을 기다리고 있습니다....");
			socket = listener.accept();//클라이언트 접속
			System.out.println("연결되었습니다.");
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			//소켓으로부터 데이터를 전송할 입력 스트림 생성
			new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			//소켓으로부터 데이터를 전송할 출력 스트림 생성
			
			while (true) {
				String inputMessage =  in.readLine();
				////서버로부터 한 행의 문자열 수신(받음)
				if (inputMessage.equals("bye")) {
					System.out.println("클라이언트에서 bye 로 연결을 종료하였음");
					break;
				}
				System.out.println("클라이언트: "+inputMessage);
				System.out.print("보내기>>");
				String outputMessage = scanner.nextLine();//입력할때 왔다갔다?
				out.write(outputMessage+"\n");
				out.flush();//전송되지 못한 메세지가 있으면 다 보내겠다.
			}// "bye"라고 하기 전까지 무한 반복(대화)
			
		} catch (Exception e) {
			System.out.println(e.getMessage());// 데이터 송신중 발생하는 오류
		}finally {
			try {
				scanner.close();
				socket.close();
				listener.close();
			} catch (Exception e) {
				System.out.println("클라이언트와 채팅 중 오류가 발생했습니다.");
			}
		}
	}

}
package chapter11;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class ClientEx {
	public static void main(String[] args) {
		BufferedReader in = null;
		BufferedWriter out = null;
		Socket socket = null;
		Scanner scanner = new Scanner(System.in);
		
		try {
			socket = new Socket("localhost", 9999);
			//"localhost"하면 자기 ip 번호가 됨.(아니면 cmd에서 확인해도 됨)
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			while (true) {
				System.out.print("보내기>>");
				String outputMessage = scanner.nextLine();
				if (outputMessage.equals("bye")) {
					out.write(outputMessage+"\n");//키보드에서 읽은 문자열 전송
					out.flush();//전송되지 못한 메세지가 있으면 다 보냄
					break;
				}
				out.write(outputMessage+"\n");//키보드에서 읽은 문자열 전송
				out.flush();//전송되지 못한 메세지가 있으면 다 보냄
				String inputMessage =  in.readLine();//서버로부터 한행의 문자열 수신(받음)
				System.out.println("서버: "+inputMessage);
			}
		
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}finally {
			try {
				scanner.close();
				socket.close();
			} catch (Exception e) {
				System.out.println("서버와 채팅 중 오류가 발생했습니다.");
			}
		}
	}

}

JSP

https://tomcat.apache.org/
설치 링크

설치 후, 아래 링크로 이동
http://localhost:연결포트번호/

0개의 댓글