https://velog.io/@d-h-k/leetcodesort-array-by-parity-ii-Java풀이
https://velog.io/@d-h-k/leetcodedi-string-match-Java풀이
https://velog.io/@d-h-k/leetcode-flipping-an-image-Java풀이
https://velog.io/@d-h-k/leetcode-richest-customer-wealth-Java풀이
https://velog.io/@d-h-k/Java풀이-leetcode-kids-with-the-greatest-number-of-candies
https://velog.io/@d-h-k/Java-풀이-defanging-an-ip-address
코드 = 핵심 관심사 + 횡단 관심사
자동차의 예시
- 자동차 샤시 / 휠 / 타이어가 있는데
- 의존성 내포(코드상에서 new 키워드를 통해 실체화시키면) 코드의 경우 샤시는, 휠의 정보를 알아야하고, 휠은 또다시, 타이어에 대한 구체적인 정보를 알아야 한다
- 위 상황을 다시 말하면 타이어를 바꾸기 위해서는 휠을 바꾸고(어..? 타이어뱅크인가?)
- 휠을 바꾸기 위해서는 자동차(샤시)를 바뀌야 하는 상황이다
- 위와같은 문제를 해결하고자, 설정파일(XML), 혹은 @(어노테이션) 을 사용해 런타임에 객체를 동적으로 할당해주는게 바로DI
- DI 인 이유는 샤시에서의 휠의 의존성이 샤시 내부가 아니라 외부(설정파일/어노테이션)으로 넘어갔기 때문에
좀더 개발자스럽게 설명하면
- 의존성 주입이란 외부에서 생성 된 객체를 사용하는(혹은 객체 의존성을 외부에서 전달받는) 방법이다.
- 스프링에서는 객체를 Bean이라고 부르며, 프로젝트가 실행될때 사용자가 Bean으로 관리하는 객체들의 생성과 소멸에 관련된 작업을 자동적으로 수행해주는데 객체가 생성되는 곳을 스프링에서는 Bean 컨테이너라고 부른다.
기존 제어순서
- new객체 생성 : 의존성 있는 객체가 클래스 내부에서 객체를 생성
- 샤시 클래스 내부에 > new Wheel wheel;
- 의존성 객체의 메소드 호출
- wheel.steerLeft / wheel.tractionControl
IOC가 적용된 스프링에서는
- 객체(Bean) 생성
- 의존성 객체 주입받는데(DI!)
- 스스로가 만드는것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입한다.
- 의존성 객체 메소드 호출
- 스프링이 모든 의존성 객체를 스프링이 실행될때 다 만들어주고 필요한곳에 주입(Bean들은 싱글턴 패턴)
- 제어의 흐름이 결국
- 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다
- 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성
- 유지 보수가 편해진다 : 무지성으로 그냥 시키는데로 정해진 규칙만 따라서 코드를 넣으면 되니까!
참고 : 프레임워크 vs 라이브러리
- 프레임워크 :
- 내 코드가 (남이 만들어놓은)프레임워크 속으로 들어가서 프레임워크가 정해주는 규칙을 따라 코딩하는것
- 예) 스프링, 자마린, 리눅스 디바이스 드라이버&&커널
- 라이브러리 : 남이 만들어놓은 코드를 끌어다가 내 코드속에 집어넣고 돌리는거
- 예) 파이썬에서의 opencv, 케라스, pandas, numpy 등등..