개발 177

[Effective Java] item 68. 일반적으로 통용되는 명명 규칙을 따르라

[Effective Java] item 68. 일반적으로 통용되는 명명 규칙을 따르라 자바 플랫폼은 명명 규칙이 잘 정립되어 있으며, 그중 많은 것이 자바 언어 명세에 기술되어 있다. 자바의 명명 규칙은 크게 철자와 문법, 두 범주로 나뉜다. 철자 규칙 패키지, 클래스, 인터페이스, 메서드, 필드, 타입 변수의 이름을 다룬다. 이 규칙들은 특별한 이유가 없는 한 반드시 따라야 한다. 이 규칙을 어긴 API는 사용하기 어렵고, 유지보수하기 어렵다. 철자 규칙이나 문법 규칙을 어기면 다른 프로그래머들이 코드를 읽기 번거로울 뿐만 아니라 다른 뜻으로 오해할 수도 있고 그로 인해 오류까지 발생할 수 있다. 패키지와 모듈 이름 패키지와 모듈 이름은 각 요소를 점(.)으로 구분하여 계층적으로 짓는다. 요소들은 모두..

[Effective Java] item 67. 최적화는 신중히 하라

[Effective Java] item 67. 최적화는 신중히 하라 최적화 격언 (맹목적인 어리석음을 포함해) 그 어떤 핑꼐보다 효율성이라는 이름 아래 행해진 컴퓨터 죄악이 더 많다(심지어 효율을 높이지도 못하면서). - 윌리엄 울프(Wulf72) (전체의 97% 정도인) 자그마한 효율성은 모두 잊자. 섣부른 최적화가 만악의 근원이다. - 도널드 크누스(Knuth74) 최적화를 할 때는 다음 두 규칙을 다르라. 첫 번째, 하지 마라. 두 번째, (전문가 한정) 아직 하지 마라. 다시 말해, 완전히 명백하고 최적화되지 않은 해법을 찾을 때까지는 하지 마라. 이 격언들은 자바가 탄생하기 20년 전에 나온 것으로, 최적화의 어두운 진실을 이야기해준다. 최적화는 좋은 결과보다는 해로운 결과로 이어지기 쉽고, 섣..

[Effective Java] item 66. 네이티브 메서드는 신중히 사용하라

[Effective Java] item 66. 네이티브 메서드는 신중히 사용하라 자바 네이티브 인터페이스(Java Native Interface, JNI)란? 자바 프로그램이 네이티브 메서드를 호출하는 기술 네이티브 메서드란, C나 C++같은 네이티브 프로그래밍 언어로 작성한 메서드 네이티브 메서드의 주요 쓰임 세 가지 1. 레지스트리 같은 플랫폼 특화 기능 사용 자바가 성숙해지면서 (OS 같은) 하부 플랫폼의 기능들을 점차 흡수하고 있다. 그래서 네이티브 메서드를 사용할 필요가 계속 줄어들고 있다. 예컨대 자바 9는 새로 processAPI를 추가해 OS 프로세스에 접근할 수 있는 길을 열어주었다. Java 9 Process API public class JavaProcess { public stati..

[Effective Java] item 65. 리플렉션보다는 인터페이스를 사용하라

[Effective Java] item 65. 리플렉션보다는 인터페이스를 사용하라 리플렉션(reflection)란? 리플렉션 기능(java.lang.reflect)을 이용하면 프로그램에서 임의의 클래스에 접근할 수 있다. Class 객체가 주어지면 그 클래스의 생성자, 메서드, 필드에 해당하는 Constructor, Method, Field 인스턴스를 가져올 수 있고, 이어서 이 인스턴스들로는 그 클래스의 멤버 이름, 필드 타입, 메서드 시그니처 등을 가져올 수 있다. 나아가 Constructor, Method, Field 인스턴스를 이용해 각각에 연결된 실제 생성자, 메서드, 필드를 조작할 수 있다. 이 인스턴스들을 통해 해당 클래스의 인스턴스를 생성하거나, 메서드를 호출하거나, 필드에 접근할 수 있다..

gRPC란?

gRPC란? 1. 배경지식 1.1 RPC(Remote Procedure Call) 1.1.1 RPC란? RPC(Remote Procedure Call) 원격 프로시져 호출 원격에 위치한 프로그램을 로컬에 있는 프로그램처럼 사용할 수 있다. 분산 네트워크 컴퓨터환경에서 프로그래밍을 쉽게 하기 위해 나온 방식 예시 # Client z = function(x, y) # Server function(x, y) { compute x, y return z }1.1.2 RPC 동작방식 Caller / Callee 사용자(Client, Server)가 필요한 비즈니스 로직을 실행하는 Layer IDL(Interface definition Language)로 작성 Stub Stub Compiler가 IDL 파일을 읽어 ..

개발 2021.03.22

[Effective Java] item 64. 객체는 인터페이스를 사용해 참조하라

[Effective Java] item 64. 객체는 인터페이스를 사용해 참조하라 객체는 클래스가 아닌 인터페이스로 참조하라 아이템 54에서 매개변수 타입으로 클래스가 아니라 인터페이스를 사용하라고 했다. 이 조언을 "객체는 클래스가 아닌 인터페이스로 참조하라"고까지 확장할 수 있다. 적합한 인터페이스만 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 모두 인터페이스 타입으로 선언하라. 객체의 실제 클래스를 사용해야 할 상황은 '오직' 생성자로 생성할 때 뿐이다. 예를 들어 다음은 Set 인터페이스를 구현한 LinkedHashSet 변수를 선언하는 올바른 모습이다. // 좋은 예. 인터페이스를 타입으로 사용했다. Set sonSet = new LinkedHashSet(); // 나쁜 예. ..

[Effective Java] item 63. 문자열 연결은 느리니 주의하라

[Effective Java] item 63. 문자열 연결은 느리니 주의하라 문자열 연결 연산자(+)는 여러 문자열을 하나로 합쳐주는 편리한 수단이다. 그런데 한 줄짜리 출력값 혹은 작고 크기가 고정된 객체의 문자열 표현을 만들 때라면 괜찮지만, 본격적으로 사용하기 시작하면 성능 저하를 감내하기 어렵다. 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n의 제곱에 비례한다. 문자열은 불변이라서 두 문자열을 연결할 경우 양쪽의 내용을 모두 복사해야 하므로 성능 저하는 피할 수 없는 결과다. 예를 들어 다음 메서드는 청구서의 품목(item)을 전부 하나의 문자열로 연결해준다. 문자열 연결을 잘못 사용한 예 - 느리다! public String statement() { String result = ""; fo..

[Effective Java] item 62. 다른 타입이 적절하다면 문자열 사용을 피하라

[Effective Java] item 62. 다른 타입이 적절하다면 문자열 사용을 피하라 문자열을 쓰지 말아야 할 사례 1. 문자열은 다른 값 타입을 대신하기에 적합하지 않다. 많은 사람이 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열을 사용한다. 사뭇 자연스러워 보이지만, 입력받을 데이터가 진짜 문자열일 때만 그렇게 하는게 좋다. 받은 데이터가 수치형이라면 int, float, BigInteger 등 적당한 수치 타입으로 변환해야 한다. '예/아니오' 질문의 답이라면 적절한 열거 타입이나 boolean으로 변환해야 한다. 일반화해 이야기하자면, 기본 타입이든 참조 타입이든 절절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성하라. 당연한 조언 같겠지만,..

[Effective Java] item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라

[Effective Java] item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라 1. 자바의 데이터 타입 기본 타입(primitive type) int, double, boolean 등 박싱된 기본 타입 Integer, Double, Boolean 등 2. 기본 타입과 박싱된 기본 타입의 차이점 오토박싱과 오토언박싱 덕분에 두 타입을 크게 구분하지 않고 사용할 수는 있지만, 그렇다고 차이가 사라지는 것은 아니다. 2.1. 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성(identity)이란 속성을 갖는다. 박싱된 기본 타입의 두 인스턴스는 값이 같아도 서로 다르다고 식별될 수 있다. 2.2. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값, 즉 ..

[Effective Java] item 60. 정확한 답이 필요하다면 float와 double은 피하라

[Effective Java] item 60. 정확한 답이 필요하다면 float와 double은 피하라 float와 double 타입 부동소수점 연산 (부정확하다) float와 double 타입은 과학과 공학 계산용으로 설계되었다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 세심하게 설계되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안된다. float와 double 타입은 특히 금융 관련 계산과는 맞지 않다. 0.1 혹은 10의 음의 거듭 제곱 수(10의 -1승, 10의 -2승 등)를 표현할 수 없기 때문이다. 예를 들어 주머니에 1.03 달러가 있었는데 그중 42센트를 썼다고 해보자. 남은 돈은 얼마인가? 다음은 이 문제의 답을 구하기 위..