분류 전체보기 (80) 썸네일형 리스트형 [Clean Code] Chapter 18 동시성 2 클라이언트/서버 예제 책에서는 단일 스레드로 동작하던 서버를 다중 스레드로 변경하는 것과 코드를 깨끗하게 변경하는 내용을 다룬다. 우리는 다중 스레드를 적용하기 전에 어플리케이션이 어디서 시간을 보내는지 알아야 한다. I/O - 소켓 사용, 데이터베이스 연결, 가상 메모리 스와핑 기다리기 등에 시간을 보낸다. 프로세서 - 수치계산, 정규표현식 처리, 가비지 컬렉션 등에 시간을 보낸다. 대개 시스템은 둘 다 하느라 시간을 보내지만, 특정 연산을 살펴보면 대개 하나가 지배적이다. 1. 프로그램이 주로 프로세서 연산에 시간을 보내는 경우 새로운 하드웨어를 추가해 성능을 높여 테스트를 통과하는 방식이 적합하다. 프로세서 연산에 시간을 보내는 프로그램은 스레드를 늘인다고 해서 빨라지지 않는다. 왜냐하면 CPU 사.. [Effective Java] 아이템 64 - 객체는 인터페이스를 사용해 참조하라 cf) Item.51 : 매개변수 타입으로 클래스가 아닌, 인터페이스를 사용하라 → 객체는 클래스가 아닌 인터페이스로 참조하라로 확장 적합한 인터페이스만있다면 매개변수뿐 아니라, return, 변수, 필드를 전부 인터페이스 타입으로 선언하자 실제 클래스를 사용해야 할 상황은 오직 생성자로 생성할 때뿐이다. 인터페이스를 타입으로 사용하는 습관은 프로그램을 훨씬 유연하게 만들어 준다 // Good Set sonSet = new LinkedHashSet(); Set sonSet = new HashSet(); //유연하게 변경가능 // Bad LinkedHashSet sonSet = new LinkedHashSet(); 인터페이스를 타입으로 사용하면 이후 구현 클래스를 교체할 때 새 클래스의 생성자(혹은 다른 .. [Effective Java] 아이템 63 - 문자열 연결은 느리니 주의하라 String + String 에서의 + : 문자열 연결 연산자는 여러 문자열을 하나로 합쳐주는 편리한 수단 단 한 줄짜리 출력값 혹은 작고 크기가 고정된 객체의 문자열을 표현할 때만 사용하자 문자열은 불변이기 때문에 두 문자열을 연결할 경우에는 양쪽의 내용을 모두 복사해야하므로, 문자열 연결 연산자를 통한 문자열 n개의 연산은 O(n^2)이다. 예시 // 청구서의 item을 전부 하나의 문자열로 연결하는 메서드 // 문자열 연결을 잘못 사용한 예 - 아이템이 많아지면 많아질수록 성능저하 public String statement() { String result = ""; for (int i = 0; i < numItems(); i++) { result += lineForItem(i); } return r.. [Effective Java] 아이템 62 - 다른 타입이 적절하다면 문자열 사용을 피하라 String(문자열) - Text를 표현하도록 설계되고, 자바가 잘 지원해주는 타입 하지만 워낙 자바에서 너무 잘 지원해주어서, 원래의 의도대로 사용되지 않는 경향이 있으며, 이럴 때 문자열 사용을 피해야할 사례에 대해서 이야기한다. # 문자열을 쓰지 않아야할 사례 1. 다른 값 타입을 대신해서 문자열을 사용하는 경우 받는 데이터가 수치형 - int, float, BigInteger ... 적당한 수치를 타입으로 변환해서 사용할 것 Y/N 를 나타낼 수 있다면 적절한 열거 타입 혹은 boolean 타입을 사용할 것 즉 기본 타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성할 것 2. 열거 타입을 대신하여 문자열을 사용할 경우 3. 혼합 타입을 대신하여 문자열을 사용.. [Effective Java] 아이템 61 - 박싱된 기본 타입보다는 기본 타입을 사용하라 Java Data Type 기본 타입 : int , double, boolean .. 참조 타입 : String, List ... 기본 타입과 참조 타입의 차이에 대해서 설명해주세요 더보기 1. 각 타입에 따라 저장되는 값이 다르다. A. 기본 타입 - 변수에는 실제 값이 저장된다. B. 참조 타입 - 배열, 열거, 클래스, 인터페이스를 이용해서 선언된 변수는 메모리 주소 값을 가지게 된다. 2. 해당 값이 저장되는 위치 A. 기본 타입 - Stack B. 참조 타입 - Heap 기본 타입과 박싱된 기본 타입의 차이에 대해서 설명해주세요 더보기 기본타입 : int, double , boolean ... 박싱된 기본 타입 : Integer, Double , Boolean ... 차이점 기본 타입은 값만 .. [Effective Java] 아이템 60 - 정확한 답이 필요하다면 float와 double은 피하라 float, double 과학과 공학 계산용으로 설계된 타입 이진 부동소수점 연산에 사용되며, 넓은 범위의 수를 빠르고 정밀한 "근사치" 계산을 위해 세심하게 설계 → 따라서 float과 double 타입은 특히 금융 관련과 같은 정확한 답이 필요한 계산에서는 사용하기 적절치 않다. ex) 정확한 값을 구해야할 때 double, float을 사용하는 경우 // Q1. 1.03달러가 있을 때 그중 42센트를 사용할 경우 얼마가 남았을까? System.out.println(1.03 - 0.42); // -> result : 0.6.10000000000000001 // Q2. 1달러로 10센트짜리 사탕 9개를 살 경우에 얼마가 남았을까? System.out.println(1.00 - 9 * 0.10); // .. [Clean Code] Chapter 17 냄새와 휴리스틱 해당 포스팅 내용은 책 'Clean Code - Robert C. Martin' 출처로 합니다. 휴리스틱(Heuristics) 불충분한 시간이나 정보로 인해 합리적인 판단을 할 수 없거나, 체계적이면서 합리적인 판단이 굳이 필요하지 않은 상황에서 사람들이 빠르게 사용할 수 있도록 보다 용이하게 구성된 간편 추론의 방법 문제의 답을 경험 법칙, 경험에 의한 추측, 직관적 판단, 상식, 시행착오 등의 방법을 사용하여 구하는 것 알고리즘 (논리적 해답) 여기서 나쁜 냄새가 난다 주석 (Comment) C1 - 부적절한 정보 다른 시스템에 저장할 정보는 주석으로 작성하지 말자 주석은 코드와 설계에 기술적인 설명을 부연하는 수단 C2 - 쓸모 없는 주석 오래되거나 엉뚱하거나, 잘못된 주석은 과감하게 버리고, 재빨.. [Effective Java] 아이템 59 - 라이브러리를 익히고 사용하라 개요 도입으로써 난수 발생 예제를 확인해보자 static Random rnd = new Random(); static int Random(int n){ return Math.abs(rnd.nextInt()) % n; } 위 코드는 크게 세 가지의 문제를 가지고 있다. 문제 1. n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다. 문제 2. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. 문제 3. 지정한 범위 '바깥'의 수가 종종 튀어나올 수 있다. (rnd.nextInt() 와 Math.abs()의 Integer처리 때문) 위 결함을 해결하기 위해서는 의사난수 생성기, 정수론, 2의 보수 계산 등에 대한 지식이 필요한데... 우리는 그것을 알 필요가 없.. [Effective Java] 아이템 58 - 전통적인 for 문보다는 for-each문을 사용하라 개요 이전 아이템에서 for문이 while문 보다 더 적격이다 라는 내용을 다루었지만 같은 for문 내에서도 for-each 문을 사용하는 것이 더 바람직하다 반복자와 인덱스 변수는 모두 코드를 지저분하게 할 뿐 우리에게 진짜 필요한 건 원소들 뿐이다. 쓰이는 요소 종류가 늘어나면 오류가 발생할 가능성이 높아진다. 중첩되어 반복문이 사용되는 경우 변수를 잘못 사용할 틈새가 넓어진다. 혹시라도 잘못된 변수를 사용했을 때 컴파일러가 잘못 사용한 변수를 잡아준다는 보장도 없다. 컬렉션인지 배열인지에 따라 코드 형태도 상당히 달라지므로 주의해야 한다. 해결법 : for-each 위에서 언급한 내용들은 for-each문을 사용하면 모두 해결이 가능하다. 반복자와 인덱스 변수를 사용하지 않으니 코드가 깔끔해지고 오.. [Effective Java] 아이템 57 - 지역변수의 범위를 최소화하라 이번 아이템은 "클래스와 멤버의 접근 권한을 최소화하라" 의 취지로 접근하자. 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 처음 사용 지역변수의 범위를 줄이는 가장 강력한 기법은 역시 '가장 처음 쓰일 때 선언하기'이다. 지역변수를 사용시점 훨씬 이전에 사용하게 되면 막상 사용할 시점에 타입과 변수명이 기억나지 않을 수도 있기 때문이다. 거의 모든 지역변수는 선언과 동시에 초기화해야 한다. 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다. try-catch문은 제외! - 변수를 초기화하는 과정에서 예외를 던질 가능성이 있다면 try 블럭안에서 사용. 단 변수 값을 try 블럭 외부에서도 사용해야 하는 경우라면 try 블럭 앞.. 이전 1 2 3 4 ··· 8 다음 목록 더보기