목록책 내용 요약 (13)
윤개발
깨진 창문을 내버려 두지 말라. 엔트로피는 시스템 내의 무질서한 정도를 나타내는 물리학 용어이다. 소프트웨어의 무질서도가 증가할 때 이를 소프트웨어의 부패라고 부른다. 소프트웨어의 부패가 발생하는데에는 심리적이거나 문화적인 요소가 있다. 깨진 창문이론 오랜 기간 수리하지 않고 방치된 창문 하나가 거주자들에게 버려진 느낌을 스며들게 한다. 강국자들이 그 건물에 별 관심이 없다는 느낌이다. 그래서 다른 창문이 하나 더 꺠진다. 사람들은 이제 어지르기 시작한다. 심각한 구조적 손상이 시작되고 느낌은 현실이 되어버린다. 깨진창문을 내버려 두지 마라. 나쁜 설계, 잘못된 결정, 혹은 형편없는 코드를 고치지 않은채로 내버려 두지 마라. 발견하자마자 고쳐라. 고칠 시간이 벗다면 주석으로 처리하거나 '구현되지 않았음'..
가장 큰 약점은 약점을 보일 것에 대한 두려움이다. - 보쉬에 실용주의 철학의 초석 중 하나는 자신과 자신의 행동에 대해 책임을 지는 것이다. 무지나 실수를 인정하는 일은 가장 즐거운 부분은 아니지만 분명 일어나는 일이다. 우리는 자신의 능력에 대해 자부심을 가질 수 있지만 실수나 무지 같은 단점에 대해서도 정직해져야 한다. 1. 책임지기 실수를 저지르거나 잘못된 판단을 했다면 정직하게 인정하고 다른 방안을 제안하도록 노력하라. 다른 무언가를 비난하거나 변명을 만들어 내지말고 해결안을 제공하는 것은 여러분에게 달려있다. "고양이가 내 소스코드를 삼켰어요" 라고 말하는 것은 별 도움이 안될 것이다. 어설픈 변명을 만들지 말고 대안을 제시하라. 안된다고 하지 말고 상황을 개선하기 위해 무엇을 할 수 있는지 ..
당신이 가진 생각이 하나밖에 없다면, 그것만큼 위험한 것은 없다. - 에밀 사르티에 만약 어떤 사실을 굳게 믿고 그 사실에 전적으로 의존하고 있다면, 거의 100% 그것이 변하게 될 것이다. "이 것은 이 방법으로만 해결 할 수 있어"와 같은 근시안 적인 생각을 갖고 프로젝트에 참여한다면 아마도 예상치 못했던 경우에 의해 한숨지을 일이 많을 것이다. 1. 가역성 우리가 프로젝트 초기에 항상 최선의 결정을 내리는 것은 아니라는 점에서 유연한 프로젝트를 만들어야 한다. 프로젝트의 초기에 특정 관계형 데이터베이스를 사용하기로 결정했다고 치자. 한참 후 성능 테스트를 하면서 너무 느리다는 사실을 발견 했고 다른 데이터베이스가 더 빠르다는 것을 알게 되었다. 특정 데이터베이스를 사용하는 코드들이 전반에 퍼져 있을..
설계, 빌드, 테스트 그리고 확장하기에 쉬운 시스템을 만드는데에 있어 직교성은 매우 중요한 개념이다. 1. 직교성이란? 직교성은 기하학에서 빌려온 용어다. 그래프의 축과 같이 두 직선이 직각으로 만나는 경우 직교한다고 말한다. 벡터의 입장에서 보면, 두 개의 선은 독립적이다. 컴퓨팅에서 이 용어는 결합도 줄이기를 의미한다. 하나가 바뀌어도 나머지에 어떤 영향도 주지 않는다면 직교한다고 할 수 있다. 2. 직교성의 장점 비직교적인 시스템은 본질적으로 변화와 조정을 하기가 복잡하다. 시스템의 컴포넌트들이 고도로 상호의존적인 경우, 특정 부분만 수정하는 방법이란 없다. 관련 없는 것들 간에 서로 영향이 없도록 하라. 컴포넌트들이 각기 격리되어 있으면 어느 하나를 바꿀 때 나머지 것들을 걱정하지 않아도 된다. ..
중첩 클래스 중첩 클래스란 다른 클래스 안에 정의된 클래스를 말한다. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그외의 쓰임새가 있다면 톱레벨 클래스로 만들어야 한다. 아래 4가지 클래스는 중첩클래스의 종류들 이다. class A { int a = 10; public void run() { System.out.println("Run A"); B.run(); C c = new C(); c.run(); } // 정적 멤버 클래스 public static class B { public static void run() { System.out.println("Run B"); } } // 비정적 멤버 클래스 public class C { public void run() { // 정규화된 this를 ..
아래 코드는 두 가지 이상의 의미를 표현할 수 있으며 현재 표현하려는 의미를 태그값으로 알려주는 클래스이다. class Figure { enum Shape { RECTANGLE, CIRCLE }; final Shape shape; // 태그 필드 - 현재 모양을 나타낸다. // 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 쓰인다. double length; double width; // 다음 필드느 모양이 원(CIRCLE)일 때만 쓰인다. double radius; // 원용 생성자 Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } // 사각형용 생성자 Figure(double length, double width) {..
class Point{ public double x; public double y; } 이처럼 인스턴스 필드들을 모아둔 목적없는 퇴보한 클래스를 작성하려 할 때가 있다. 이러한 클래스는 직접 접근이 가능하여 캡슐화의 이점을 제공하지 못하고, 불변을 보장할 수 없다. 객체지향에서는 이런 클래스를 상당히 싫어해서 필드를 모두 private로 바꾸고 public 접근자 getter를 추가한다. 하지만 package-private(패키지에서만 접근할 수 있도록) 클래스 혹은 private 중첩 클래스(클래스 안에 클래스)라면 데이터 필드를 노출한다 해도 하등의 문제가 없다. 정리 public 클래스는 절대 가변 필드를 직접 노출해서는 안된다. 하지만 pacakge-private 클래스나 private 중첩 클래..
재정의를 하지 않는다. equals 메서드는 재정의하기 쉬워보이지만 곳곳에 함정이 있어 큰 문제가 될 수 있다. 가장 쉬운 길은 아예 재정의를 하지 않는 것이다. 아래 상황에 해당한다면 재정의 하지 않는것이 최선이다. 각 인스턴스가 본질적으로 고유하다. 값을 표현하는게 아니라 개체를 표현하는 클래스가 해당된다. 인스턴스의 논리적 동치성을 검사할 일이 없다. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. 클래스가 private 여서 equals를 호출할 일이 없다. 실수로라도 호출되는 걸 막고싶다면 예외처리로 throw new AssertionError()를 발생시키자.. 재정의 하는 상황 논리적 동치성을 비교해야할 때 재정의하면 좋다. 객체가 아니라 값이 같은지를 알고싶을때 Ma..
자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. 상당수가 안전망으로 finalizer를 이용하지만 믿을만 하지 못하다.(item8) 전통적으로 자원을 닫힘을 보장하는 수단으로서 아래와 같이 try-finally가 쓰였다. try { OutputStream out = new FileOutputStream("filePath"); // do something } finally { out.close(); } 하지만 2개의 자원을 닫아야 하는 구간에서는 예외가 무시될 수 있으며 코드의 가독성도 떨어진다. public void copy(String src, String dst) throws IOException { InputStream in = new FileInputStream(s..
자바는 두 가지 객체 소멸자인 finalizer와 cleaner를 제공한다. finalizer는 예측할 수 없고, 상황에 따라 위험하여 쓰지 말아야한다. 또한 cleaner도 여전히 예측할 수 없고 느리며 불필요하다. 사용을 피해야 하는 이유 언제 실행될 지 알 수 없다. 성능 저하가 발생한다. finalize에서 발생한 예외는 무시되어 알 수 없다. finalizer와 cleaner 를 쓰는 곳 자원 반납에 쓸 close 메소드를 클라이언트가 호출하지 않았다면 사용할 만 하다. finalizer나 Cleaner가 호출될지 안될지 언제 호출될지도 모른지만 안하는 것 보다는 나으니 사용할 만 하다. 자바에서 제공하는 FileInputStream, FileOutputStream, ThreadPoolExecu..