Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원/7월

22.07.08 - [ JAVA ] 객체지향 프로그래밍, 캡슐화, 쓰레드, 소켓

giggs 2022. 7. 20. 19:36

 

 

-- Index --

 

 

객체지향 프로그래밍 캡슐화 쓰레드 소켓
유지보수 정보은닉 생성, 사용해보기 단체 채팅 만들기

 

 

 

 


 

 

 

객체지향 프로그래밍은 : 하나의 방법론 / 패러다임

 

 

 

 

 

 

객체지향 프로그래밍의 가장 큰 장점

유지보수 편리( 사람한테 좋음 , 컴퓨터에게는 잘 모름 )

 

 

 

 


 

 

 

 

1. 캡슐화란?

  • 필드에서 접근제한자 private 해줘서 외부에서 접근방지
  • 캡슐화를 왜 하는지가 중요하다.
  • 왜 하는지?
  • // 다른 사람이 캡슐 안에 있는 내용을 직접 안에 내용물을 건드리는 게 싫어서.
  • // 변형이나 다른 오류 없이 데이터를 온전하게 전달하기 위해서
  • // 데이터를 객체로(캡슐로) 감싸서 전달

 

 

 

 

 

 


 

 

 

 

2. 쓰레드 ( Thread )

 

 

 

쓰레드 만드는 방법

  1. new Thread()
  2. extends Thread
  3. implements Runnable

 

 

 

1. extends Thread 

 

 

 


 

2. implement Runnable

 

  • Runnable 인터페이스를 구현한 클래스
  • 함수 대신 클래스?
  • java는 함수를 변수에 넣어줄 수 없으니까 객체로 만들어서 넣어준다.
  • Runnable 클래스에는 반드시 구현해야 할 특별한 함수(run())가 들어있다.
  • Runnable 인터페이스는 run()이라는 메서드 단 하나만을 보유한 인터페이스 
  • – 이러한 인터페이스를 Functional Interface라고 한다.

 

 

어떤 특별한 함수? - run();

 


 

MyThread 클래스 함수형 인터페이스 Runnable 구현한 MyThread 클래스

 


 

메인 – 내가 만든 MyThread() 객체를 넣어주고 start()로 호출!

start() 함수 안에 run() 호출하는 메소드 포함되어있다. 큰 틀이 start()

 

 

 


 

 

3. 람다식

  • 어차피 메서드 하나 넣어주려고 이런 짓을 하는 것이다.
  • 즉, 메소드 하나만(할 일) 있으면 된다.
  • 람다식으로도 가능.
  • 람다식으로 입력한 함수가 run() 메서드 오버라이드 해서 구현한 것과 같은 기능

 

 


 

 

# 람다식으로도 활용 가능한 이유는? - 함수형 인터페이스이기 때문에

  • 함수형 인터페이스는 – 원래 객체 생성 불가능 but 함수 하나만 넣어주면 객체 생성 가능하도록 해줌
  • new Thread( 파라미터 )
  • 파라미터로 Runnable 객체가 와야 하는데
  • 람다식으로 만들어준 함수가
  • implement Runnable 해서 run() 메서드 오버라이드 구현한 객체와 같이 처리된다.
  • 어떻게?
  • @Functionallnterface Runnable 타입이 파라미터로 오기 때문에

 

 

 


 

 

4. 익명 클래스로 할 일 전달.

 

 

 

 

 


 

 

5. start()와 run() 차이점

  • start()로 호출해서 사용하는 이유는?
  • run()으로 호출해도 작동 다 잘 된다.
  • 하지만 Thread.currentThread().getName() 으로
  • 어떤 쓰레드가 작업했는데 확인해보면
  • Thread.currentThread().getName();

 

 

 

 

start() 함수가 새로운 쓰레드를 생성해주고

그 쓰레드가 일을 하게 명령해주는 것이다.

 

run() 해주면 새로운 쓰레드 생성 안되고

메인쓰레드가 run()을 다 실행

 

 

 

 

 


 

 

 

 

 

3. 소켓 ( 단체 채팅 프로그램 만들어보기 )

 

  • 쓰레드 사용해보기
  • 일단 쓰레드들 할 일 쫙 해놓고
  • 마지막에 일해일해일해 하는 방식으로 만들 것이다~
  • 채팅해보자!

 


 

3-1 구조 잡기

  • javaPrjReview05에서 진행

 

 

 

 

 

컴퓨터(사용자)들이 각자 주고받는 것이 아니라 

서버에 데이터를 보내고 서버가 연결된 애들한테 뿌려는 식으로 구현할 것이다.

 

 

 

 

 

 

서버 쪽에서

듣기를 계속 기다리는 쓰레드와  뿌려주는 쓰레드

2개의 쓰레드 필요

 

 

 

 

 

 

 


 

 

 

3-2 각 부분 작업하기

 

 

1. 클라이언트 메인에서 작업

 


 

 

 

클라이언트 끝

 

 


 

 

 

 

2. common에 리더와 센더에서 작업

 

 

# 리더

 

 

 


 

 

# 센더

 

 

 

 

공통부분 끝

 

 


 

 

 

 

3. 서버 쪽 시작

 

 

 

 

# 서버 리더에서 작업

  • 서버 리더는 메시지를 읽고 / queue에다가 담기(offer) 까지만 작업 / 출력은 필요 없다.
  • queue는 LinkedList로 서버 메인에 static으로 만들어 두기~  재할당 없으니 final도 추가해주기~

 

 

 

나중에 보내는 작업하는 sender에서는 queue에 담겨있는 메시지 하나하나 보내 주면 된다.

queue는 서버 측에만 있는 것이다.

 

 

 


 

 

 

# 서버 센더에서 작업

 

 

 

 

# 12~ 33번 라인

  • 한 두 번은 에러 나서 종료돼도 다시 반복되도록 try/catch 전체 감싸도록 while문 감싸주기

 

# 15번 라인

  • -무한 반복하는 하는 곳에 블라킹 되는 요소 없으면 잠깐이라도 쉬게 해주어야 한다.
  • - 읽으려고 준비하는 readLine() 같은 것이 있어도 걸어주는 게 맞긴 맞다. 

 

#20번 라인

  • - 읽어온 메시지 없으면 다시 읽기 반복하러 고고

 

# 23번 라인

  • - 서버 메인에 있는 bwList 가져오기
  • - 큐에서 꺼낸 메시지를 보내려면 연결된 소켓에 정보를 알아야 한다.

 

 


 

3. 서버 메인에서 작업

 

  • 서버 소켓은 Client로부터 받은 메시지를 받기만 하고 – 모아 놓은 다음에 – 연결된 모든 애들에게 보내줄 것이다.
  • 보내는 부분 --> 읽어온 거 보내는 1개만 있으면 된다~ - 1번만 생성하면 된다.(23~24번 라인)
  • 읽는 부분 --> 연결된 소켓 모두 읽어와야 하므로 소켓만큼 쓰레드 필요하다.(37번 라인)
  • 읽는 부분 --> + 연결 대기 중부터 읽어오는 부분까지 무한 반복 필요하다. 계속 만들어야 한다. while문

 

 

 

# 16번 라인 - 버퍼드라이터 저장해놓을 자료구조 필요하다 – 뭘로 할까 ArrayList

 

# 28~29번 라인 -- 연결된 소켓 정보 필요( 서버 소켓은 accept 되면 일반 소켓 만들어주던 거 기억)

 

# 32번 라인 -- 메시지 보내주려면 연결된 소켓의 outputStream() 필요 ( 성능 위해 버퍼드라이터로 하기)

 

# 33번 라인 --버퍼드라이터(연결된 소켓에 글 써주기) 정보 리스트에 추가해주자

 

 


 

 

4. 추가할 작업

  • finally 해서 close 반납해주는 부분