본문 바로가기
Java/구현하기(Implementation)

23.06.22) Java 채팅 프로그램 구현하기

by NH_club 2023. 6. 22.

●간단한 채팅 프로그램 구현하기

여러 사용자가 메시지를 보내고 받을 수 있는 채팅 프로그램입니다.

●기능

사용자 추가: 새로운 사용자를 채팅방에 추가할 수 있는 기능. 각 사용자는 고유한 사용자 이름을 가져야함.

메시지 보내기: 전송자의 이름과 메시지 내용을 포함한 메시지 보내기 기능.

메시지 확인: 최근에 보낸 메시지를 확인하는 기능. 채팅방의 대화 기록을 출력해야 함.

소스 코드: 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 자료구조를 활용하면 메시지를 더 빨리 찾을 수 있다.

●느낀 점

각 정보를 저장하는 알맞은 자료구조를 활용한다면 훨씬 편리하고 안전하게 유지할 수 있다.

속성과 행동이 명확하게 객체를 분리하여 알맞은 네이밍을 하는 연습이 많이 필요할 것 같다.