Clean Code - 1장 깨끗한코드 훑기
나쁜 코드가 개발에 미치는 영향과 깨끗한 코드의 중요성에 대해 다루는 Clean Code 1장 요약
Java 태그가 포함된 포스트들입니다.
나쁜 코드가 개발에 미치는 영향과 깨끗한 코드의 중요성에 대해 다루는 Clean Code 1장 요약
자바 클래스 로딩 과정에 대해 알아보자.
JDBC, DBCP, DataSource에 대해 알아보자.
HashMap, TreeMap, LinkedHashMap에 대해 알아보자
Set에 대해 알아보자
`JDBC`, `DBCP` 모두 `Java` 진영에서 `DB Connection`을 위해 사용하는 방법
이번 학습을 통해 몇 가지 의미있는 것들을 배웠다.
해쉬테이블은 일반적으로 배열이다. h(key)의 결과를 index로 갖는다.
13장 **서브클래싱과 서브타이핑** 은 부록 **계약에 의한 설계** 와 함께 요약한다.
챕터 12 `다형성`의 내용은 `객체지향 설계`에 대한 내용이라기 보다는 `상속이 다형성을 구현하는 메커니즘`에 대한 내용이다.
`Stream`을 사용하면 데이터를 `선언형`으로 처리할 수 있다. 여기서 `선언형`이란 의미가 와닿지 않는다면 **데이터를 'How(어떻게)' 처리하는지를 기술하는게 아니라 `What(무엇)`을 하는지를 기술하는 것이라고 이해하면 쉽다.**
`코드 재사용`과 관련하여 `상속`은 간편한 방법이지만 부모 클래스와 자식 클래스의 `결합` 때문에 변경에 불안정하고 유연하지 못하다.
앞선 8장, 9장을 통해서 우리는 `재사용 가능한 설계`, `유연한 설계`를 위한 `의존성 관리 기법`들에 대해 학습하였다.
8장에서 우리는 올바른 객체지향 설계란 `의존성 관리`임을 학습했다.
6장까지 이르며 `자율적인 객체`, `캡슐화`, `응집도`, `결합도`에 대한 개념과 `책임 주도 설계` 에 따른 `책임 할당 방법`을 학습했다.
이전 장 까지 우리는 객체지향 설계에서 가장 중요한 것들을 살펴보았다.
이전 4장에서는 `캡슐화`, `응집도`, `결합도`를 설계 품질의 기준으로 삼고 `데이터 중심 설계`가 어떻게 `캡슐화`를 위반하면서 변경하기 어려운 설계가 되는지에 대해 살펴보았다.
앞선 챕터를 통해서 우리는 객체지향 설계에 있어 `협력`, `책임`, `역할`을 가장 먼저 고려해야 하고, 그 중 `책임`이 가장 중요하다는 것을 알았다.
앞선 챕터에서는 간단한 `영화 예매` 코드를 통해서 `구현 관점`의 객체지향 설계에 대해서 배웠다. `캡슐화`, `상속`, `합성`, `다형성`, `추상화`, `메시지와 메서드`의 개념을 확인하고 `컴파일 타임 의존성`과 `런타임 의존성`을 다르게 함으로써 보다 ...
`객체지향 프로그래밍`에서 사용되는 전반적인 주제들을 `영화 표 예매(할인 조건, 할인 정책)` 코드와 함께 대략적으로 설명한다.
`오브젝트`의 첫 챕터로써 간단한 `극장 표 판매` 코드를 프로세스와 데이터가 격리된 `절차 지향적 코드`에서 데이터와 프로세스가 통합된 `객체 지향적 코드`로 적절하게 리팩토링 하는 과정을 보여주며 객체 지향적인 설계란 무엇인가에 대해 보여준다.
디자인 패턴과 프레임워크 애플리케이션을 설계하다 보면 어떤 요구사항을 해결하기 위해 과거에 경험했던 유사한 해결 방법을 다시 사용하는 경우가 있다.
앞서 11장에서 구현한 `핸드폰 과금 시스템`의 요금 정책을 수정해야 한다고 가정하자. 지금까지 `기본 정책`에는 `일반 요금제`와 `심야 할인 요금제`의 두 가지 종류가 있었다. 이번 장에서는 `기본 정책`을 아래 표와 같이 4가지 방식으로 확장할 것이다. `부...
객체지향을 처음 접한 입문자들이 흔히 오해하는 부분이 을 동일한 것으로 간주하는 것이다.
`객체지향 프로그래밍에서의 타입`에 대해서 이해를 하기 위해서는 먼저 `프로그래밍 언어 관점에서의 타입`과 `개념 관점에서의 타입`을 함께 살펴볼 필요가 있다.
`인터페이스` 만으로는 객체의 행동에 관한 다양한 관점을 전달하기 어렵다. 우리에게 필요한 것은 `명령의 부수효과를 쉽고 명확하게 표현할 수 있는 커뮤니케이션 수단`이다. 이 시점이 되면 **_계약에 의한 설계(Design By Contract, DBC)_** 가...
`다형성(Polymorphism)`이라는 단어는 컴퓨터 과학에서 **_하나의 추상 인터페이스에 대해 코드를 작성하고 이 추상 인터페이스에 대해 서로 다른 구현을 연결할 수 있는 능력_** 으로 정의한다. 간단히 말해서 다형성은 여러 타입을 대상으로 동작할 수 있는...
**_ - 개방-폐쇄 원칙을 받쳐주는 다형성에 관한 원칙을 제공한다._**
`상속`과 `합성`은 객체지향 프로그래밍에서 가장 널리 사용되는 `코드 재사용` 기법이다. 상속이 부모 클래스와 자식 클래스를 연결해서 부모 클래스의 코드를 재사용하는데 비해 **_합성은 전체를 표현하는 객체가 부분을 표현하는 객체를 포함해서 부분 객체의 코드를 ...
몇몇 자료에서는 **_엄밀히 따지면 톰캣은 WAS가 아니다_** 라고 말한다.
객체지향 프로그래밍의 장점 중 하나는 `코드 재사용`이 용이하다는 것이다. 전통적인 패러다임에서 코드를 재사용하는 방법은 코드를 복사한 후 수정하는 것이다. 객체지향은 조금 다른 방법을 취한다. **_객체지향에서는 코드를 재사용하기 위해 새로운 코드를 추가한다._...
확장 가능하고 변화에 유연하게 대응할 수 있는 설계를 만들 수 있는 원칙 중 하나는 `개방-폐쇄 원칙(OCP)`이다. 개방-폐쇄 원칙은 다음과 같은 문장으로 요약할 수 있다.
`의존성`은 `변경`과 관련이 깊다. 의존하는 대상(**_의존 객체_**)이 변경 될 경우 함께 변경 될 가능성이 바로 `의존성`이다.
잘 설계된 객체지향 애플리케이션은 작고 응집도 높은 객체들로 구성된다. **_작고 응집도 높은 객체란 책임의 초점이 명확하고 한 가지 일만 잘 하는 객체를 의미한다._** 이런 작은 객체들이 단독으로 수행할 수 있는 작업은 거의 없기 때문에 일반적인 애플리케이션의...
`추상화`의 목적은 복잡하게 얽히고 섥힌 문제에서 `공통점을 취하고 세부적인 사항은 생략`함으로써 인지과부화를 최소화하고 `문제 해결에 필요한 핵심`에 집중하는 것이다. 다시말해 한 번에 다뤄야 하는 정보의 수를 줄이기 위해 `본질적인 정보만 남기고 불필요한 세부...
협력은 어떤 객체가 다른 객체에게 무언가를 __요청__ 할 때 시작된다. **_메시지는 객체 사이의 협력을 가능하게 하는 유일한 매개체이다._** 즉, 어떤 객체가 다른 객체에게 접근할 수 있는 유일한 방법은 바로 메시지를 전송하는 것 뿐이다.
앞 절에서는 __데이터 중심의 접근법__ 을 취할 경우 직면하게 되는 다양한 문제에 대해서 살펴보았다. 데이터 중심의 설계는 __행동보다 데이터를 먼저 결정__ 하게 되고 협력이라는 문맥을 벗어나 __고립된 객체의 상태에 초점__ 을 맞추기 때문에 캡슐화를 위반하...
앞선 챕터에서 __역할, 책임, 협력__ 의 관점에서 객체지향 설계를 하는것의 중요성을 살펴보았다.
앞선 챕터에서 객체지향 프로그래밍을 구성하는 다양한 요소와 구현 기법을 살펴보았다. __클래스__ / __추상 클래스__ / __인터페이스__ 를 조합하여 객체지향 프로그램을 __구조화__ 하는 기본적인 방법과 상속을 이용해 __다형성__ 을 구현하는 기법을 소개...
오랜만에 돌아온 WEB/Servlet 포스팅이다.
앞선 챕터에서 살펴본 내용의 주된 키워드를 살펴보면 다음과 같다.
__객체지향의 사실과 오해__ 도서 1독 이후 개념적으로나마 객체지향 설계에 대한 맥락을 짚어보았다.
지난 포스팅에서 __리플렉션__ 에 대한 기본적인 개념을 다루었다.
최근 자바 웹 프로그래밍 기초를 학습하면서 Servlet, JSP를 지나 기본적인 Spring MVC 모델을 따르는 __미니 MVC 프레임워크__ 를 만드는 실습중이다.
가끔씩 읽으면서 상기하자.
면접에서도 단골질문이기도하고 피상적으로만 이해하고 있던 라이브러리와 프레임워크에 대해 이해하는 기회를 갖는다.
기존 스프링 프레임워크를 사용하면서 빌드 도구로써 메이븐을 사용했었다. 단순히 디펜던시 라이브러리를 자동으로 다운로드 해주는 기능으로만 사용했던 빌드도구(그레이들)에 대해 학습해 본다.
이전에 서블릿 클래스는 서블릿 인터페이스를 구현하고 서블릿 컨테이너에 의해 init(), service(), destory() 등의 메소드를 호출함으로써 메모리 로딩, 서비스 수행, 메모리 해제 등의 과정을 거치는 것을 알았다.
웹 개발을 함에 있어 Http Servlet에 대한, 더 원론적으로 Servlet에 대한 이해가 많이 부족함을 느낀다.
그동안 IDE에서만 웹 컨테이너(톰캣)을 구동함으로써 웹 어플리케이션을 실행하고 테스트하느라 실제 운영시 배포 방법에 대해서는 고민해 본적이 없다.
웹 개발을 함에 있어 Http Servlet, Http Protocol 등 보다 원론적인 개념에 대해 많이 부족함을 느껴 다시 한번 정리하는 기회를 갖겠다.
컬렉션 프레임워크(List, Set)와 Map을 사용하면서 별 다른 생각 없이 많이 사용은 해왔지만 오픈소스나 다른 소스코드에서 표현되는 <T extneds Blah> 등의 확장, 제한된 제네릭스를 보면 지레 겁부터 먹거나 다른 소스코드를 찾아보기가 일쑤였다.
`JVM`은 Java 책을 폈을 때 머릿말 혹은 가장 첫 단원에서 소개되지만 당장 프로그래밍 언어를 어떻게 사용할 것인지에 대해서만 관심이 있는 입문자들은 주의깊게 살펴보지 않는다.
Compile & Build 컴파일 및 빌드 팀의 업무 프로세스를 최대한 빠르게 학습하기 위해서 우선적으로 솔루션 개발의 전반적인 툴(Git, Framework, Jenkins 등)을 먼저 공부해야할 필요성을 느꼈다.
폰 노이만 아키텍처 4개의 기본 하드웨어 구성요소 입력장치 출력장치 주기억장치(Main Memory) : 프로그램과 데이터를 모두 저장 중앙 처리 장치(CPU) : Control Unit + ALU 머신코드(Machine Code) 컴퓨터가 실제로 읽고, 해석하고, 실행하는 프로그램 C
Shared Library(DDL) 공유 라이브러리(shared library) 그 동안 IDE가 자동으로 해결해주었던 컴파일 및 빌드 등에 대해서 간단하게나마 개념을 학습하고 있는 중이다.
추상화 OOP 기본 '추상화' Java 코드를 숱하게 접하면서 가장 기본적인 개념이 부족함을 많이 느낀다. 보다 세련된 코드를 작성하거나 세련된 코드를 독해하기 위해서는 객체지향에 녹아있는 철학과 소스코드에 점철된 여러 디자인 요법들에 대해 알아두면 도움이 된다.