본문 바로가기

Programing/JVM(Java, Kotlin)

(96)
[Java] String: literal vs new 자바 기초중에 하나이다. 자바에는 문자열을 생성하는 방법이 크게 두가지가 있다. 리터럴(literal) 방식이고 다른 하나는 new 생성자를 이용한 방법이다. 코드로 설명하는 것이 이해가 빠를 것 같다. String str1 = "a"; String str2 = new String("a"); str1 이 리터럴 방식이고, str2 가 생성자를 이용한 방식이다. 퀴즈. 둘 중에 안티패턴은? 답부터 이야기하면 바로 생성자를 이용한 방식이다. 왜 그런지는 아래에서 살펴 볼 수 있다. String Internal 위의 자바코드를 읽을 수 있는 바이트 코드로 나타내보면 아래와 같다. ldc "a" astore_1 new java/lang/String dup ldc "a" invokespecial java/lang..
[Java] hashCode() internal : String, Object 질문: String 간 비교시 헸길리는 부분이있어서 질문 드립니다. String a = "a"; String b = new String("a"); 이와 같은 케이스는 주소가 다르게 생성되던데 이런 케이스 때문에 무조건 equals()메소드로 비교하는것인가요?? 답변부탁드립니다. 질문에 대한 답부터 하면 "맞다."이다. 하지만 이 글을 쓰게 된 이유에는 '주소'라는 말이 있었기 때문이다. 혹시 주소가 hashCode() 돌려주는 값을 의미했는지 물어보니 그렇다고 한다. String 클래스의 hashCode (보통) String 클래스의 hashCode() 는 Object의 hashCode()를 사용하지 않고 오버라이딩해서 구현한다. 버전에 따라 구현 방법은 바뀌었지만 자바 8에서는 public final ..
[Java] 한 영역(scope)에서 변수를 두 번 선언할 수 없는 이유? 한 카페에 올라왔던 질문이다. 코드 아래의 코드가 왜 동작하지 않는지에 대한 문의이다. public class DuplicationVarDeclare { public static void main(String[] args) { int i = 100; byte b = (byte) i; System.out.println(b); int i = 300; byte b = (byte) i; System.out.println(b); int k = -2; b = (byte) k; System.out.println(b); System.out.println(Integer.toBinaryString(k)); } } 질문내용: 왜 TYPE을 두번 선언하면 안되나요? 예제 2-13을 보면, I와 b는 처음에만 타입 선언이 되어..
[Java] 자바 컴파일러 - parse(파스) 이전에 자바 컴파일러의 컴파일 단계라는 글을 쓴 적이 있다. 사실은 그 컴파일 이전에 구문 분석 트리를 만드는 작업을 수행한다. 이 글은 그 과정에 대해 다룬다. 자바에서는 JSP등에서 Runtime 중 동적 컴파일링을 할 수있는 도구를 제공한다. ToolProvider 라는 서비스 로더를 통해 시스템 자바 컴파일러를 가져올 수 있다. 아래 코드는 자바 컴파일러를 가져오는 문장이다. import javax.tools.JavaCompiler; import javax.tools.ToolProvider; public class JavaCompilerTest { public static void main(String[] args) { final JavaCompiler compiler = ToolProvider...
[Java] Effective Java : Item 36 EnumSet, 유스케이스 in Java 8 한국어판: 아이템 36. 비트 필드 대신 EnumSet을 사용하라 (6장) Win32 윈도우 프로그래밍을 해본 사람은 알겠지만 비트 연산의 조합으로 만드는 여러가지 윈도우 API를 많이 사용한다. 예를 들면 AnimateWindow 함수는 3번째 인자(dwFlags)로 비트 연산자 OR(|)로 여러가지 조합된 상태를 입력을 할 수 있다. // WinUser.h #define AW_HOR_POSITIVE 0x00000001 #define AW_HOR_NEGATIVE 0x00000002 #define AW_VER_POSITIVE 0x00000004 #define AW_VER_NEGATIVE 0x00000008 #define AW_CENTER 0x00000010 #define AW_HIDE 0x00010000..
[Java] Stream in depth : Stream & Pipeline 스트림의 내부 구조 및 원리를 확인하다 두서없이 정리해두었다. 스트림의 사용에 대한 내용이라면 자바 기본서에 있는 것을 보는 것이 좋을 것이다. BaseStream 인터페이스 BaseStream 인터페이스는 위의 다이어그램에 적혀있는 메서드들을 가지고 있는 인터페이스이다. try with resource에 유용하게 사용가능한 AutoCloseable 인터페이스를 상속하고 있다. public interface BaseStream extends AutoCloseable 또한 제너릭 인자 두 개를 갖는데 하나는 스트림 원소들의 타입(T)이고 나머지는 BaseStream을 구현하는 또 다른 타입(S)이다. S는 BaseStream - 즉 자기자신을 bounded 하였기 때문에 BaseStream을 상속하고 있는..
[Sonarqube] Functional Interfaces should be as specialised as possible 함수형 인터페이스는 가능하면 스페셜한 놈을 찾아써라... Core Java SE 9 For the impatient (가장 빨리 만나는 코어자바9)책에도 한 페이지지만 분명 언급되어 있었다. (158쪽) 기본 타입 int, long, double에 특화된 함수형 인터페이스 34개... 이것을 사용을 하면 오토박싱을 줄일 수 있어서 성능에 향상을 줄 수 있다. Current Interface Preferred Interface Function IntFunction Function LongFunction Function DoubleFunction Function DoubleToIntFunction Function DoubleToLongFunction Function LongToDoubleFunction Fu..
[javac] 자바 컴파일러: 컴파일 단계 질문: - 질문 제목 : 클래스의 순서는 어떤 기준으로 정하나요?? - 질문 내용 : main메서드에 Time객체를 생성하고 참조변수 t를통해 시간을 호출하는데 Time 객체를 생성하는 클래스가 선언된곳보다 뒤에 있어도 상관 없는건가요??? 코드는 위에서 아래로 진행되는거 아닌가요??? public class Exe5 { public static void main(String[] args) { Time t = new Time(); t.hour = 12; t.minute = 34; t.second = 56; System.out.println(t.hour); System.out.println(t.minute); System.out.println(t.second); } } class Time { int hou..