인프런 커뮤니티 질문&답변

zzzzz님의 프로필 이미지
zzzzz

작성한 질문수

스프링 핵심 원리 - 기본편

회원 도메인 실행과 테스트 강의 8분 40초 질문입니다.

작성

·

254

·

수정됨

0

스프링 핵심 원리 이해1 - 예제 만들기 질문입니다.

  1. 회원 도메인 실행과 테스트 강의 8분 40초에 memorymemberrepository가 추상화에도 의존하고 구체화에도 의존한다는게 무슨뜻인가요?

 

2.주문과 할인 도메인 개발 7분

public class OrderServiceImpl implements OrderService{
    private final MemberRepository memberRepository=new MemoryMemberRepository();
    private final DiscountPolicy discountPolicy=new FixDiscountPolicy();

자바를 배울 때

private final MemberRepository memberRepository=new memberRepository();

이런식으로 객체도 같은 이름으로 생성해서 항상 그런줄알았는데 왜 memberRepository() 이게 아니라 MemoryMemberRepository() 이런식으로 되는건가요?

  1. implements와 extends차이점이 뭔가요? https://velog.io/@hkoo9329/%EC%9E%90%EB%B0%94-extends-implements-%EC%B0%A8%EC%9D%B4 여기서는

    class가 class를 상속받을 땐 extends를 사용하고, interface가 interface를 상속 받을 땐 extends를 사용한다. 이렇게나와있는데 이게 맞는거아요?

 

주문과 할인 도메인 실행과 테스트 1분

public class OrderApp { public static void main(String[] args) {

MemberService memberService = new MemberServiceImpl();

OrderService orderService = new OrderServiceImpl();

long memberId = 1L;

Member member = new Member(memberId, "memberA", Grade.VIP);

memberService.join(member);

Order order = orderService.createOrder(memberId, "itemA", 10000); System.out.println("order = " + order); } }

  1. Long memberId=1L 여기서 1리터가 무슨 뜻인가요?

  2. public class Member {

private Long id;

private String name;

private Grade grade;

Member클래스에 grade로 변수 선언했는데요. grade가 소문자가 아닌 Grade.VIP 대문자로 되어있는데 왜이러는건가요?

 

 

답변 1

0

안녕하세요. ekek님, 공식 서포터즈 코즈위버입니다.

1,2,3,4 질문에 답을 드리기 위해선 다형성과 상속 개념을 설명드리면 될 것 같아요.

 

어떤 학급에 '철수'라는 객체가 있습니다. 또 '영희'라는 객체도 있습니다. 철수와 영희는 서로 다른 객체입니다. 그런데 이 둘을 하나의 개념으로 묶을 수 있어요. 가령 '학생' 이라고 하면 철수와 영희 모두 해당하죠. '철수는 철수이다 또한 철수는 학생이다' 그러니 철수는 철수라 할 수 있고 또 학생이라고 할 수 있다. 이런 개념을 다형성이라 합니다. '추상화'라고 이해하시면 될 것 같아요. 학생을 모두 아우르는 개념(추상화)은 '사람' 이 올 수 있습니다.

 

이런 추상화를 자바에서는 상속 혹은 구현(implements)으로 표기할 수 있습니다. '모든 학생은 사람이다'는 다음과 같이 표현합니다.

class Student extends Person {

... code ...

}

Person 철수 = new Student();

이제 자바에서는 Student 객체를 Student 로 사용할 수도 있고 Person으로 사용할 수도 있습니다. 하지만 약간의 제한은 있습니다. 이런 제한이 생기는 이유는 '모든 학생은 사람이다'를 만족하지만 '모든 사람은 학생이다'를 만족하지 않는 것과 마찬가지 입니다. A extends B 관계일 때 A를 자식, B를 부모 라고 하는데, 자식객체는 부모 객체의 모든 속성을 이용할 수 있으나 부모 객체는 자식 객체의 값을 모두 제어할 수는 없습니다.

 

자바는 클래스 상속을 딱 한개로 제한하고 있는데요. 때로는 2~3개 이상의 부모를 가져야만 하는 경우도 있습니다. 이럴 때 유연성을 제공하기 위해 인터페이스(Interface)를 제공합니다. 인터페이스는 갯수에 제한 없이 구현(implements)할 수 있지요. (클래스와 클래스, 인터페이스와 인터페이스 상속은 상속이라 표현하고, 클래스와 인터페이스 간 상속은 구현이라 합니다)

 

  1. 숫자가 Long타입임을 알리기 위한 표기라고 보시면 됩니다. 가령 숫자뒤에 아무값도 없는 경우 자바는 기본적으로 이 값을 Integer 로 해석하려 합니다. 그러나 123L 처럼 뒤에 L이 붙은 경우 Long 값으로 해석하지요.

감사합니다.

zzzzz님의 프로필 이미지
zzzzz

작성한 질문수

질문하기