본문 바로가기

Java10

String Constants Pool 프리미티브 타입의 값을 비교할 때에는 주소 값을 비교하기 위해 '==' 연산자를, 레퍼런스 타입의 값을 비교할 때에는 실제 참조하는 값을 비교하기 위해 'equals' 메서드를 이용합니다. 그리고 String의 경우에는 비교할 때에는 'equals'를 이용하기를 권장하는데, '==' 연산자로 비교하면 어떻게 될까요? String str1 = "FLYING"; String str2 = "FLYING"; System.out.println(str1 == str2); //true System.out.println(str1.equals(str2)); //true (literal 방식으로 String을 생성한다면) '==' 연산자를 이용해도 결과가 일치합니다. '==' 연산자를 이용했을 때 true가 나온다는 것은.. 2020. 11. 15.
클린 코드 작성 : 더 나은 개발자가 되기 위한 단계 ※ 이 글은 Sushil Ale가 쓴 Writing Clean Code: A Step Towards Being a Better Developer의 번역본입니다. 개발자들은 빠르게 변화하는 기술 시장에서 살아남기 위해 기술 스택을 알고, 숙련도를 높이는 등 개인의 스킬을 향상하기 위해 노력합니다. 보유기술을 늘리기 위해 새로돈 도구, 언어, 기술들을 배우려 합니다. 하지만 이렇듯 새로운 역량을 키우는 것 외에도 중요한 것은 어떻게 코드를 작성하는가에 대한 고찰입니다. 코드는 지속적으로 추가되거나 수정되고, 디버그 할 필요가 있기 때문에 깨끗하고 이해하기 쉬운 코드가 되어야 합니다. 쉽게 읽을 수 있고, 이해할 수 있고, 유지 보수할 수 있는 프로그램을 작성하기 위해 클린 코드의 지침을 따르는 것을 권고합니.. 2020. 11. 15.
Java(JVM) Memory Model(Runtime Data Areas) JVM은 컴파일된 자바 바이트코드를 실행하는 역할을 합니다. 이때, JVM이 메모리 관리를 어떻게 하는지, 그 구조에 대해 살펴보겠습니다. JDK 버전이 업그레이드 될 때마다 Java Memory Model도 지속적으로 업그레이드되어 왔습니다. 하지만 전체적인 구조는 유사합니다. 이 글은 JDK8을 기준으로 작성되었습니다. Java(JVM) 메모리 구조를 살펴보기 앞서 한가지 알아두어야 할 것이 있습니다. JVM 그 자체는 구현체가 아닌 스펙일 뿐이라는 것입니다. JVM Vendor들은 이 스펙을 기반으로 JVM을 구현했고, 구현체의 대표적인 예로 Oracle사의 Hotspot JVM, IBM사의 IBM JVM이 있습니다. Hotspot JVM의 사용률이 압도적으로 높고, 대부분 Hotspot JVM을 .. 2020. 10. 21.
Static 사용을 피해야 하는 이유 Java에는 static이라는 키워드가 존재하며, 이는 static으로 지시된 특정한 멤버가 해당 클래스의 인스턴스가 아니라 클래스 자체에 속해 있음을 나타냅니다. 즉, 클래스의 모든 인스턴스에서 공유되는 단 하나의 static member의 인스턴스가 생성되도록 명령하는 키워드입니다. 위 그림과 같이 모든 인스턴스들은 static 필드 혹은 메서드를 공유하게 됩니다. static에 대한 자세한 내용은 A Guide to the Static Keyword in Java를 참고하시고, 이 글에서는 어째서 많은 사람들이 static이 나쁘다고 말하는지 알아보도록 하겠습니다. 언뜻 보기에 static은 사용하기에도 편하고 효율적인 것처럼 보입니다. 예를 들어 어떤 클래스 내의 메서드를 매우 빈번하게 호출해야 .. 2020. 10. 20.
Lambda, 무엇이 단점일까? 무언가의 단점을 보완하여 새롭게 나타난 기술이라고 해서 기존의 모든 기능을 보완하고 대체할 수 있는 것은 아닙니다. 람다 역시 기존의 모든 코드를 대체하고자 등장한 것이 아니기 때문에, 람다를 쓰는 것보다 기존의 코드 방식을 사용하는 것이 더 나은 경우도 많습니다. 따라서 이 글에서는 람다의 단점에 대해 살펴보도록 하겠습니다. (1) 가독성 대부분 람다의 장점에서 빠지지 않는 것이 간결성과 가독성입니다. 그러나 아이러니하게도 단점에서 역시 가독성이 빠지지 않습니다. 람다를 알고 있는 사람이라면 가독성이 장점이 되겠지만, 람다에 대해 잘 모르는 사람에게는 가독성이 나쁜 코드가 되는 것입니다. 예를 들어 1부터 10까지 출력하는 아래와 같은 코드가 있습니다. for(int i=0; i System.out.p.. 2020. 10. 20.
Lambda 무엇이 좋을까? 자바 8에서 도입된 람다 표현식은 등장한 지 꽤 오랜 시간이 지났음에도 여전히 낯설고, 많은 개발자들이 왜 사용해야 하는지 제대로 알지 못하는 기능입니다. 이 글에서는 람다의 장점이 무엇인지 알아보며, 왜 람다를 사용해야 하는지 살펴보겠습니다. (1) 더 쉽고 간략한 iteration 일반적으로 컬렉션을 조회하는 다음과 같은 코드가 있다고 가정해 보겠습니다. List numList = Arrays.asList(1,2,3,4,5,6,7,8,9); for(int n : numList){ System.out.println(n); } 컬렉션을 사용할 때 람다를 사용한다면 아래와 같이 아주 간단하게 표현이 가능합니다. numList.forEach(System.out::println); 간단하고 코드가 훨씬 짧아지.. 2020. 10. 20.
자바7 업데이트 - 숫자 리터럴 구분자 자바 7부터는 숫자 리터럴의 숫자 사이에 언더스코어(_)를 사용할 수 있습니다. 이 구분자를 사용하면 의미 있는 숫자끼리 그룹화하는 것이 가능하며, 이로 인해 코드의 가독성이 높아집니다. int noUnderScore = 200000000; int useUnderScore = 200_000_000; long noUS = 9223372036854775800L; long useUS = 9_223_372_036_854_775_800L; 정수형 int의 기본 데이터 범위는 ~2147483648 ~ 2147483647이고, long의 경우에는 이보다 훨씬 큰 -9223372036854775808 ~ 9223372036854775807입니다. 따라서 큰 자릿수의 숫자일 경우 한눈에 파악하기가 어렵기 때문에 언더스코.. 2020. 10. 20.
[Refactoring] if문 Martin Fowler의 저서 Refactoring에는 다양한 "코드의 악취(Code Smell)"에 대해 설명되어 있습니다. Martin Fowler는 코드의 악취만 제거해도 썩 괜찮은 코드가 된다고 하고, 반대로 코드에서 악취가 느껴진다면 이는 시스템 내에 더 깊은 문제가 있음을 의미한다고 이야기합니다. 그러므로 리팩토링은 코드를 작성한 이후 반드시 수행해야 하는 절차라고 말합니다. 간혹 리팩토링을 수행하면 성능이 떨어진다고 주장하는 개발자들을 만날 수 있습니다. 리팩토링의 결과로 객체가 분리되거나 메서드 호출의 횟수가 증가하게 되며, 그 결과 실제로 메모리 사용량과 CPU 사용량이 모두 증가하기 때문입니다. 하지만 성능에 치명적인 영향을 주는, 예를 들어 파일 입출력이나 데이터베이스 작업과 같은 .. 2020. 10. 20.
Map의 Value 얻기 - KeySet => EntrySet Map에서 key 목록을 이용하여 value를 얻으려 할 때, 많은 개발자들이 다음과 같은 방법을 사용합니다. public void test(Map info){ for(String key : map.keySet()){ System.out.println(map.get(key)); } } 하지만 이 방법은, key를 얻어오고 다시 한번 map으로부터 value를 얻어오기 때문에 성능에 심각한 문제가 발생하게 됩니다. 하여 다음과 같은 방법으로 변경하여야 합니다. public void test(Map info){ for(Map.Entry entry : info.entrySet()){ System.out.println(entry.getValue()); } } 2020. 10. 12.
HashMap의 동작방법 이 아티클은 Jackson Joseraj가 DZone에 게시한 How HashMap Works in Java 에 대한 번역물입니다. HashMap이 내부적으로 어떻게 동작하는지에 대한 질문은 면접 때에 가장 인기 있는 질문입니다. 대부분의 사람들은 HashMap을 사용할 줄 알거나 HashMap과 HashTable의 차이는 알고 있습니다. 그러나 "HashMap이 내부적으로 어떻게 동작하는가?"에 대한 질문에 대해서는 어려워합니다. 질문에 대한 해답은 해싱 원리에 기반하여 작동한다는 것이지만 말처럼 간단한 문제는 아닙니다. 해싱은 쉽게 반복하는 알고리즘을 사용하면서 유니크한(유일무이한) 코드를 변수 또는 속성에 할당하는 매커니즘으로, 해싱 메커니즘에 같은 객체를 적용시켰을 때, 항상 같은 hashcode.. 2020. 10. 12.