프로그래밍-학습기록 95

DI(Dependency Injection)와 서비스 로케이터

DI(Dependency Injection)와 서비스 로케이터 애플리케이션 영역과 메인 영역 (본 책에서는 예제를 통해 애플리케이션과 메인 영역을 설명한다. 예제가 구체적이고 설명도 자세해서 책을 찬찬히 읽으면 이해가 잘 된다.) 메인 영역은 다음 작업을 수행한다. 어플리케이션 영역에서 사용될 객체를 생성한다. 각 객체 간의 의존 관계를 설정한다. 어플리케이션을 실행한다. 메인 영역은 어플리케이션영역의 객체를 생성하고, 설정하고, 실행하는 책임을 갖기 때문에, 어플리케이션 영역에서 사용할 하위 수준의 모듈을 변경하고 싶다면 메인 영역을 수정하게 된다. 모든 의존은 메인 영역에서 어플리케이션 영역으로 향한다. 반대의 경우인 어플리케이션 영역에서 메인 영역으로의 의존은 존재하지 않도록 한다. 이는 메인 영역..

SOLID 설계 원칙

설계 원칙: SOLID SOLID 설계 원칙은 다섯 가지 원칙으로 구성된다. 객체 지향 설계 관련 내용들을 체계적으로 정리한 것으로서 이 원칙만으로도 좋은 설계를 하는데 큰 도움이 될 것이다. SRP, Single responsibility principle 단일 책임 원칙 OCP, Open-closed principle 개방-폐쇄 원칙 LSP, Liskov substitution principle 리스코프 치환 원칙 ISP, Interface segregation principle 인터페이스 분리 원칙 DIP, Dependency inversion principle 의존 역전 원칙 SRP, Single responsibility principle 단일 책임 원칙 클래스는 단 한 개의 책임을 가져야 한다..

재사용, 상속보다는 조립으로

재사용: 상속보단 조립 상속을 사용하면 재사용을 쉽게 할 수 있는 것은 분명하다. 하지만 상속을 사용할 경우 몇 가지 문제점이 있다. 이 글에서는 상속을 통한 재사용 과정에서 발생할 수 있는 문제점을 살펴보고, 또 다른 재사용 방법인 객체 조립을 통해 상속을 통한 재사용의 단점을 해소하는 방법을 알아본다. 상속을 통한 재사용의 단점 상위 클래스 변경의 어려움 어떤 클래스를 상속받는다는 것은 그 클래스에 의존한다는 뜻이다. 따라서 의존하는 클래스의 코드가 변경되면 영향을 받을 수 있다. 즉, 상위 클래스에서 변경의 여파가 하위 클래스로 전파된다. 최악의 경우 상위 클래스의 변화가 모든 하위 클래스에 영향을 줄 수 있다. 이는 클래스 계층도에 있는 클래스들을 한 개의 거대한 단일 구조처럼 만들어 주는 결과를..

CSS Position 속성 (static, relative, absolute, fixed)

Position 속성 position 속성은 요소의 위치를 정의한다. top, bottom, left, right 속성과 함께 사용하여 위치를 지정한다. position 속성의 값으로 static(기본 값), relative(상대 위치), absolute(절대 위치), fixed(고정 위치) static (기본 위치) static은 position 속성의 기본 값으로 position 속성을 지정하지 않았을 때와 같다. 기본적인 요소의 배치 순서에 따라 위에서 아래로, 왼쪽에서 오른쪽으로 순서에 따라 배치되며 부모 요소 내에 자식 요소로서 존재할 때는 부모 요소의 위치를 기준으로 배치된다. 기본적으로 이 값을 지정할 일은 없지만 이미 설정된 position을 무력화하기 위해 사용될 수 있다. 좌표 속성(t..

CSS display 속성과 block, inline, inline-block, none

display 속성 display 속성은 레이아웃 정의에 자주 사용되는 중요한 속성이다. 속성의 값으로 다음과 같은 키워드가 있다. block → block 특성을 가지고 요소(block 레벨 요소)로 지정한다. inline → inline 특성을 가지는 요소(inline 레벨 요소)로 지정한다. inline-block → inline-block 특성을 가지는 요소(inline-block 레벨 요소)로 지정한다. none → 해당 요소를 화면에 표시하지 않는다. 차지하는 공간도 사라진다. block 레벨 요소 block 특성을 가지는 요소는 아래와 같은 특징을 지닌다. 항상 새로운 라인에서 시작한다. 화면 크기 전체의 가로폭을 차지한다. (width: 100%) width, height, margin, ..

CSS (개요, 선택자, 속성, 값)

CSS, Cascading Style Sheets Cascading Style Sheets(CSS)는 HTML이나 XML(SVG, XHTML 같은 XML 방언(dialect) 포함)로 작성된 문서의 표현을 기술하기 위해 쓰이는 스타일시트 언어입니다. CSS는 요소가 화면, 종이, 음성이나 다른 매체 상에 어떻게 렌더링되어야 하는지 기술합니다. - MDN HTML5 이전 버전의 HTML에는 style을 컨트롤할 수 있는 태그(font, center)가 존재하여 CSS 없이도 어느 정도 스타일 표현이 가능했으나 정보와 구조를 담당하는 HTML 본연의 역할과 동떨어진 기능까지 추가됨으로써 복잡하고 혼란스러운 언어였다. HTML5에서는 HTML는 정보와 구조, CSS는 style의 정의라는 본연의 임무에 충실한..

다형성과 추상 타입

다형성과 추상 타입 객체 지향에서 유연하게 구현을 변경할 수 있도록 하는 방법으로 추상화가 있다. 추상화는 다형성으로 가능해진다. 다형성을 알기 위해서는 상속을 알아야 한다. 상속 개요 상속(Inheritance)은 한 타입을 그대로 사용하면서 구현을 추가할 수 있도록 해주는 방법을 제공한다. 어떤 객체가 갖고 있는 기능을 확장해 새로운 기능을 구현하고 싶을 때 상속을 사용한다. 상속 대상이 되는 클래스를 상위(super) 클래스 또는 부모 클래스라고 부른다. 상속을 받는 클래스를 하위(sub) 클래스 또는 자식 클래스라고 부른다. 자식 클래스는 부모 클래스에 정의된 구현을 물려받는다. 프로그래밍 언어마다 하위 타입에서 물려받을 수 있을 것이 다를 수 있다. 다수의 언어에서 private 범위를 갖는 메..

List 자료구조 선택하기 (LinkedList, ArrayList)

List 자료 구조 선택하기 (Java) ArrayList와 LinkedList 중 어떤 자료구조를 선택하면 좋을까? 이중 연결 리스트 구현은 ArrayList 클래스보다 시작에 요소를 추가하고 삭제하는 연산이 좋다. 끝에 요소를 추가하고 제거하는 연산은 ArrayList와 동일하다. 따라서 ArrayList 클래스의 유일한 이점은 get과 set 메서드이다. 연결 리스트는 심지어 이중 연결 리스트일 때도 선형 시간이 필요하다. 응용 프로그램의 실행 시간이 get과 set 메서드에 의존한다면 ArrayList 클래스가 좋은 선택이다. 실행 시간이 시작이나 끝 근처에 요소를 추가하거나 제거하는 연산에 의존한다면 LinkedList 클래스가 좋다. 하지만 이러한 추천은 큰 문제의 증가 차수에 기반을 두고 있..

객체 지향

객체 지향 절차 지향과 객체 지향 절차(프로시저) 지향 프로그램은 데이터를 중심으로 한 프로시저로 구성된다. 프로그램 규모가 커져서 데이터 종류가 증가하고 이를 사용하는 프로시저가 증가하게 되면, 다음과 같은 문제들이 발생하게 된다. 데이터 타입이나 의미를 변경해야 할 때, 함께 수정해야 하는 프로시저가 증가한다. 같은 데이터를 프로시저들이 서로 다른 의미로 사용하는 경우가 발생한다. 이는 결국 코드의 수정을 어렵게 만들며, 새로운 기능을 추가하는데 많은 구현 시간(즉, 개발 비용)을 투입하게 만든다. 이런 절차 지향과 달리 객체 지향 프로그램은 데이터 및 데이터와 관련된 프로시저를 객체(object)라고 불리는 단위로 묶는다. 객체는 프로시저를 실행하는데 필요한 만큼의 데이터를 가지며, 객체들이 모여 ..

해시 테이블

사전(Dictionary)의 구현: 해시 테이블(Hash Table) 해시 테이블(Hash Table)은 문자열을 인수로 받아서 정수를 반환하는 '해시 함수'를 사용해서 문자열과 값의 대응 관계를 표현하는 방법이다. 값을 넣기 위해서 우선 큰 배열을 준비한다. 그리고 해쉬 함수를 사용해서 문자열을 '적당한 정수'로 변환한 후 해당 배열 어디에 넣을지를 결정한다. → 실제로 해쉬 테이블을 구현할 때 몇 가지 문제가 있다. 다른 키를 해쉬 함수에 넣었는데 가끔 같은 번지의 값을 참조하는 경우, 이를 해시 충돌(Hash Collision)이라 하며, 해결 방법으로 Chaining, Open Addressing이 있다. 공간 효율성이 떨어진다. 데이터가 저장되기 전에 미리 저장 공간..