[JAVA+국비교육] Class 클래스, 정규화표현식, 채팅프로그램 만들기
by 무작정 개발반응형
2022.01.14(19일 차)
오늘의 수업 내용
Class 클래스
특정 클래스나 인터페이스의 정보를 검색할 수 있는 메서드를 가지고 있다.
javapackage com.day18; // Class 클래스 // 특정 클래스나 인터페이스의 정보를 검색할 수있는 메서드를 가지고 있다. class Test { public void write() { System.out.println("테스트..."); } } public class Test1 { public static void main(String[] args) throws Exception { // 특정 메서드 정보를 불러옴.패키지 이름까지 꼭 적어야함 // 또한 지정한 클래스가 없을 수 있기에 예외처리 해줘야함 (throws Exception)!!! Class c = Class.forName("com.day18.Test"); // o의 데이터 타입을 모르기 때문에 일단 Object로 받아서 담아버린다. Object o = c.newInstance(); // 객체 생성 Test t = (Test)o; t.write(); } }
javapackage com.day18; import java.io.BufferedReader; import java.io.InputStreamReader; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test2 { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("클래스명[java.lang.String]?"); String str = br.readLine(); Class cls = Class.forName(str); //String의 생성자 정보 System.out.println("생성자 정보..."); Constructor<?>[] c = cls.getConstructors(); for(int i=0; i<c.length; i++) { System.out.println(c[i]); } System.out.println("필드 정보..."); Field[] f = cls.getFields(); for(int i=0; i<f.length; i++) { System.out.println(f[i]); } System.out.println("메서드 정보..."); Method [] m = cls.getMethods(); for(int i=0; i<m.length; i++) { System.out.println(m[i]); } } }
정규화 표현식
c [a-z]* : c로 시작하는 영단어
c [a-z] : c로 시작하는 두 글자 영단어(c, ca, cz)
c [a-zA-ZO-9] : ca, cA, c4
c. : c로 시작하는 두 글자(ca, cB, c&)
c.* : c로 시작하는 모든 글자
[b|c].* 또는 [bc].* 또는 [b-c].* : b,c,bbb
[\\b]+ 또는 [0-9]+ : 하나 이상의 숫자
javapackage com.day18; import java.util.regex.Matcher; import java.util.regex.Pattern; //정규화 표현식 //java.util.regex public class Test3 { public static void main(String[] args) { String[] str = {"bat", "baby", "bonus", "c", "cA", "ca", "c.", "c0", "car", "combat", "count", "date", "disc" }; Pattern p; p = Pattern.compile("c[a-z]*"); for(String s : str) { Matcher m = p.matcher(s); if(m.matches()) { System.out.println(s); } } System.out.println("-----------------------------------------"); p = Pattern.compile("c."); for(String s : str) { Matcher m = p.matcher(s); if(m.matches()) { System.out.println(s); } } System.out.println("-----------------------------------------"); String[] mails = {"aaa@aaa.com", "@aaa.co.kr", ".bbb.com", "aaa@vvv.co.kr", "sss.co.kr", "abc@aaa"}; String pat = "[\\w]+@[\\w]+(\\.[\\w]+)+"; for(String s : mails) { if(Pattern.matches(pat, s)) { System.out.println(s); } } } }

주소를 찾아가서 HTML 파일 읽어오기
javapackage com.day18; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; public class Test5 extends Frame implements ActionListener { private static final long serialVersionUID = 1L; private TextArea ta; private TextField tf; public Test5() { ta = new TextArea(); add(ta); tf = new TextField(); tf.addActionListener(this); add(tf,BorderLayout.NORTH); //종료버튼 addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); setTitle("HTML Viewer"); setSize(400, 300); setVisible(true); } public static void main(String[] args) { new Test5(); } @Override public void actionPerformed(ActionEvent e) { try { String str; URL url = new URL(tf.getText()); ta.setText(""); //위의 url를 찾아가서 openStream연결 //방법1 //InputStream is = url.openStream(); -> 애는 필요한 곳에 빨대를 꼿는 느낌(꼿으면 물이 들어옴) //방법2 //나 갈거야 말해주고 레드카펫 깔아줘 등 (정문으로 들어간다 혹은 고급지게 들어간다는 느낌) URLConnection conn = url.openConnection(); InputStream is = conn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); while((str = br.readLine()) != null) { if(ta.getText().equals("")) ta.setText(str); else ta.setText(ta.getText() + "\n\r" + str); } is.close(); } catch (Exception e2) { // TODO: handle exception } } }
일대일 채팅 프로그램
ClientTest : 채팅 시스템에 접속하는 클라이언트 클래스
ServerTest : 채팅 서버 클래스

ClientTest
javapackage com.day18; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; //다중 인터페이스 public class ClientTest extends Frame implements ActionListener,Runnable{ private static final long serialVersionUID = 1L; private TextArea ta = new TextArea(); private TextField tf = new TextField(); // 클라이언트는 소켓만 필요 private Socket sc = null; private String host = "localhost";//localhost(127.0.0.1)192.168.16.0 private int port = 7777; // 기본 생성자를 통해 ActionListener의 기본값을 설정 public ClientTest() { add(ta,BorderLayout.CENTER); add(tf,BorderLayout.SOUTH); //텍스트입력창에 리스너 tf.addActionListener(this); //종료 addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); setTitle("채팅클라이언트"); setSize(300, 400); setVisible(true); } public void connect() { try { sc = new Socket(host, port); Thread th = new Thread(this); th.start(); } catch (Exception e) { System.out.println(e.toString()); } } // 실행되면 main문을 가장 먼저 찾아간다. public static void main(String[] args) { new ClientTest().connect(); } @Override public void run() { //데이터를 받을때 String str; try { if(sc==null) return; InputStream is = sc.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); while((str=br.readLine())!=null) { ta.append("\r\n" + str); } } catch (Exception e) { ta.append("\r\n 서버 연결 종료..."); sc = null; } } @Override public void actionPerformed(ActionEvent e) { //데이터를 보낼때 String str = tf.getText(); if(str.trim().equals("")) { return; } if(sc==null) { return; } try { //true:flush PrintWriter pw = new PrintWriter(sc.getOutputStream(),true); pw.println("수지]" + str); //클라이언트에 전송 ta.append("\r\n수지]:" + str); tf.setText(""); tf.requestFocus(); } catch (Exception e2) { ta.append("\r\n 서버와 접속이 끊겼습니다..."); sc = null; } } }
ServerTest
javapackage com.day18; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class ServerTest extends Frame implements ActionListener,Runnable{ private static final long serialVersionUID = 1L; private TextArea ta = new TextArea(); private TextField tf = new TextField(); private ServerSocket ss = null; private Socket sc = null; public ServerTest() { add(ta,BorderLayout.CENTER); add(tf,BorderLayout.SOUTH); tf.addActionListener(this); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); setTitle("채팅서버"); setSize(300, 400); setVisible(true); } public void serverStart() { try { ss = new ServerSocket(7777); ta.setText("서버시작!!!"); sc = ss.accept();//클라이언트와 연결 Thread th = new Thread(this); th.start(); } catch (Exception e) { System.out.println(e.toString()); } } public static void main(String[] args) { new ServerTest().serverStart(); } @Override public void run() { //데이터를 받을때 String str; String ip; try { if(sc==null) return; InputStream is = sc.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); //clientIP ip = sc.getInetAddress().getHostAddress(); ta.append("\r\n[" + ip + "] 접속!!"); while((str=br.readLine())!=null) { ta.append("\r\n" + str); } } catch (Exception e) { ta.append("\r\n 클라이언트 연결 종료..."); sc = null; ss = null; } } @Override public void actionPerformed(ActionEvent e) { //데이터를 보낼때 String str = tf.getText(); if(str.trim().equals("")) { return; } if(sc==null) { return; } try { //true:flush PrintWriter pw = new PrintWriter(sc.getOutputStream(),true); pw.println("서버]" + str); //클라이언트에 전송 ta.append("\r\n서버]:" + str); tf.setText(""); tf.requestFocus(); } catch (Exception e2) { ta.append("\r\n 클라이언트와 접속이 끊겼습니다..."); sc = null; } } }

벌써 수업을 들은 지 한 달이 다돼간다. 시간이 참 빠르고 난 아직 많이 부족하다는 걸 느낀다. 나는 왕복시간이 3시간 조금 넘게 걸리는데 공부 시간을 확보하기 위해 자취를 하기로 결심했다. 지금도 공부 시간이 부족하면 뒤에 스프링을 배울 때는 더욱 시간이 부족할 것이다.
블로그의 정보
무작정 개발
무작정 개발