<aside> 💁‍♂️ 배열과 List 같은 컬렉션을 따라다니는 악마를 소개하고, 이러한 악마를 퇴치하는 방법을 알아봅시다.

</aside>

#7-1. 이미 존재하는 기능을 다시 구현하지 말기

[code 7-1] ‘감옥 열쇠’를 소지하고 있는지 확인하는 코드

boolean hasPrisonKey = false;

for (Item each : items) {
	if(each.name.equals("감옥 열쇠")) {
		hasPrisonKey = true;
		break;
	}
}

위와 같은 코드는 for loop 안에서 if 조건이 중첩되어 있어 가독성이 좋지 않습니다.

따라서 다음과 같이 개선할 수 있습니다.

[code 7-2] anyMatch 메서드

boolean hasPrisonKey = items.stream().anyMatch(
		item -> item.name.equals("감옥 열쇠")
);

anyMatch 메서드는 자바 표준 라이브러리에 있는 컬렉션 전용 메서드입니다.

이처럼 anyMatch 메서드를 알고 있으면, 복잡한 로직을 직접 구현하지 않아도 됩니다.


#7-3. 응집도가 낮은 컬렉션 처리

컬렉션 처리도 응집도가 낮아지기 쉽습니다.

[code 7-8] 멤버 조작과 관련된 클래스

class FieldManager {
	//멤버 추가
	void addMember(List<Member> members, Member newMember) {
		if (members.stream().anyMatch(member -> member.id == newMebmer.id)) {
			throw new RuntimeException("이미 존재하는 멤버입니다.");
		}
		if (members.size() == MAX_MEMBER_COUNT) {
			throw new RuntimeException("이 이상 멤버를 추가할 수 없습니다.");
		}

		members.add(newMember);
	}

	boolean partyIsAlive(List<Member> members) {
		return members.stream().anyMatch(member -> member.isAlive());
	}
}

FieldManager는 게임에서 필드 맵을 관리하는 클래스입니다.

파티에 멤버를 추가하는 addMember 메서드와 파티에 살아 있는 멤버가 있는지 리턴하는 partyIsAlive가 정의되어 있습니다.

하지만 필드 맵 말고도 게임에서 멤버를 추가하는 시점이 있을 수 있습니다.

[code 7—9] 다를ㄴ 클래스에 구현된 중복 코드

class SpecialEventManager {
	void addMember(List<Member> members, Member member) {
		members.add(member);
	}
}