public interface MemberRepository {
//회원 저장하는 기능
void save(Member member);
//회원의 ID로 회원을 찾는기능
Member findById(Long memberId);
}
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
@Override
public void save(Member member) {
store.put(member.getId(), member);
}
@Override
public Member findById(Long memberId) {
return store.get(memberId);
}
}
public interface MemberService {
//가입
void join(Member member);
//조회
Member findMember(Long memberId);
}
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
@Override
public void join(Member member) {
memberRepository.save(member);
}
@Override
public Member findMember(Long memberId) {
return memberRepository.findById(memberId);
}
}
public class MemberServiceTest {
MemberService memberService = new MemberServiceImpl();
@Test
void join(){
//given - 이렇게 주어졌을때
Member member = new Member(1L, "memberA", Grade.VIP);
//when - 이렇게 했을때
memberService.join(member);
Member findMember = memberService.findMember(1L);
//then - 이렇게 된다
Assertions.assertThat(member).isEqualTo(findMember);
}
}
MemberRepository와 MemoryMemberRepository, MemberService ,MemberServiceImpl 를 만들어놓고
테스트를 구현하고 있는데 갑자기
MemberRepository memberRepository= new MemoryMemberRepository
⇒ 잠깐 이게 이렇게 될수 있는건가???
라는 생각이 들었다
정말 기본적이고 기초적인건데 여태 내가 사용했던 예시들이
Member member = new Member();
이렇게 클래스 타입과 변수에 넣을 생성자가 같았는데 클래스 타입과 생성자가 다른걸 만나서 순간 이게 왜 되는거지? 라는 생각을 했다.
그래서 미래의 내가 또 헷갈릴까봐 지금 알게된걸 적어놓는다.
한심한 과거의 나 자신이 이런걸 헷갈렸냐고 비웃었으면 좋겠는 미래의 나에게..ㅎ
MemoryMemberRepository는 MemberRepository를 상속(implements)하고 있고
class 타입이 MemberRepository인 memberRepository를
new 함으로써 memberRepository를 초기화하면서 MemoryMemberRepository가 가지고 있는 기능을 넣어주었다.
그래서 memberRepository가 MemoryMemberRepository안에서 구현한 기능들을 사용할 수 있다.
여기서 잠깐
extends와 implements의 차이가 뭐지??
extends
는 class가 class를 상속받을때 사용하고, 일반클래스와 abstract클래스 상속에 사용된다.
다중 상속이 지원되지 않아 한개의 클래스만 상속받을 수 있다.
implements
는 class가 interface를 상속받을때 사용하고, interface상속에 사용된다.
다중 상속이 지원되기 때문에 여러개를 상속 받을 수 있다.
extends
→ 부모에서 선언, 정의를 모두하면 자식은 메소드, 변수를 그대로 사용할 수 있음
implements
→ 부모객체는 선언만하며, 정의는 자식에서 오버라이딩해서 사용해야함