늦은 프로그래밍 이야기

221128 TIL (은행관리 프로그램) 본문

내일배움캠프/TIL, WIL

221128 TIL (은행관리 프로그램)

한정규 2022. 11. 28. 21:45

TIL

오늘 배운 내용 정리

객체지향 프로그래밍

2022.11.28 - [내일배움캠프/객체지향 프로그래밍] - 3계층 구조

 

3계층 구조

3계층 구조 (3 Tier Architecture) - 어떠한 플랫폼을 3계층으로 나누어 별도의 논리적/물리적인 장치에 구축 및 운영하는 형태 프리젠테이션 계층 (Presentation Tier) - 사용자가 직접 마주하게 되는 계층.

jk891113.tistory.com

 - 프로젝트를 진행하며 객체지향 시간에 배웠던 3계층 구조에 대해 고민해 보고 정리해 보았다.


미니프로젝트

for (TransInfo transInfo: transInfoList) {
    TransInfo target = transInfoList.get(i);
    if (accountNum.equals(target.getAccountNum())) {
        transInfoList.remove(target);
    }
}

 - transInfoList 리스트의 인덱스들을 반복하며 AccountNum이 일치하는 인덱스는 리스트에서 삭제하는 코드를 구현 했는데,

ConcurrentModificationException 에러가 뜨면서 프로그램이 종료되었다.

 - 구글링 해본 결과 문제는 for문에서 순회하면서 요소를 삭제하기 때문에, 인덱스가 변경되어 그 뒤의 일부 요소는 순회하지 않을 수 있어서 ConcurrentModificationException이 발생한다고 한다.

 

  • 해결방법 1 : Iterator로 순회 및 요소 삭제

 - Iterator는 순회 중에 요소를 삭제해도 ConcurrentModificationException가 발생하지 않는다.

for (Iterator<String> iterator = fruits.iterator(); iterator.hasNext();) {
    TransInfo item = iterator.next();
    if (accountNum.equals(item)) {
        iterator.remove();
    }
}

 

  • 해결 방법 2 : removeif()로 요소 삭제

 - Lambda를 인자로 전달하면 해당하는 요소들이 리스트에서 삭제.

transInfoList.removeIf(item -> item.equals(accountNum));

 

  • 해결 방법 3 : removeAll()로 삭제

 - 반복문에서 삭제할 요소들을 찾고 임시리스트에 추가 후 removeAll()로 임시리스트의 모든 요소들을 삭제.

List<TransInfo> removed = new ArrayList<>();
for (TransInfo transInfo: transInfoList) {
    TransInfo target = transInfoList.get(i);
    if (accountNum.equals(target.getAccountNum())) {
        removed.add(target);
    }
}
transInfoList.removeAll(removed);

 

  • 해결 방법 4 : 반복문에서 역순으로 순회하며 삭제

 - 0번 인덱스에서 마지막까지 순회할 때 값을 삭제하면 인덱스가 바뀌지만, 마지막 인덱스부터 0번 인덱스까지 순회하면 요소를 삭제해도 아직 순회하지 않은 요소들의 인덱스는 변하지 않는다.

for (int i = transInfoList.size() - 1; i >= 0; i--) {
    TransInfo target = transInfoList.get(i);
    if (accountNum.equals(target.getAccountNum())) {
        transInfoList.remove(target);
    }
}

 

 - 여러가지 방법이 있었지만, 마지막 방법이 익숙해서 마지막 방법으로 수정하였다.

 - 구글링해서 찾아본 블로그의 내용에서는 추천하지 않는 방식이었다.


오늘 배운 것

오늘 프로젝트를 모두 완성하고 튜터님들에게 완성한 코드리뷰를 하러 갔었다가 3티어에 대해 설명을 들었다.

이번에 3티어를 완벽하게 구현하지는 못했지만, 메모장 프로그램과 은행관리 프로그램 두개의 연습예제가 생겼다.

다음에 해당 프로젝트들을 3티어 구조로 바꾸면서 연습해보고 객체지향 프로그래밍과 3티어 구조 설계에 조금 익숙해지도록 해야겠다.

 

스프링 강의를 시작하기 전에 객체지향 프로그래밍을 어느정도 이해하는 것을 목표로 여러 자료들과 동영상들을 찾아보고

2개의 프로젝트를 변형시켜 보면서 연습해 보아야겠다.


Comments