이게 뭐죠?
- 비동기 방식으로 데이터를 주고받는 JavaScript 기술인 Ajax 중 하나입니다.
장점이 뭐죠?
- 서버 부하가 줄어듭니다.
- 웹 요청이 들어왔을 때, HTML을 서버 사이드에서 렌더링하여 반환하는 것이 아니라,
- 클라이언트 사이드에서 HTML을 그릴 수 있도록 필요한 정보만을 반환하게됩니다.
- 또한 사용자 입장에서 사용성이 좋아집니다.
- 어떠한 요청을 보낼 때 마다, 페이지가 새로고침되면서 새로운 페이지가 로딩되는 것이 아닌,
- HTML에서 필요한 정보만 새로 로딩됩니다.
Stateless하게 만들어야 하는 이유?
- race-condition이 발생하기 때문입니다.
- 멀티 쓰레드 환경에서 동시에 두개의 쓰레드가 동일한 작업을 수행하면, 상태를 가지고 있는 데이터가 의도하지 않은 대로 동작할 수 있습니다.
- 이를 방지하기 위해 한번에 하나의 쓰레드만을 접근토록하는 synchronized 예약어가 있는데, 이는 성능저하를 일으킵니다.
- 따라서, Stateless하게 만든다면, 해당 고민이 없어집니다.
추상클래스와 인터페이스를 비교해 주세요
- 추상클래스란, "클래스 내에 추상 메서드가 하나 이상 포함된 클래스"를 뜻합니다.
- 인터페이스란, "모든 메서드가 추상메서드인 경우"를 뜻합니다.
- Java8 부터는 default 메서드를 통해, 일반 메스드의 구현도 가능합니다.
- 추상클래스는 해당 클래스를 상속받아 기능을 이용하고, 확장하는데에 있습니다.
- 즉 슈퍼 클래스의 기능을 이용하거나, 확장하기 위해 사용합니다.
- 다중 상속은 지원하지 않습니다.
- 인터페이스는 함수의 껍데기만 있는데, 그 이유는 함수의 구현을 강제하기 위해서 입니다
- 구현한 객체들에 대해 동일한 동작을 약속하기 위해 존재합니다.
- 인터페이스는 안이 비어있는 메서드들의 형태만 써 놓은 것이며, 상속하는 클래스들에서 해당 메서드들의 내용을 구현해서 가져야 하는 메서드들의 집합입니다.
본인은 언제 추상클래스를 쓰고, 언제 인터페이스를 쓸 건가요?
- 물론 여러가지 의견이 있겠지만, 저의 경험으로 미루어보아,
- 추상클래스는 "관련성이 높은 클래스간에 코드를 공유하고 싶은 경우" 사용할 것입니다.
- 상속받은 클래스들이 공통으로 가지는 메서드와 필드가 많은 경우 사용이 용이합니다.
- 저는 체스 미션에서 체스 기물들을 구현할 때 Piece라는 추상클래스를 두고, 이를 상속받은 여러 구체화된 기물들을 설계했습니다.
- 명확한 is-a 관계라고 생각했고, 공통으로 가져야할 메서드와 필드가 많았습니다.
- 첫수 움직임이라던지, 규칙을 확인하여 true/false를 반환한다는 지
- 인터페이스는 "타입의 행동을 명시하고 싶을 때" 사용할 것입니다.
- 전략 패턴에서 인터페이스를 통해 프로그램에서 필요한 알고리즘을 추상화 시킨 경험이 있습니다.
- 물론 추상화 기법을 추상클래스를 통해 할수도 있었겠지만, 인터페이스를 통해 시킨 이유는, 해당 전략 콘크리트 클래스의 초점이 어떠한 행동을 하는지에 초점을 맞췄기 때문입니다.
상속을 통해 얻는 장점이 뭔가요?
- 코드를 재사용해 중복을 줄임
- 변화에 대한 유연성과 확장성을 증대시킴
- 다형성이 뭐죠?
- 다형성은 "하나의 타입에 여러 객체를 대입할 수 있는 성질"이에요.
상속의 단점?
- 캡슐화를 저해할 수 있다는 단점이있어요.
- 상속이라는 것이 하위 클래스와 상위 클래스를 강하게 의존/결합시킨다.
- 상위 클래스의 변화는 하위 클래스의 변화를 필수적으로 만든다.
- 상위 클래스의 메서드 이름과 매개 변수의 변화는 하위 클래스 전체의 변경을 야기
- 또한 상위클래스의 메서드를 오버라이딩하게되면, 하위클래스에서는 상위클래스의 계약 사항을 잘 준수해야 해요.
- 이를 SOLID의 LSP라고 하는데요,
- 계약 사항을 잘 준수하기 위해서, 결국 상위클래스가 내부적으로 어떻게 동작하는지를 하나하나 잘 알아야 해요.
조합은 뭔가요?
- 조합은 "기존 클래스가 새로운 클래스의 구성요소로 쓰임"을 지칭
- 새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조함
조합의 장점?
- 기존의 클래스의 구현에 의존하지 않음
- 기존 클래스의 public 메서드만 사용할 수 있다.
- 객체 내부가 변경되더라도, 영향을 최소화 시켜서 받을 수 있다.
상속은 언제?
- 확실한 is-a 관계이면서,
- 상위 클래스의 구현이 하위 클래스의 구현에 필수적인 경우 사용하면 좋다고 생각합니다.