studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  1. Java 관련 정리
  2. Effective Java

8장 - 프로그래밍 일반

  1. 지역 변수의 유효 범위를 최소화하기

    1. 필요한 곳에서 변수를 선언하고 가급적 바로 초기화하는 것으로 코드를 이해하기 쉽게 만들 수 있다.

  2. for 루프보다는 for-each 루프 사용 - 그러나 루프문이 중첩된다면 기존의 for이 버그 확률을 낮춰준다.

  3. 가급적 라이브러리를 사용하기.

  4. 정확한 계산에는 부동소숫점 변수는 쓰지 않기 - 부동소수점은 결과값이 부정확함

  5. Wrapper 클래스보다는 기본형 변수를 쓰기 - 성능에 이점. == 등 비교 연산자를 쓸 때 실수할 여지를 줄여줌.

  6. 불필요하게 String클래스 사용하지 않기

    1. int, boolean 등 가급적 적절한 데이터타입을 사용하기.

    2. enum을 대신할 상수로 쓰지 않기.

    3. 여러 데이터를 묶어서 하나의 String으로 사용하지 않기

  7. 문자열 결합의 성능 저하 주의 - 가급적 StringBuilder 사용하기. 근데 JDK 버전 1.6부터는 알아서 StringBuilder 쓰도록 바뀌었으므로 뭘 써도 무방할듯.

  8. 변수를 선언할 때는 concrete class보다는 interface로 선언하기

    1. 좀 더 유연한 코드가 될 수 있음. 다만 concrete class로 선언하는 경우도 있는데 그건 그 클래스에만 존재하는 기능을 쓰려고 할 때.

    2. 그리고 String 이나 BigInteger 같은 value class의 경우에도 그냥 class로 변수 선언

    3. interface가 없다면 당연히 그냥 class로 선언하는 수 밖에 없다.

  9. reflection 보다는 interface 사용하기

    1. 리플렉션은 성능이 안 좋고 코드를 알아보기가 어려운 단점이 있다. -> 보통 초기화에만 사용하고 실제로 어플리케이션이 작동할 때는 리플렉션을 안 쓰는게 정상이다.

  10. native method 분별력 있게 사용하기

    1. VM 성능이 예상보다 좋으므로 단순히 성능이라는 이유만으로 native method를 사용하는 것에는 무리가 있다. 면밀하게 비교해보고 확실한 이득이 있을 때만 쓰는 것이 좋다.

    2. native method는 자바의 여러 장점들을 손상시킨다. 메모리와 관련해서 안전하지 않게 되며, 이식성이 안 좋아지게 된다. 또한 디버깅도 아주 어려워진다. 그리고 native method로 진입하고 빠져나올 때 오버헤드가 존재한다.

  11. 잘 판단해서 최적화하기

    1. 일반적으로 최적화는 하지 않는 것이 가장 훌륭한 방법이다. 얻는 것 보다 더 많이 잃기 쉽다.

    2. 빠른 것 보다는 좋은 어플리케이션 작성에 노력해야 한다.

    3. 설계를 할 때 성능에 제한이 생기지 않도록 노력해야 한다. 즉 가변형 타입을 만들어서 불필요하게 많은 객체를 생성하게 된다던가, 컴포지션이 적합한 곳에 상속을 쓴다던가, 인터페이스보다 concrete class로 변수를 선언하는 등의 부분이다. 나중에 갈아끼우기 힘들어진다.

    4. 다만 좋은 성능을 얻겠다고 API를 뒤트는 것은 매우 나쁜 발상이다. API를 뒤틀지 않고 성능을 개선하는 방법이 나올 수 있고, 이런 경우 한번 뒤틀린 API를 다시 정상적으로 돌리는 것은 아주 힘들다.

    5. 정 최적화를 하겠다면 하기 전과 후의 성능을 측정하자. 자바는 프로그래머가 짠 코드와 컴파일된 바이트코드간의 간격이 크다. 그렇기 때문에 최적화를 통해 실제로 성능이 개선되었는지 코드 시점에서 판단하기가 아주 어렵다.

    6. 성능을 측정하고 나서 요구사항에 부합한다면 놔두고, 아니라면 프로파일러를 사용해서 문제의 근원을 파악해서 그 부분만을 최적화하는 것이 옳다.

  12. 보편화된 작명 규칙 따르기

    1. 무조건 따를 필요는 없지만 그래도 가급적 따르는 편이 유리

    2. 패키지 이름은 숫자와 소문자로 된 컴포넌트 이름을 마침표로 연결하여 계층식 구조로 짓기. 일반적으로 인터넷 도메인을 거꾸로 뒤집어서 맨 앞에 붙인다. 가급적 짧고 의미있는 약어를 쓰는 것이 유리하다.

    3. 클래스와 인터페이스는 가능한 하나 이상의 단어로 사용하되 각 단어의 첫 글자만 대문자로 쓴다. 약어를 쓰는건 좋지만 나만 아는 약어는 최대한 덜 쓰는게 유리하다. 두문자어는 취향 대로.

    4. 상수 필드는 모두 대문자로 하고 단어는 _으로 구분

    5. 메소드, 필드, 지역 변수는 첫 글자를 소문자로 하고 각 단어는 대문자로 구분

    6. 타입 매개 변수는 가능한한 단일 문자로 구성. 일반적으로 임의 타입은 T, 컬렉션의 요소는 E, Map의 키 값은 K, V, 예외는 X로 사용. T에 이어 U, V, T1, T2, T3 등으로 이어나가곤 한다.

    7. 클래스는 보통 단일 명사나 명사구 사용

    8. 인터페이스는 클래스와 비슷하거나 able, ible을 끝에 붙이는 경우가 많다

    9. 메소드는 보통 동사나 동사구로 이름 짓는다. boolean 값을 반환하면 is, has 등으로 시작하는 경우가 많고 java bean 클래스라면 필드를 가져오는 메소드는 get으로 시작하고 설정하는 메소드는 set으로 시작하는 경우가 많다. 다만 타입을 변환하는 메소드는 to로 시작하는 경우가 많다.

Previous7장 - MethodNext9장 - Exception

Last updated 7 years ago