✍ Today I Learned
[피카츄 키우기 게임]
- 기존에 계속해서 새로운 객체를 생성하던 구조에서 각 캐릭터의 경험치를 저장하는 구조로 변경하려면? 캐릭터의 경험치를 담을 공간이 필요하다. 배열을 이용하거나 또 다른 객체를 사용할 수 있다.
- [배열을 이용한 방법]
- Character 타입의 배열을 캐릭터 개수만큼 생성하고 각 인덱스에 new 연산자로 새로운 캐릭터 객체를 할당한다. (하지만 이렇게 하면 배열에 할당하면서 생성자 함수를 호출하기 때문에 각 캐릭터의 상태 값이 프린트돼버림)
- 캐릭터 선택 값은 switch문 대신 배열의 인덱스를 이용한다.
- 캐릭터 선택도 반복되어야 하기 때문에 이중 반복문으로 설정한다.
- 내가 헷갈렸던 부분은 캐릭터 객체와 플레이 객체의 생성 시점이었는데, 나는 플레이 객체도 캐릭터 객체처럼 초기 설정에서 객체를 담을 변수를 선언하고 이후 첫 플레이의 경우에만 new 연산자를 이용하여 새 플레이 객체를 변수에 할당해주었다. 하지만 플레이 객체 자체가 결국 캐릭터 객체의 주소 값을 가지고 세팅되므로 계속 새롭게 생성해주어도 캐릭터 객체의 주소 값이 변하지 않는다면 기존 캐릭터가 유지된다!
- 이렇게 뷰와 컨트롤러의 영역이 합쳐져 있는 것을 MVC1(Model, View, Controller) 패턴이라고 한다. 프로젝트 규모가 커질수록 유지보수가 어려워 요즘은 잘 사용하지 않는다고 한다.
- [인벤토리 클래스를 이용한 방법]
- 캐릭터를 저장할 수 있는 인벤토리 클래스를 생성하여 캐릭터 선택 로직을 새로운 객체로 생성한다.
- 인벤토리 객체의 생성 시점은? 게임 초기 설정 때 해주어야 캐릭터 객체의 주소 값이 변하지 않는다.
- 각 캐릭터 타입으로 멤버 변수를 선언해놓고, null값을 체크하여 캐릭터 객체를 할당한다. 할당된 캐릭터를 반환하여 컨트롤러 쪽으로 돌려주면 해당 캐릭터 객체로 플레이 객체를 생성한다.
[웹 서비스 프로그램]
- 처음부터 완벽히 설계하려고 하지 말고 일단은 그때그때 필요한 객체들 만들면서 진행하기. 나중에 고치면 된다!
- 회원 객체 배열을 어느 클래스에서 저장해야 하나 고민했는데 문제에 답이 있었다(...) 요청사항 꼼꼼히 읽자^^
- 반복문과 종료 조건은 세트!
- 데이터가 변하지 않기 때문에 객체는 초기 설정 때 한 번만 생성되어야 한다. (반복문에 new가 있으면 안 됨)
- 데이터 베이스 안에서 메뉴 선택이 계속 이루어 지므로 이중 반복문으로 설정한다.
- 나는 main 메서드에서 모든 로직을 처리하려 했는데, Init 클래스에서는 입력만 받고 회원과 관련된 로직은 DataBase 클래스에서 해결하는 것이 좋다.
- 파라미터로 데이터를 전달하고! 리턴으로 데이터를 전달받고!
- [회원가입]
- 회원가입에 필요한 3가지 로직
- 회원 배열에 빈자리가 있는지?
- 중복된 이메일이 아닌지?
- 탈퇴한 자리에 다시 가입
- 앞단에서 입력받은 회원 정보를 Member 객체로 만들어 WebService 클래스의 메서드로 전달한다.
- 그 데이터를 다시 DataBase 클래스로 전달하고, 위의 로직들을 거쳐 true or false를 반환한다.
- 결과에 따라 성공 or 실패 메시지를 출력한다.
- 왜 회원 데이터를 객체로 만들어 전달할까? 파라미터의 개수가 많아지면 데이터 관리가 힘들기 때문이다.
- 회원가입에 필요한 3가지 로직
- [로그인]
- 전체 멤버 배열을 돌아서 일치하는 이메일과 패스워드가 있으면 true, 없으면 false를 반환한다.
- 로그인 성공과 동시에 닉네임을 출력하고 싶으면? 리턴 타입이 boolean이었던 메서드의 리턴 타입을 String으로 변경하고 입력한 이메일, 패스워드와 일치하는 정보의 닉네임을 반환한다.
- [회원 수정]
- 회원가입과 마찬가지로 앞단에서 회원 정보를 입력받고 DataBase 클래스까지 전달 후 일치하는 이메일을 찾아 그 인덱스에 해당하는 회원 정보를 회원에게 입력받은 회원 정보로 덮어 씌운다. 그러고 나서 true를 반환한다.
- return true에 걸리지 않고 for문이 종료되면 실패 메시지를 출력하고 false를 반환한다.
- [회원 탈퇴]
- 입력받은 회원 정보와 일치하는 이메일을 찾아 그 회원 객체의 값을 null로 변경한 후 true를 리턴한다. 일치하는 이메일을 찾지 못하면 실패 메시지를 출력하고 false를 반환한다.
- [회원 전체 리스트 출력]
- 여태까지는 앞단에서 전달받을 데이터가 없었다면, 이번에는 Database 클래스로부터 전체 회원 객체 배열을 전달받는다.
- 프린트 기능의 메서드를 이용하여 출력한다.
- [특정 회원 상세 정보 조회]
- 전달할 데이터도 있고, 전달받을 데이터도 있는 경우이다. 회원 이메일 정보를 전달하고, 해당 회원의 전체 정보를 전달받는다.
- 이때, 회원의 이메일만 입력받는 회원 탈퇴 메서드를 파라미터의 값만 다르게 주어 재사용한다.
- 어떤 경우에 null을 반환하는 건지 주의 깊게 살펴보자.
- 객체 간의 데이터 전달은 3가지만 생각하자.
- 데이터 타입
- Getter
- Setter
- 백견이불여일타!
'📝 TIL' 카테고리의 다른 글
[TIL] Java Enum, MySQL 개발 환경 설정, JDBC (0) | 2022.05.26 |
---|---|
[TIL] Java ArrayList, HashSet, HashMap, Generic (0) | 2022.05.24 |
[TIL] Java 인터페이스, 내부클래스, 예외처리 (0) | 2022.05.20 |
[TIL] Java 빌트인 패키지, 접근제어자, 상속, 오버라이딩, 다형성, 추상 클래스 (0) | 2022.05.19 |
[TIL] Java 뱅킹, 호텔, 메모리구조, 캡슐화 (0) | 2022.05.18 |