
어느새 6주차도 마무리가 되었고, 이제는 매일 매일이 빠르게 가는 것 같다.
이번 주는 강의만 들은게 아니라, 지금껏 배운 Java를 사용해서
미니 프로젝트를 만들어가는 그런 시간을 가졌는데, 확실히 이론만 복습하고
공부하는 것보다는, 직접 프로그램을 설계하면서 발생하는 오류들을 해결하고,
기능을 하나씩 만들어가는게 더 재미도 있고 머리에 쑥쑥 박히는것 같다. 😁
이번 미니 프로젝트는 잠깐 며칠만에 끝내는게 아닌, 앞으로 쭉 배우는
Java 지식들로 계속해서 업데이트를 해 나가는 걸 목표로 할 예정이다.!
저번 주에 배운 제네릭스에 이어 이번 주는 컬렉션에 대해 배웠다.
지금까지는 데이터를 다룰 때엔 배열을 사용했었는데, 컬렉션은 배열과는
달리 크기를 자유자재로 조절할 수 있고, 다양한 메소드들이 제공되어서
자료를 처리하는데 훨씬 편리했었다. 그 중에서도 크게 3가지로 분류하자면
순서가 있고 중복을 허용하는 게 List의 핵심이다.
ArrayList와 LinkedList를 배웠는데,
ArrayList는 인덱스로 빠르게 접근할 수 있어서 조회가 많을 때 좋고,
LinkedList는 중간에 데이터를 추가하거나 삭제할 때 효율적이라는 걸 알게 되었다.
실제로 미니 프로젝트에서 회원을 관리할 때 ArrayList를 써봤는데 ,
배열과는 달리 정말 편리했다.
중복을 허용하지 않는 특성이 Set의 가장 큰 특징이다.
HashSet, LinkedHashSet, TreeSet을 배웠는데,
HashSet은 빠르지만 순서가 없고,
LinkedHashSet은 입력 순서를 유지하고,
TreeSet은 자동 정렬이 된다는 차이점을 이해했다.
특히 중복 제거가 필요한 상황에서 Set의 장점을 느낄 수 있었다.
Key-Value 쌍으로 데이터를 저장하는 Map은 검색의 속도가 빠른 것이 큰 특징이다.
HashMap , LinkedHashMap , TreeMap 에 대해 배웠는데,
HashMap 은 입력 순서가 보장 되지 않고 ,
LinkedHashMap 은 입력 순서 유지,
TreeMap은 키 기준 정렬이라는 차이를 배웠다.
기존 상수의 정의 방식은 의미 불명확, 타입 안정성 부족, 기능 확장 어려움이라는
단점이 있었는데, Enum을 사용하면 의미 명확, 타입 안정성 확보, 메소드 확장 가능,
가독성 향상 등의 다양한 장점을 가져올 수 있게 되었다.
이번 미니 프로젝트에도 성별(Gender) MALE, FEMALE, OTHER 을 Enum 으로
구현해 써봤는데, 그냥 문자열로 “MALE”, “FEMALE”, “OTHER” 이런식으로 쓸 때보다
훨씬 코드가 깔끔하고 안전해 보였다.
이번 주는 강의만 듣는게 아닌 미니프로젝트를 팀이나 개인 단위로 시작하는
시간을 주셔서 그 동안 배운 Java 지식을 사용해 미니 프로젝트를 시작해보았다.
주제는 지난번 프로젝트로 DB로 구현 해보았던 버킷리스트 어플리케이션을
만들어보기로 결정했다.
프로젝트 기본 구조는 Application(main) → Service → Repository의
구조로 아직 Controller는 배우지 못해 추후 배움 이후 구현 해보기로 했다.
유저의 정보는 따로 DB는 연결하지 않고 파일 입출력을 통해 .dat에 저장한다.
Git 브랜치 전략으로는 main은 최종 merge용, 기능 별로 feature/ 브랜치들을
나눠서 업로드 하기로 결정했다.
이번 주에는 SQLD 시험이 끼어 있어서 시간 상 회원가입과 로그인 기능 정도만
구현할 수 있었는데, 다음주부턴 조금씩 기능을 추가해보고 싶다.
기존의 프로그램을 실행하다가 로그인한 회원의 이름을 가져오려고
Member에 생성되어 있는 메소드 getMemberName()을 통해 가져오려고 하는데
StackOverflow 오류가 발생함
→ 알고보니 getMemberName() 메서드가
재귀 형태로 작성되어 있어서 발생하고 있었던 것이다.
public String getMemberName() {
return getMemberName(); // ← 무한 재귀!
}
그래서 getMemberName() 을 지우고 기존에 있던
Getter와 Setter를 만들때 생긴 getName()으로 코드를 고쳤는데 이번엔
InvalidClassExecption 오류 발생 → memberDB.dat 파일에 저장된 Member 객체와
수정한 Member 클래스의 구조가 달라서 발생한 것이다.
InvalidClassException 발생!@Deprecated 사용getMemberName() 은 사실상 getName()과 같은 용도로 쓰일거 같아 나는 .dat 파일을
삭제하고 다시 시작했다. 어차피 초기 데이터도 MemberReopository에서 넣어주고
중요한 데이터를 추가로 넣어둔 것이 아니였기 때문이다
하지만 중요한 데이터들이 많이 담겨 있다면 메소드를 복원하던가 @Deprecated 를
사용하면 될 것 같다.
팀 프로젝트or 개인 프로젝트로 할지 정할 수 있었는데,
주말에있던 SQLD 때문에 금요일에도 휴가를 쓰고 하다보니
팀 프로젝트로 하면 집중을 제대로 못할 것 같아 개인 프로젝트로 진행하였는데,
아무래도 git을 활용해서 연습하기에는 개인보단 팀으로 하는게 좋아보이긴 했다.
그래도 이미 선택한 만큼, 셀프 코드리뷰라던가 pr요청 등의 과정을 최대한
하면서 프로젝트를 진행해 보아야겠다.
아직은 시작한지 얼마 되지 않아서 허접한 미니 프로젝트지만,
앞으로 계속 배울 내용들을 살을 붙여가면서 멋있게 만들어 보고 싶다.
지금은 기본적인 CRUD 기능과 간단한 콘솔 입출력 정도만 구현하겠지만,
예외처리도 넣고, 나중엔 DB도 넣어 보는 등 여러가지를 해보고 싶다~
최종적으론 다른 사람들이 봐도 잘 만든 구성의 프로그램이 될 때까지
차근차근 업그레이드 하다보면 성취감도 늘고 실력도 많이 늘 것 같다. 😆