일상/레벨업 독서 35

[내 코드가 그렇게 이상한가요?] 4장 불변 활용하기 : 안정적으로 동작하게 만들기

1. final 수식자를 붙여 재할당을 피하자.변수 하나를 재활용하지 않고, 계속해서 새로운 변수를 만들어 사용하면 재할당을 피할 수 있습니다.  1) 불변 변수로 만들어 재할당 막기변수에 final 수식자를 붙이면 됩니다. void doSomething(){ final int value = 100; value = 200; //컴파일 오류}   2) 매개변수도 불변으로 만들기매개변수를 변경하면 의미가 바뀔 수 있습니다. 이렇게 의미가 바뀌면 코드를 읽는 사람이 헷갈리므로, 버그의 원인이 될 수 있습니다.  [매개변수 productPrice에 재할당하는 코드]void addPrice(int productPrice){ productPrice = totalPrice + productPri..

[내 코드가 그렇게 이상한가요?] 3장 모든 것과 연결되는 설계 기반

클래스 설계 1. 클래스 단위로  잘 동작하도록 설계하기 1) 클래스는 클래스 하나로도 잘 동작할 수 있게 설계해야 합니다.2) 복잡한 초기 설정을 하지 않아도 곧바로 사용할 수 있게 만들어야 합니다.3) 클래스를 마음대로 조작해서 클래스 전체가 고장 나는 일(버그 발생)이 없게, 최소한의 조작 방법(메서드)만 외부에 제공해야 합니다.   잘 만들어진 클래스란?아래 두 요소를 모두 갖춘 클래스입니다.인스턴스 변수인스턴스 변수에 잘못된 값이 할당되지 않게 막고, 정상적으로 조작하는 메서드     2. 성숙한 클래스로 성장시키는 설계 기법  1) 생성자로 확실하게 정상적인 값 설정하기  1-1) Default 생성자만 있는 경우문제 - 인스턴스 변수가 초기화되지 않은 상태에서 인스턴스를 생성할 수 있습니다...

[내 코드가 그렇게 이상한가요?] 2장 설계 첫걸음

1. 의도를 분명히 전달할 수 있는 이름 설계하기  문제) 어떤 일을 하는지 히해하기 힘든 로직int d = 0;d = p1 + p2;d = d - ((d1 + d2) / 2);if(d     해결) 의도를 알 수 있는 이름 붙이기int damageAmount = 0;damageAmount = playerArmPower + playerWeeaponPower;damageAmount = damageAmount - ((enemyBodyDefence + enemyArmorDefence) / 2);if(damageAmount    변수 명을 짧게 줄이면 다른 사람이 읽거나 시간이 지난 후 다시 볼 떄는 일고 이해하기가 매우 어렵습니다. 의도를 쉽게 알 수 있는 이름을 붙이세요.       2. 목적별로 변수를 따..

[내 코드가 그렇게 이상한가요?] 1장 잘못된 구조의 문제 깨닫기

나쁜 구조로 인해 발생할 수 있는 폐해 1. 의미를 알 수 없는 이름예시1) 기술 중심 명명class MemoryStateManager{ void changeIntValue01(int changeValue){ ... }} -자료형(Int), 메모리 제어를 나타내는 Memory와 Flag 등 프로그래밍이나 컴퓨터 용어를 기반으로 이름을 붙이는 것을 기술 중심 명명이라고 부릅니다.    예시2) 일련번호 명명class Class01{ void method001(); void method002(); void method003(); ...} - 클래스와 메서드에 번호를 붙여서 이름을 짓는 것을 일련번호 명명이라고 합니다. - 이렇게 이름을 지으면 코드의 의도를 읽어낼 수 없고, 충분히 이..

[이펙티브 자바] Item 85 자바 직렬화의 대안을 찾으라.

핵심 정리 직렬화는 위험하니 피해야 한다. 시스템을 밑바닥부터 설계한다면 JSON이나 프로토콜 버퍼 같은 대안을 사용하자. 신뢰할 수 없는 데이터는 역직렬화하지 말자. 꼭 해야 한다면 객체 역직렬화 필터링을 사용하되, 이 마저도 모든 공격을 막아줄 수는 없음을 기억하자. 클래스가 직렬화를 지원하도록 만들지 말고, 꼭 그렇게 만들어야 한다면 정말 신경써서 작성해야 한다. 직렬화란? 넓은 의미로 직렬화는 어떤 데이터를 다른 데이터의 형태로 변환하는 것이다. 이팩티브 자바에서 말하는 직렬화(Serializable)란 바이트 스트림으로의 직렬화로 객체의 상태를 바이트 스트림으로 변환하는 것이고, 반대로 바이트 스트림에서 객체의 상태로 변환하는 건 역직렬화(Deserializable)이다. 직렬화의 근본적인 문제..

[이펙티브 자바] Item 84 프로그램의 동작을 스레드 스케줄러에 기대지 말라.

핵심 정리 프로그램의 동작을 스레드 스케줄러에 기대지 말자. 견고성과 이식성을 모두 해치는 행위다. 같은 이유로, Thread.yield와 스레드 우선순위에 의존해서도 안 된다. 이 기능들은 스레드 스케줄러에 제공하는 힌트일 뿐이다. 스레드 우선순위는 이미 잘 동작하는 프로그램의 서비스 품질을 높이기 위해 드물게 쓰일 수는 있지만, 간신히 동작하는 프로그램을 '고치는 용도'로 사용해서는 절대 안 된다. 1. 견고하고 이식성이 좋은 프로그램을 작성하는 방법 실행 가능한 스레드의 평균적인 수를 프로세서 수보다 지나치게 많아지지도 않도록 하는 것이다. 실행 준비가 된 스레드들은 맡은 작업을 완료할 때까지 계속 실행되도록 만들자. 실행 가능한 스레드 수를 적게 유지하는 주요 기법은 각 스레드가 무언가 유용한 작..

[이펙티브 자바] Item 79 과도한 동기화는 피하라.

핵심 정리 교착상태와 데이터 훼손을 피하려면 동기화 영역 안에서 외계인 메서드를 절대 호출하지 말자. 일반화해 이야기하면, 동기화 영역 안에서의 작업은 최소한으로 줄이자. 가변 클래스를 설계할 때는 스스로 동기화해야 할지 고민하자. 멀티코어 세상인 지금은 과도한 동기화를 피하는 게 과거 어느 때보다 중요하다. 합당한 이유가 있을 때만 내부에서 동기화하고, 동기화했는지 여부를 문서에 명확히 밝히자. 이번 아이템에서는 과도한 동기화는 성능을 떨어뜨리고, 교착상태에 빠뜨리고, 심지어 예측할 수 없는 동작을 낳기도 한다. 응답 불가와 안전 실패를 피하려면 동기화 메서드나 동기화 블록 안에서는 제어를 절대로 클라이언트에 양도하면 안 된다. 예를 들어 동기화된 영역 안에서는 재정의할 수 있는 메서드는 호출하면 안 ..

[이펙티브 자바] Item 78 공유 중인 가변 데이터는 동기화해 사용하라.

핵심 정리 여러 스레드가 가변 데이터를 공유한다면 그 데이터를 읽고 쓰는 동작은 반드시 동기화 해야 한다. 동기화하지 않으면 한 스레드가 수행한 변경을 다른 스레드가 보지 못할 수도 있다. 공유되는 가변 데이터를 동기화하는 데 실패하면 응답 불가 상태에 빠지거나 안전 실패로 이어질 수 있다. 이는 디버깅 난이도가 가장 높은 문제에 속한다. 간헐적이거나 특정 타이밍에만 발생할 수도 있고, VM에 따라 현상이 달라지기도 한다. 배타적 실행은 필요 없고 스레드끼리의 통신만 필요하다면 volatile 한정자만으로 동기화할수 있다. 다만 올바로 사용하기가 까다롭다. 1. 동기화(synchronized)란? 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장한다. Multi-Thread 상태에서 동일한 자원을..

[이펙티브 자바]Item 73 추상화 수준에 맞는 예외를 던지라.

핵심 정리 아래 계층의 예외를 예방하거나 스스로 처리할 수 없고, 그 예외를 상위 계층에 그대로 노출하기 곤란하다면 예외 번역을 사용하라. 이때 예외 연쇄를 이용하면 상위 계층에는 맥락에 어울리는 고수준 예외를 던지면서 근본 원인도 함께 알려주어 오류를 분석하기에 좋다. 메서드가 저수준 예외를 처리하지 않고 바깥으로 전파해버릴 때 발생하는 일 1. 수행하려는 일과 관련 없어 보이는 예외가 발생 2. 내부 구현 방식을 드러내어 윗 레벨 API를 오염 3. 구현 방식을 바꾸면 다른 예외가 튀어나와 기존 클라이언트 프로그램을 깨지게함 예외 번역(exception translation) 상위 계층에서 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던지는 것이다. /** * 이 리스트 안의 지정한 위..

[이펙티브 자바] Item 72 표준 예외를 사용하라.

핵심 정리 더 많은 정보를 제공하고 싶은 경우에는 표준 예외를 확장해도 좋다. 하지만 예외는 직렬화할 수 있는데, 직렬화에는 많은 부담이 따르므로 예외를 새로 만들지 않는 것을 권장된다. (자바 라이브러리는 대부분 API에서 쓰기에 충분한 수의 예외를 제공한다.) 표준 예외를 재사용시 장점 1. 자신의 API가 다른 사람이 익히고 사용하기 쉬워진다. 많은 프로그래머에게 이미 익숙해진 규약을 그대로 따르기 때문이다. 2. 자신의 API를 사용한 프로그램도 낯선 예외를 사용하지 않게 되어 읽기 쉽다. 3. 예외 클래스 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다. 예외 예외 주요 쓰임 예시 IllegalArgumentException 허용하지 않는 값이 인수로 건네졌을 때(nul..