전체 글 (12) 썸네일형 리스트형 [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을 발견할 .. [Android] NestedScrollView 내부에 RecyclerView를 사용했을 때 스크롤이 제대로 안되는 문제 발견한 문제 NestedScrollView안에 RecyclerView를 두면 스크롤이 안되는 문제가 있습니다. 저는 RecyclerView를 Horizontal로 사용했습니다. 이렇게 사용하면 RecyclerView는 가로로 스크롤되고, 세로로 스크롤하면 NestedScrollView가 움직여야합니다. 하지만 실제로는 가로로 스크롤은 잘 되지만, 세로로 하는 스크롤이 안먹습니다. 해결방법 RecyclerView에 아래 속성을 추가합니다. android:nestedScrollingEnabled="false" [Android] Handler Deprecated 문제 Handler자체가 deprecated된 것은 아닙니다. Handler의 생성자인 Handler()가 deprecated되었습니다. 암시적으로 Looper가 결정되는 Handler() 생성자는 사용할 경우 문제가 생길 여지가 있다고 합니다. 일부 작업이 유실될 수 있는 버그 Looper가 없는 쓰레드에서 생성될 경우 에러(crash) Race condition 따라서 다른 생성자 Handler(Looper)를 사용해서 명시적으로 Looper를 선택해서 Handler를 생성해야합니다. Handler(Looper.getMainLooper()) 이런 방식으로 만들면 됩니다. 이 방법으로 Handler를 만들었다고 해서 위에서 언급했던 문제들이 완벽하게 해결되는 것은 아닙니다. 하지만 Looper를 명시적으로 .. [Android] Activity Lifecycle Activity는 사용자나 시스템의 요청에 따라 다양한 상태로 전환될 수 있습니다. 앱을 실행하는 도중에 잠깐 다른 앱으로 이동, 다른 Activity로 이동, 앱을 종료하는 등의 전환이 발생했을 때 Activity에서 이를 알아차리고 적절한 처리를 하도록 콜백을 구현할 수 있습니다. Android 공식 문서에서는 Lifecycle 콜백을 통해 아래 문제를 해결할 수 있다고 예시를 들어 설명합니다. 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태가 저장되지 않는 문제 화면이 가로 방향과 세로 방향 간에 회전할 경우, .. [Kotlin] ::class vs ::class.java Kotlin에서는 클래스 표기 방법을 두 가지 제공합니다. ::class와 ::class.java입니다. 이 두 표기방법은 각각 Kotlin의 Class, Java의 Class를 표현하는데 사용됩니다. 두 표기법은 어떤 차이가 있는가? ::class ::class.java Kotlin의 Class를 표현한다. Java의 Class를 표현한다. KClass를 반환한다. Class를 반환한다. Kotlin의 확장 기능들 (프로퍼티, data클래스 등...)에 대한 Reflection을 사용할 수 있다. Kotlin의 확장 기능들에 대한 Reflection을 사용할 수 없다. 왜 클래스 표현 방식을 두 가지로 나누어 제공하는가? Kotlin은 Java와의 완벽한 호환성을 보장합니다. 그래서 Kotlin에서 J.. 이전 1 2 다음