작성
·
278
1
안녕하세요. 요즘 강사님 덕분에 재밌게 공부하고 있습니다 ^^ 강의 듣다가 궁금한 부분이 생겨서 질문 남기게 되었습니다.
강의 5: 10초 부분에서 findMembers.size() > 0 으로 바꾸는게 좀 더 최적화 될 수 있다고 말씀하셨는데
isEmpty()의 시간복잡도가 O(1)이고 size()는 O(n)으로 알고 있습니다.
그래서 isEmpty()를 주로 썼었는데 단순히 조건에서의 효율만 말씀하신 것이 아니라는 생각이 드네요.
혹시 실제 실무에서는 저런 경우 어떤식으로 최적화 하는지 대략적으로라도 알 수 있을까요?
답변 1
1
안녕하세요. 이동현님, 공식 서포터즈 codesweaver 입니다.
.
List의 구현체가 보통은 ArrayList일 텐데 이 떄 size() 메서드는 필드에서 관리되고 있는 사이즈 값을 그대로 리턴하기에 O(1)의 동작속도를 갖습니다.
.
'그리고 최적화가 될 수 있겠다'는 의미를 저는 이렇게 받아들였습니다.
.
현재는 중복되는 회원이 있는지 없는지를 판단하기 위해 전체 멤버 객체들을 콜렉션에 담아서 그 콜렉션이 비었는지 체크하고 있습니다. 쿼리문으로 치면 'select * from member where name=:name' 인 상태 입니다.
.
그러나 우리가 알고픈 것은 중복되는 사람이 있는지만 알면 됩니다. 쿼리로 치면 다음과 같아집니다. 'select count(*) from member name=:name' 그리고 이 카운트 값만 받아와서 이 값이 0보다 큰지 체크하면 됩니다. 객체와 콜렉션 같은 무거운 아이들을 이용하지 않아도 구현할 수 있는 로직이기에 최적화가 가능하다고 말씀하신것 같습니다.
.
감사합니다.
size는 갖고 있는 모든 요소의 갯수를 확인해야해서 O(n)이라는 글을 봤었는데 잘 못 된 지식 이었나보네요
count(*) 부분을 생각을 못하고있었습니다
양질의 답변 감사합니다