●간단한 채팅 프로그램 구현하기
여러 사용자가 메시지를 보내고 받을 수 있는 채팅 프로그램입니다.
●기능
사용자 추가: 새로운 사용자를 채팅방에 추가할 수 있는 기능. 각 사용자는 고유한 사용자 이름을 가져야함.
메시지 보내기: 전송자의 이름과 메시지 내용을 포함한 메시지 보내기 기능.
메시지 확인: 최근에 보낸 메시지를 확인하는 기능. 채팅방의 대화 기록을 출력해야 함.
소스 코드: https://github.com/NHclub/Implementation/tree/main/src/chatProgram
●첫 번째 문제점: 멤버 설정과 클래스 구성
클래스와 멤버 변수들의 네이밍과 클래스에 맞게 분류를 혼자 힘으로 하지 못하고 있음..
이것에 대해 더 많은 프로그램들의 동작 방식을 익혀야 함
●두 번째 문제점: 유저가 채팅방에 추가 되었을 때 아무런 문구가 나오지 않음
public void addUser(String userName) {
for(User u:users){
if (!u.getUsername().equals(userName)) {
User newuser = new User(userName);
users.add(newuser);
System.out.println(userName + "님이 채팅방에 들어오셨습니다.");
}else {
System.out.println("같은 이름의 사용자가 있습니다. 이름을 변경해 주세요.");
}
}
}
user생성을 users를 돌면서 실행해서 users에 아무것도 없으면 동작하지 않음 결국 항상 users는 비어있게 됨.
로직 변경
●세 번째 문제점: 같은 이름의 사용자가 있어도 추가 됨.
같은 사용자가 있는지 없는지 확인 후 있으면 true 없으면 false 값을 갖도록 flag 변수를 하나 생성했음.
그다음 flag가 flase 면 users에 생성되게 true면 이름 변경 요청 출력하도록 수정
public void addUser(String userName) {
boolean flag = false;
if (users.size() == 0) {
User newuser = new User(userName);
users.add(newuser);
System.out.println(userName + "님이 채팅방에 들어오셨습니다.");
return;
}
for (int i = 0; i < users.size(); i++) {
if(users.get(i).getUsername().equals(userName)){
flag = true;
}
}
if (flag == false) {
User newuser = new User(userName);
users.add(newuser);
System.out.println(userName + "님이 채팅방에 들어오셨습니다.");
} else {
System.out.println("같은 이름의 사용자가 있습니다. 이름을 변경해 주세요.");
}
}
기능 이상 무!!!!!!!!!!
●네 번째 문제점: 최근 메시지가 제대로 출력이 안됨
messages를 뒤에서 부터 사용자의 이름과 같을 때 까지 순회하며 찾은 index를 저장. 만약 찾지 못했으면 index에 -1을 할당해서 구분지었음.
index가 -1이라면 찾지 못했다는 메시지 0이 아니라면 그 index 값의 메시지 출력
public void printRecentMessages(String userName) {
int index = -1;
for(int i = messages.size(); i>0; i--) {
if (messages.get(i-1).getSender().equals(userName)) {
index = i-1;
break;
}
}
if (index == -1) {
System.out.println("최근에 보내신 메시지를 찾을 수 없습니다.");
}else{
System.out.println(messages.get(index).getSender() + ": " + messages.get(index).getContent());
}
}
구현 완료!!!!!
●코드 리뷰
1. User 클래스의 sendMessage 메시지를 받아서 동일한 메시지를 반환하고 있다.
User 클래스를 단순히 사용자 정보를 저장하는 용도로만 사용하는 것이 더 낫다.
2. ChatRoom 클래스의 addUser 메소드는 중복을 확인하기 위해 리스트를 순회한다.
userName을 저장할 Set 자료구조를 추가해서 비교하면 안정성과 가독성이 높아진다.
3. ChatRoom 클래스의 printRecentMessages 메소드도 마찬가지이다.
Map 자료구조를 활용하면 메시지를 더 빨리 찾을 수 있다.
●느낀 점
각 정보를 저장하는 알맞은 자료구조를 활용한다면 훨씬 편리하고 안전하게 유지할 수 있다.
속성과 행동이 명확하게 객체를 분리하여 알맞은 네이밍을 하는 연습이 많이 필요할 것 같다.
'Java > 구현하기(Implementation)' 카테고리의 다른 글
23.06.28) Spring 나만의 Blog 구현하기 (0) | 2023.06.28 |
---|---|
23.06.27) Spring 나만의 Blog 구현하기 (0) | 2023.06.27 |
23.06.21) Java 계좌 관리 프로그램 구현하기 (0) | 2023.06.21 |
23.06.20) Java 계좌 관리 프로그램 구현하기(Bank class 구현) (0) | 2023.06.20 |
23-06-19) Java 캡슐 판매 기계 구현하기 (0) | 2023.06.19 |