자바 기초적인건데 헷갈렸던...

쪼경·2021년 7월 12일
0
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
→ 부모객체는 선언만하며, 정의는 자식에서 오버라이딩해서 사용해야함

profile
[개발자] Lv.1

0개의 댓글