[2023.10.18] 개발자 교육 18일 차 : 강의-복습, 채팅앱 [구디 아카데미]

DaramGee·2023년 10월 18일
0

오늘 정리

Thread는 왜 사용? 한정된 자원을 여러 사람이 공유하거나 나누어야 하는 상황에서 각 메소드가 처리되는 시간이 다르기 때문에 지연이 발생할 수 있기 때문에 사용한다.

콜백 메소드는? run() 메소드와 같이 start() 메소드로 호출 시 바로 실행되지 않고(대기하며 순서 따짐), 시스템이 적당한 시기에 대신 호출하는 콜백메소드라고 한다.

복습

  • TimeClient / TimeServer 소스 리뷰 & 나누기(스레드의 역할)
    • TimeServer
      • new ServerSocket 생성 → 기다림(다음코드 진행x) → 클라이언트 소통을 상태값(로그)로 남김 → JFrame(서버 준비 전 화면으로 염)
      • Socket client = server.accept(); 서버소켓에 접속한 소켓정보를 쥐게 된다.
    • ClientServer
      • new Socket 생성 → 서버에서 클라이언트측에 소켓객체 전달(통신연결)
  • List의 구현체 클래스
    • ArrayList - 스레드에서 불안전
    • vector -멀티 스레드에서 안전(안전장치 있음) but, 읽기 쓰기 속도 느림, 동시접속자가 있을 때 순서대로 관리 가능
  • @Override : annotation
  • 익명클래스
    • 클래스 정의와 동시에 인스턴스를 생성하는 방식 → 재사용성 높임, 코드 간결해짐

      //Baker.class, Baker$1.class -> 익명의 클래스로 생성됨 
      public class Baker {
      	public static void main(String[] args) {
      		Thread th = new Thread() {
      			public void run() {
      			}
      		};
      	}
      }

강의 내용

  1. Chat 프로젝트

  • ⓒ ChatServer

    • 왜 Thread 상속?
      • 메인메소드(entry porint)도 스레드라고 했는데? -> 시작점, exe 파일 생성, 경합 벌어짐 -> 끼어듬이 발생
      • 따라서 Thread를 따로 상속받아서 화면을 처리하는 메인메소드와 통신채널을 설정하는 코드를 분리 → 안전한 서비스 제공 가능
      • 통신채널의 경우, 지연이 발생할 수 있어서 속도차이가 있음. 따라서 따로 분리하여 관리하는 것 필요!
    • 왜 Vector로 사용?
      • 멀티 스레드에서 안전(안전장치 있음) but, 읽기 쓰기 속도 느림, 동시접속자가 있을 때 순서대로 관리 가능
  • ⓒ ChatServerThread

    • 서버가 ct에게 들은 것을 방송(여러사람, for문-Thread)하는 메소드 -> ChatServer에 스레드 붙인 이유임.
    • 왜 파라미터 자리인가? 매번 입력되는 메시지가 달라지기 떄문(지변으로 설정)
  • ⓒ ChatClient

    • 말하기 구현(oos.writeObject("200|kiwi|tomato|메시지 내용") -> 프로토콜 설계 : “메시지유형|누가|누구에게|무엇을”)
  • ⓒ ChatClientThread

  • ⓒ Protocol & ProtocolTest

    • 프로토콜 설계 클래스 StringTokenizer 사용
    • for, while문의 파라미터 안에는 boolean 타입만 들어감) 따라서 API 보는 눈 필요👓

    • | (파이프 or #)를 구분자로 하여 나누어서 각자의 토큰으로 정의

      public class ProtocolTest {
      	public static void main(String[] args) {
      		String msg           = "200|kiwi|tomato|메시지 내용"; // |를 기준으로 토큰
      		StringTokenizer st   = new StringTokenizer(msg,"|");
      		String protocol      = st.nextToken();
      		String from          = st.nextToken();
      		String to            = st.nextToken();
      		String msg1          = st.nextToken();
      		System.out.println(protocol+", "+from+", "+to+", "+msg1);
      	}
      }

  1. 개념
  • java.lang.Thread?
    • 무엇? 한 가지 작업을 하기 위한 내부 코드의 실행 흐름을 제어하는 클래스(싱글 or 멀티 등)
    • 왜? 한정된 자원을 여러 사람이 공유하거나 나누어야 하는 상황에서 각 메소드가 처리되는 시간이 다르기 때문에 지연이 발생할 수 있기 때문에 사용
    • 메소드 (wait, sleep, run, start 등)
      • 그 중 run()?
        • run 메소드의 경우, start()로 호출 시 바로 실행되지 않고(대기하며 순서 따짐), 시스템이 적당한 시기에 대신 호출하는 콜백메소드임.

        • 다른 메소드와 함께 사용될 때 지연될 수 있어 호출위치와 순서 선정 중요(아래 예시 : run이 다 실행된 뒤 창이 뜨게 될 수도 있음)

          public static void main(String[] args) {
          		ChatServer cs = new ChatServer();
          		//start와 run의 start의 위치 선정 중요 -> run에는 지연이 발생할 수 있어서 후순위로 넣어야 함. 
          		cs.initDisplay();
          		cs.start();  //Thread 상속받았기에 바로 start메소드 사용 가능 
          	}
    • 어떻게 生?
      • Thread 상속
        • 클래스에서 바로 Thread의 메소드 사용 가능
      • Runnable 사용
        • 이미 다른 클래스가 상속받았을 때, 인터페이스 Runnable을 implements하여 Thread를 생성하고, 메소드 run을 오버라이드하여 사용할 수 있게 된다.

          import javax.swing.JFrame;
          
          public class Customer extends JFrame implements Runnable{
          	public static void main(String[] args) {
          		Customer ct = new Customer();
          		Thread th = new Thread(ct);
          		th.start();
          	}
          	@Override
          	public void run() {
          	}
      • Thread 하위 클래스로 생성
        • FlyBehavior 예 : 하늘을 나는 기능을 상속으로 정의하지 않고, 인터페이스로 처리 → (비행물, 동물)클래스 사이 결합도를 낮춰 단위 테스트가능(비행기가 꽥꽥하는 일 발생 x)
        • 따라서 추상클래스, 인터페이스 중심의 코딩 전개 필요 → 기능 확장, 추가적 클래스 구현 가능

강의 마무리

  • 사이드프로젝트(10월 18일~11월 5일)

0개의 댓글