-- Index --
객체지향 프로그래밍 | 캡슐화 | 쓰레드 | 소켓 |
유지보수 | 정보은닉 | 생성, 사용해보기 | 단체 채팅 만들기 |
객체지향 프로그래밍은 : 하나의 방법론 / 패러다임
객체지향 프로그래밍의 가장 큰 장점
유지보수 편리( 사람한테 좋음 , 컴퓨터에게는 잘 모름 )
1. 캡슐화란?
- 필드에서 접근제한자 private 해줘서 외부에서 접근방지
- 캡슐화를 왜 하는지가 중요하다.
- 왜 하는지?
- // 다른 사람이 캡슐 안에 있는 내용을 직접 안에 내용물을 건드리는 게 싫어서.
- // 변형이나 다른 오류 없이 데이터를 온전하게 전달하기 위해서
- // 데이터를 객체로(캡슐로) 감싸서 전달
2. 쓰레드 ( Thread )
쓰레드 만드는 방법
- new Thread()
- extends Thread
- 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 반납해주는 부분
'Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원 > 7월' 카테고리의 다른 글
22.07.14 - [ WAS ] WS vs WAS, tomcat 사용해보기 (0) | 2022.07.21 |
---|---|
22.07.13 - [ DB 모델링 ] UML, 유스케이스 다이어그램 (0) | 2022.07.21 |
22.07.12 - [ 7차 시험! - UI 구현 ] (0) | 2022.07.20 |
22.07.11 - [ 복습 ] [ DB ] { 구문 , 함수, 집한 연산자, join, trigger} (0) | 2022.07.20 |
22.07.07 - [ java 복습 ] 변수, 연산자/제어문, 배열, 객체. 클래스, 상속, String (0) | 2022.07.18 |