본문 바로가기

Java

(4)
[Java] Float, Double 비교시 주의할 점 동등성 판별시 부동소수점 오차 System.out.println(0.1 + 0.2 == 0.3);// false 위의 코드는 놀랍게도 false를 출력합니다. 이는 부동소수점 오차로 인해 발생하는 문제입니다. 컴퓨터에서 소수점을 표현하는 방식으로 2가지가 있습니다. 고정 소수점 방식과 부동 소수점 방식입니다. 고정 소수점 방식은 부호, 정수부, 소수부를 활용해 소수를 표현합니다. 직관적인 표현 방식이죠. 예를 들어 12.345를 표현한다면 부호에는 양수를, 12는 정수부에, 345를 소수부에 표현합니다. 이 방식은 정밀도가 매우 높지만, 표현할 수 있는 수의 범위가 너무 좁다는 한계가 있습니다. 부동 소수점 방식은 부호, 가수부, 지수부로 소수를 표현합니다. ±(1.가수부)×2^(지수부-127) 이 방식..
[Java] Wrapper class valueOf 캐싱 Integer의 valueOf 캐싱 Integer의 valueOf는 -128부터 127사이의 값들을 미리 만들어두고 변환합니다. 아래 그림과 같이 말이죠. IntegerCache는 -128부터 127까지의 값을 갖는 Integer 배열을 가지고 있습니다. 이 배열은 0번째 index에 -128의 값을 가진 Integer 객체가 있습니다. 즉, 1번째 index에는 -127, 2번째에는 -126, ... 그래서 valueOf할 때 -128과 127사이의 값이 인자로 들어오면, 미리 만들어둔 IntegerCache.cache[i - 128]를 반환합니다. Integer a = 120; // IntegerCache에서 꺼내온다 Integer b = 120; // IntegerCache에서 꺼내온다 System..
[Java] Autoboxing과 Unboxing 컴파일러가 primitive 타입을 wrapper 클래스 타입으로 변환해주는 것을 autoboxing이라고 합니다. 예를 들어 int타입을 Integer로, double을 Double로 바꾸는 경우입니다. 아래는 autoboxing이 발생하는 경우를 예시로 든 것입니다. Integer sum = 0; // int -> Integer Character c = 'a'; // char -> Character List li = new ArrayList(); for (int i = 0; i Integer sum += i; // i가 int -> Integer 숫자, 문자 등의 리터럴은 primitive type입니다. 이를 Wrapper Class인 ..
[Java] String Literal에 관하여... String Literal이란? 큰따옴표(")로 감싸여져 있는 문자열을 의미합니다. 예를 들어 아래의 코드에서 "Hello, world!"가 String Literal입니다. String str = "Hello, world!"; 위의 코드에서 볼 수 있듯이, String Literal은 String 타입입니다. 그래서 아래와 같이 작성할 수도 있습니다. "Hello".charAt(0)// H String Literal 캐싱 String Literal은 String Pool에 캐싱됩니다. 즉, 같은 내용인 String Literal(equals가 true)들은 모두 같은 String 객체입니다. String Pool은 초기에는 비어있는 상태로 시작합니다. 그리고 새로운 String Literal을 발견할 ..