맞는데 왜 틀릴까..?

전체 글 306

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

문자열(String)은 텍스트를 표현하도록 설계되었지만 원래 의도하지 않은 용도로도 쓰이는 경향이 있다. 이번 아이템에서는 문자열을 쓰지 않아야 할 사례를 다룬다. 문자열을 쓰지 않아야 할 사례 1. 문자열은 다른 값 타입을 대신하기에 적합하지 않다. 입력받을 데이터가 진짜 문자열이 아닌 수치형이라면 int, float, BigInteger 등 적당한 수치 타입으로 변환해야 한다. 기본 타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고 없다면 새로 작성하자. 2. 문자열은 열거 타입을 대신하기에 적합하지 않다. 상수를 열거할 떄는 문자열보다는 열거 타입이 월등히 낫다. 3. 문자열은 혼합 타입을 대신하기에 적합하지 않다. 여러 요소가 혼합된 데이터를 하나의 문자열로 표현하는 것은 대체로 좋..

Java/Effective Java 2023.07.30

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

자바의 타입 기본 타입 : int, double, boolean 참조 타입 : String, List 박싱된 기본 타입 : Integer, Double, Boolean 오토박싱과 오토언박싱 덕분에 두 타입을 크게 구분하지 않고 사용할 수는 있지만 차이가 사라지는 것은 아니다. 기본 타입과 박싱된 기본 타입의 주된 차이 3가지 1. 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성(identity)이란 속성을 갖는다. 박싱된 기본 타입의 두 인스턴스는 값이 같아도 서로 다르다고 식별될 수 있다. 2. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값, 즉 null을 가질 수 있다. 3. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. ..

Java/Effective Java 2023.07.30

[Secure Coding] 민감-데이터의 수명을 제한하라

메모리에 있는 민감-데이터(sensitive data)는 오염되기 쉽다. 메모리가 사용 후 삭제되지 않는 데이터를 포함한 경우에 민감-데이터 누출의 가능성이 더 높아진다. 노출의 위험을 제한하기 위해서 프로그램은 민감-데이터의 수명을 최소화해야 한다. 공격자의 민감-데이터 엑세스 동일한 시스템에서 응용 프로그램을 수행할 수 있는 공격자는 응용프로그램이 다음과 같을 때 민감-데이터에 엑세스할 수 있다. 사용 후에 내용이 삭제되지 않거나 garbage-collection 되는 객체에 민감-데이터를 저장하여 사용할 때 운영체제에 의해 디스크로 스왑아웃될 수 있는 메모리 페이지를 포함할 때 (메모리 관리 작업이나 최대절전모드를 위해) OS 캐시나 메모리에 있는 데이터의 복사본을 가지고 있는 버퍼(buffered..

Java/Secure Coding 2023.07.24

[Secure Coding] Chap1. 안전성

기업 자바 응용프로그램은 신뢰할 수 없는 입력을 수용해야 하고, 복잡한 서브시스템과 상호작용해야 하기 때문에 공격당하기 쉽다. 만약 응용프로그램 안에 사용된 컴포넌트들이 공격당하기 쉬운 경우라면, 응용프로그램에 대한 인젝션 공격 (크로스-사이트 스크립팅(XSS), XPath와 LDAP 인젝션 등)이 가능하다. 이를 완화하는 효과적인 전략은 번역되기 전에 입력을 화이트리스트(Whitelist)화하고 출력을 인코딩하거나 이스케이핑(escaping) 하는 것이다. 1 챕터 안전성은 자바 기반의 응용프로그램에 대하여 안전성을 보장하기 위한 가이드라인을 기술한다. 민감한 데이터 다루기 일반적인 인젝션 공격 피하기 보안성을 해치도록 오용될 수 있는 언어적 특징 자바의 섬세한 보안 메커니즘의 세부사항 입력 데이터 화..

Java/Secure Coding 2023.07.24

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

float와 double의 문제점 float와 double 타입은 과학과 공학 계산용으로 설계되었다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 세심하게 설계되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안 된다. float와 double 타입은 특히 금융 관련 계산과는 맞지 않는다. 0.1 혹은 10의 음의 거듭제곱 수(10^-1)를 표현할 수 없기 때문이다. ex1) 주머니에 1.03 달러가 있는데 그중 42 센트를 썼다. System.out.println(1.03 - 0.42)는 0.6100000000000001을 출력한다. ex2) 주머니에 1 달러가 있는데 10센트 사탕 9개를 샀다. System.out.println(1.00 - 9*0.10)는..

Java/Effective Java 2023.07.23

[Effective Java] Item 59. 라이브러리를 익히고 사용하라

Random 무작위 수를 생성하는 코드 책의 글쓴이가 신중히 선택한 범위에서 무작위 수를 100만 개 생성한 다음, 그중 중간 값보다 작은 게 몇 개인지 출력한다. random 메서드가 이상적으로 동작한다면 약 50만개가 출력돼야 하지만, 실제로 돌려보면 666,666에 가까운 값을 얻는다. 무작위 생성 수 중 2/3가 중간값보다 낮은 쪽으로 쏠린것이다. 위 코드는 문제를 세 가지나 내포하고 있다. 1. n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다. 2. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. n 값이 크면 이 현상은 더 두드러진다. 3. 지정한 범위 '바깥'의 수가 종종 튀어나올 수 있다. rnd.nextInt()가 반환한 값을 Math...

Java/Effective Java 2023.07.23

[Effective Java] Item 57. 지역변수의 범위를 최소화하라

지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 지역변수의 범위를 줄이는 방법 1. 가장 처음 쓰일 때 선언하기 사용하기 전에 미리 선언부터 해두면 코드가 어수선해져 가독성이 떨어진다. 변수를 실제로 사용하는 시점에 타입과 초깃값이 기억나지 않을 수 있다. 지역변수를 생각 없이 선언하다 보면 변수가 쓰이는 범위보다 너무 앞서 선언하거나, 다 쓴 뒤에도 여전히 살아 있게 되기 쉽다. 지역변수의 범위는 선언된 지점부터 그 지점을 포함한 블록이 끝날 때까지 이므로, 실제 사용하는 블록 바깥에 선언된 변수는 그 블록이 끝난 뒤까지 살아있게 된다. 2. 거의 모든 지역변수는 선언과 동시에 초기화해야 한다. 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선..

Java/Effective Java 2023.07.22

[Effective Java] Item 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라

API를 쓸모 있게 하려면 잘 작성된 문서도 곁들여야 한다. 자바에서는 자바독(Javadoc)이라는 유틸리티가 소스코드 파일에서 문서화 주석(doc comment; 자바독 주석)이라는 특수한 형태로 기술된 설명을 추려 API 문서로 변환해 준다. 문서화 주석 문서화 주석을 작성하는 규칙은 공식 언어 명세에 속하진 않지만 자바 프로그래머라면 알아야 하는 업계 표준 API다. 이 규칙은 문서화 주석 작성법 (How to Write Doc Comments) 웹 페이지에 기술되어 있다. API를 올바로 문서화하려면 공개된 모든 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달아야 한다. 직렬화할 수 있는 클래스라면 직렬화 형태에 관해서도 적어야 한다. 문서화 주석이 없다면 자바독도 그저 공개 API ..

Java/Effective Java 2023.07.22

[Effective Java] Item 55. 옵셔널 반환은 신중히 하라

메서드가 값을 반환할 수 없을 때 1. 예외를 던짐 진짜 예외적인 상황에서만 사용해야 한다. 예외를 생성할 때 스택 추적 전체를 캡처하므로 비용도 많이 든다. 2. 반환 타입이 객체 참조라면 null을 반환 null을 반환할 수 있는 메서드를 호출할 때는, 별도의 null 처리 코드를 추가해야 한다. null 처리를 무시하고 반환된 null 값을 어딘가에 저장해 두면 언젠간 NullPointerException이 발생할 수 있다. (실제 원인과는 전혀 상관없는 코드에서) 3. Optional 자바 8 이후 Optional 는 null이 아닌 T타입 참조를 하나 담거나, 혹은 아무것도 담지 않을 수 있다. 아무것도 담지 않은 옵셔널을 '비었다'라고 말한다. 어떤 값을 담은 옵셔널을 '비지 않았다'라고 한다..

Java/Effective Java 2023.07.22