2주차 스터디
알고리즘
알고리즘 섹션에서는
누적합 1806, 프로그래머스 120819, 120837 , 다이내믹 프로그래밍 15486
이 문제에 대해 각각 발표하였고,
나는 15486 문제를 정리하여 발표하였다.
https://github.com/Hyeri1ee/algorithm-8.19-/blob/master/src/week4/day4/P15486.md
이번주는 이분탐색과 다이내믹 프로그래밍을 주제로 잡고 풀고 있는데 여전히 감을 못잡는 것 같다. 다른 사람이 푼 풀이를 보면 이해되는데 막상 내가 풀려고하면 매끄럽게 풀어지지 않는 느낌.. 일단 연습만이 해결책인 것 같아서 하고 있는데 썩...
cs 면접
1. 좋은 객체 지향 설계의 5가지 원칙의 적용에 대해 설명해 보시오.
솔직히 이 질문을 받았을때, 지금까지 너무 실전에 대해 집중하여 강의를 들었다는 점을 자각했다. 앞으로는 개념적인 부분도 바르게 짚고 넘어가자.
5가지 원칙에는
SRP : 단일 책임 원칙
OCP : 개방-패쇄 원칙
LSP : 리스코프 치환 원칙
ISP : 인터페이스 분리 원칙'
DIP : 의존 관계 역전 원칙
이 있다.
SRP(Single responsibility principle) 은 한 클래스는 하나의 책임만 가져야 한다는 것으로, 하나의 책임이라는 것은 문맥과 상황에 따라 달라지나, 변경이 있을 때 파급 효과가 적으면, 단일 책임 원칙을 잘 따른 것이라 판단할 수 있다.
예시로, 객체의 생성과 사용을 분리시킨 부분이 있다.
OCP(Open/Closed Principle) 은 김영한 강의에서 MemberService 클라이언트가 구현 클래스를 직접 선택해야 하는 문제점이 있을 때, 구현 객체를 변경하기 위해 클라이언트 코드를 변경해야하는 부분에서 적용된다. 다형성을 활용했는데, ocp 원칙을 지킬 수 없는 상황일때, 객체를 생성하고 연관 관계를 맺어주는 별도의 조립을 위한 설정자가 필요하다. 이를 spring container가 해결해준다. 그럼으로써 OCP가 지켜진다.
LSP(Liskov substitution principle) 은 상위 타입 객체를 하위 타입 객체로 대체하여도 정상적으로 작동해야 되는 원칙이다.
ISP(Interface segregation principle) 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 한 개보다 낫다는 것이다. 예시로, 자동차라는 범용 인터페이스 보다는 운전, 정비, 타이어의 세부적인 인터페이스로 나누는 것이 낫다.
DIP (Dependency Inversion principle) 은 추상화에 의존해야지 구체화에 의존하면 안된다는 것으로 의존성 주입 을 적용한 configuration 파일을 설정하여 구상할 수 있다.
참고>
2. ioc 제어의 역전, 의존관계 주입에 대해 설명하시오.
이건 spring의 핵심인데, 좀 더 매끄럽게 말을 했어야 할 것 같다.
ioc란 메인 프로그램에서 컨테이너나 프레임워크로 객체와 객체의 의존성에 대한 제어를 넘기는 것을 말한다. 프레임워크 없이 개발할 때는 각 객체에 대한 라이프사이클(생성, 설정, 초기화, 호출 등)을 개발자가 직접 관리한다. 하지만 프레임워크를 사용하면 객체의 생명주기를 프레임워크에 위임하여 프레임워크가 개발자의 코드를 호출하고 흐름을 제어할 수 있다.
의존성 주입은 프로그램 디자인이 결합도를 느슨하게 되도록 하고 의존관계 역전원칙과 단일 책임 원칙을 따르도록 클라이언트의 생성에 대한 의존성을 클라이언트 행위로부터 분리하는 것이다.
3. 스프링 컨테이너에서 싱글톤으로 불러와지는 원리를 설명하시오.
요건 내가 김영한 강의를 들으면서 신기했던 부분이다.
스프링 컨테이너가 bean으로 등록된 객체에 대해서 싱글톤을 보장할 수 있는 이유는 @Configuration을 이용한 CGLIB 바이트코드 조작 라이브러리를 사용하기 때문이다.
스프링은 CGLIB 라는 바이트코드 조작 라이브러리를 사용하여 AppConfig 클래스를 상속하는 임의의 클래스를 생성한다. 이렇게 새롭게 생성된 인스턴스가 싱글톤을 보장한다.
이 클래스의 예상코드는 아래와 같다.
@Bean
public MemberRepository memberRepository() {
if (memoryMemberRepository가 이미 스프링 컨테이너에 등록되어 있으면?) {
return 스프링 컨테이너에서 찾아서 반환;
} else { //스프링 컨테이너에 없으면 기존 로직을 호출해서 MemoryMemberRepository를 생성하고 스프링 컨테이너에 등록
return 반환
}
}
참고>
09과제 이번주까지하고, MVC 1/2 강의 들어야 한다..
그래도 하루빨리 내가 배포까지 하는 결과물을 만들고 싶어서 강의를 듣는데에 힘이 난다.
이론을 배우면 배울 수록 단순 스프링 기능 구현을 넘어서 알멩이가 채워지는 느낌이 좋은 것 같다.
'구름톤 딥다이브 풀스택 11회차' 카테고리의 다른 글
[JAVA/09과제] hashCode() vs equals() (1) | 2024.09.19 |
---|---|
[spring/오류해결] 스프링부트 jsp 404 파일 못찾음 이슈 (0) | 2024.09.15 |
[구름톤 딥다이브 1차 스터디 -1회] 알고리즘 풀이 + 자바 기본 cs 워밍업 면접 (0) | 2024.09.06 |