이 질문은 오래된 질문이지만 아직까지도 자바개발을 하는 개발자들이 자주 묻는 질문입니다. 여러가지 이유가 있지만 메모리, 동기화, 자료구조에 대한 이해도에 따라 대답이 달라지기도 합니다. 주요 이유를 알아보겠습니다. 1. String Pool에 대한 필요 String Pool은 자바의 힙영역에서 특수한 저장영역입니다. String 객체가 생성되고 만약 이미 기존에 같은 String 객체가 존재한다면 참조값은 새로운 객체가 아닌 기존의 String 객체로 정해지게 됩니다. 다음의 코드는 heap영역에 하나의 String 객체만을 만들게 될 것입니다. String string1 = “abcd”; String string2 = “abcd”; 원리는 아래의 그림과 같습니다. 문자열을 변경할 수 없는 경우, 하나..
모든 자바 개발자들은 JRE(Java Runtime Environment)에 의해 자바 바이트코드가 실행된다고 알고있습니다. 하지만 많은 개발자은 JRE가 JVM(Java Virtual Machine)의 구현이라는 것은 알지 못하는 것 같습니다. JVM은 컴파일된 자바 바이트 코드를 interpret하고 분석하고 실행합니다. 개발자로서 JVM의 아키텍쳐를 아는 것은 매우 중요합니다. 개발자가 코드를 더욱 효율적으로 작성할 확률을 올려줄 것입니다. 해당 포스팅에서는 자바에서의 JVM 아키텍쳐에 대한 깊은 이해와 다른 컴포넌트들을 알아볼 것입니다. JVM 이란..? 가상머신이란 물리적 머신을 구현한 소프트웨어입니다. 자바는 애초에 WORA(Write Once Run Anywhere, 한번 쓰고 언제어디서나 ..
다음 큰 숫자 문제 설명 자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다. 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다. 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다. 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다. 예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다. 자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요. 제한 사항 n은 1,000,000 이하의 자연수 입니다. 입출력 예 n result 78 83 15 23 입출력 예 설명 입출력 예#1 문제 예시와 같습니다. 입출력 예#2 15(1111)의..
Lombok - 자바 개발시 자주 사용하는 getter/setter, toString(), 생성자 등을 자동으로 생성해주는 라이브러리. - @Data, @Getter, @Setter, @ToString 등의 어노테이션 방식을 이용한다. - @Data 어노테이션은 모든 요소를 추가하는것. 즉 변수선언만 해놓고 getter/setter, toString, 생성자, equals 메소드 hashcode 등 lombok으로 생성할 수 있는 모든 메소드를 생성시킴. https://mvnrepository.com/ Maven Repository: Search/Browse/Explore Camel Async Http Client support Last Release on Oct 20, 2019 mvnrepository..
멤버변수 - 클래스 변수라고도 하며 메소드에 선언된 것이 아닌 클래스의 필드에 선언된 변수. 로컬변수 - 메소드가 실행될 때만 사용되는 변수. 메소드 내부에 선언되어 있음. 람다식에서 클래스의 멤버변수 사용 - 람다식에서 this는 내부적으로 생성되는 익명객체의 참조가 아닌 람다식을 실행한 객체의 참조이다. - 바깥 객체와 중첩 객체의 참조를 얻어 필드값을 출력하는 예제. @FunctionalInterface public interface MyFunctionalInterface { public void method(); } public class UsingThis { public int outterField = 10; class Inner{ int innerField = 20; //Inner 클래스 멤버..
함수적 인터페이스 (@FunctionalInterface) - 모든 인터페이스는 람다식의 타겟타입으로 사용할 수 없다. (= 모든 인터페이스가 람다식으로 대입될 수 없다.) - 람다식은 하나의 메소드를 구현하는 것이기 때문에 인터페이스에는 구현될 단 하나의 추상메소드만 존재해야한다. - 그러기 위해서 사용하는 방식이 함수적 인터페이스. 인터페이스에 단 하나의 추상메소드만 있어야한다. - @FunctionalInterface 어노테이션은 컴파일러가 어노테이션이 있는 인터페이스의 추상메소드 개수를 세어 2개 이상인 경우 컴파일 오류를 낸다. - 그러나 어노테이션이 없다고 함수적 인터페이스가 아니라고는 하지 않는다. 단지 개발자의 실수를 방지하기 위한 체킹용 어노테이션이다. 매개변수와 리턴값이 없는 람다식 @..
더 맵게 문제 설명 매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다. 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2) Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다. Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요. 제한 사항 -..
주식가격 문제 설명 초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,000 이하인 자연수입니다. prices의 길이는 2 이상 100,000 이하입니다. 입출력 예 prices return [1, 2, 3, 2, 3] [4, 3, 1, 1, 0] 입출력 예 설명 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다. 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다. 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다. 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다. 5초 시점..