일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- cs231n
- 3745
- GPT
- 백준 1916 자바
- 백준 1339
- 논문구현
- MachineLearning
- 자바
- 딥러닝
- 짝지어제거하기
- 1261
- 알렉스넷
- 클린코드
- 관심사분리
- Java
- dijkstra
- 논문
- deeplearning
- 백준9095
- 백준
- Alexnet
- 알고리즘
- 1107번
- 머신러닝
- 1916
- 논문리뷰
- 다익스트라
- NLP
- 디미터법칙
- 백준 1339 자바
- Today
- Total
목록Study/용어 (5)
산 넘어 산 개발일지
"클래스나 모듈은 확장에는 열려 있어야 하고 수정에는 닫혀있어야 한다." 처음에는 이 문장이 이해가 가지 않았다. 확장은 정확히 무엇을 뜻하는 것이고, 수정은 어느 부분을 수정한다는 것인지 모호했다. 가장 간단히 확장과 수정을 구분해보자면, 확장은 클래스나 모듈 외부에서 클래스에 변화를 주는 것이고, 수정은 클래스나 모듈 자체의 코드를 수정함으로써 변화를 주는 것이다. 클래스나 모듈 외부에서 변화를 준다는 말은, 클래스의 내용 자체는 수정하지 않지만 외부에서 입맛에 따라 변화를 준다는 뜻이다. 이를 가능하게 하기 위해선 클래스에서 외부에서 주는 변화요청을 받을 준비가 되어 있어야 한다. 다시말해, 클래스에 대한 수정을 지원할 멤버함수, 멤버변수가 있어야 한다는 것이다. 컴퓨터와 프린터를 통해 예시를 들어..
서비스(외부객체)를 선언하고 이에 대한 실제 정의는 외부에서 주입하는 것을 의존성 주입이라 한다. 즉 외부 객체를 사용함으로써 의존성이 생기고 이에 대한 정의나 생성은 외부에 위임하는 것이다. (제어 역전) 이를 통해 클라이언트 코드는 객체에 대한 정의나 생성에 관하여 일절 관여할 필요가 없어진다. 서비스가 인터페이스를 구현한 객체라면 더 좋다. 추상화가 갖추어지고 클라이언트는 서비스의 인터페이스를 통해 어떤 기능이 있는지만 파악할 수 있기 때문이다. 또한 클라이언트는 서비스의 실제 객체에 대한 구체적인 내용은 모르게 된다.
우리는 평소 코딩을 할 때 라이브러리에서 가져온 코드를 가져와서 사용한다. 이처럼 라이브러리는 우리가 제어권을 가지고 호출해서 사용하는 대상이다. 제어역전은 우리의 제어권을 외부에 넘겨주고 외부에서 우리 코드르 호출하게 하는 방식이다. 대표적인 예가 바로 프레임워크다. 프레임워크는 이미 다른 개발자들에 의해 수많은 코드, 특히 추상 클래스와 인터페이스들로 구현되어 있고 이를 사용하는 방법도 정해져 있다. 이를 사용하는 개발자들은 그저 이 방법을 익히고 프레임워크에서 만들어져 있는 클래스를 상속하거나 인터페이스를 구현함으로써 프레임워크의 틀에 맞게 작동시킨다. 여기서 중요한 점은 우리가 프레임워크의 코드를 호출하는 것이 아니라 프레임워크가 우리의 코드를 호출해서 사용한다는 것이다. 즉 제어권이 우리가 아닌..
문제점 모든 코드에서 원하는 클래스에 대한 객체를 만들 수 있겠지만 이 경우 원하는 클래스가 어떻게 동작하는지, 생성하기 위해 무엇이 필요한지를 클라이언트 코드가 일일이 파악해야 한다. 이 경우 다른 클래스에 대한 정보를 구체적으로 알게 된다는 점에서 캡슐화 원칙이 지켜지지 않는다. 또한 클라이언트 코드가 클래스에 대한 정보를 가지고 있어야 한다는 부담도 생긴다. 팩토리 메서드 패턴(Factory Method Pattern) 클래스의 객체를 만드는 일 자체를 Factory에 위임한다. 이 때 클라이언트 코드에서 넘겨주는 조건에 따라 원하는 객체를 반환하는 것이다. 팩토리 메서드 패턴에서 조건으로 인한 분기점은 마지막 가장 작은 단위의 클래스를 만드는 시점이 된다. ex) 라면공장 고객(Client)이 라..