본문 바로가기

Java5

Java에서 String은 왜 불변일까? Java에서 String은 불변(Immutable) 객체이다. 불변 객체란 무엇일까? 불변 객체란, 객체가 생성된 후 내부의 상태가 변하지 않고 계속 유지되는 객체를 말한다. 즉, 변수에 객체가 한 번 할당되면, 해당 객체의 참조를 변경할 수도, 내부의 상태를 수정할 수도 없는 것이다. Java에서 String 객체는 immutable, 즉 '불변성'이라는 특성을 가지는데, Java 언어를 디자인한 사람들은 왜 그런 선택을 한 것일까? 크게 5가지 이유를 생각해 볼 수 있다. 1. String Pool String이 불변이기 때문에 String Pool도 존재할 수 있다. 어떤 프로그래밍 언어라도 String 타입은 매우 빈번하게 사용된다. 그래서 Java에서는 String Pool이라는 공간에 Stri.. 2020. 7. 21.
String Constant Pool이란? | Java String Pool Java에서 String 객체를 생성하는 방법은 2가지가 있다. 첫번째는 String literal, 즉 큰 따옴표("")를 사용하는 것이고, 두번째는 new 연산자를 사용하는 것이다. 두 방법에는 어떤 차이가 있을까? 간단한 테스트를 작성해 결과를 살펴보았다. String literal로 생성한 객체는 내용이 같다면 같은 객체, 즉 동일한 메모리 주소를 가리키고 있다. 하지만 new 연산자로 생성한 String 객체는 내용이 같더라도 개별적인 객체임을 알 수 있다. 여기에는 어떤 원리가 숨어있는지, JVM 구조와 함께 이해해 보도록 한다. Java String Pool 흔히 new 연산자로 String 객체를 생성하지 않는 것이 좋다는 말을 볼 수 있다. String literal로 생성하면 해당 St.. 2020. 7. 20.
JVM 아키텍처 / Garbage Collection 모든 Java 애플리케이션은 JVM 환경에서 작동된다. 본 포스트에서는 JVM 아키텍처와 구성 요소, 그 중에서도 특히 Garbage Collection(이하 GC)와 관련된 Heap area에 대해 자세히 알아보고, GC의 기본적인 원리에 대해서도 정리해보고자 한다. JVM 아키텍처 JVM은 Java Virtual Machine의 줄임말이며, Java Compiler에 의해 컴파일되어 생겨난 Bytecode(.class 파일)를 OS에 맞게 해석하고 실행하는 역할을 수행한다. 즉 "Java에서 프로그램을 실행한다"는 것은, 컴파일 과정을 통하여 생성된 class 파일을 JVM으로 로딩하고 Bytecode를 해석(interpret)하는 과정을 거쳐 메모리 등의 리소스를 할당하고 관리하며 정보를 처리하는 .. 2019. 4. 5.
JVM, JRE, 그리고 JDK의 개념 JVM - JVM (Java Virtual Machine)은 추상적인(abstract) 머신이다. 즉 JVM이 가상(virtual) 머신인 것은 그것이 물리적으로는 존재하지 않기 때문이다. - JVM은 Java 바이트코드가 실행될 수 있는 런타임 환경을 제공하는 명세(specification)다. (ex. HotSpot: JVM 구현체) - Java가 아닌 다른 언어(ex. Kotlin, Scala, Groovy 등)로 쓰여진 프로그램도 Java 바이트코드로 컴파일 되어 JVM이 실행할 수 있다. - JVM은 다양한 하드웨어와 소프트웨어 플랫폼에서 이용할 수 있다. JVM, JRE, JDK는 플랫폼 의존적인데, 각 OS의 설정이 서로 다르기 때문이다. 하지만 Java 언어 자체는 플랫폼 독립적이다. - .. 2019. 2. 4.
POJO 이해하기 이 글은 spring.io의 Understanding POJOs를 번역한 것입니다. POJO란 Plain Old Java Object의 줄임말이며, 프레임워크 확장에 의해 엉망진창이 되지 않는, 순수한 Java 객체(인스턴스)를 의미한다.만약 JMS로부터 메시지를 받고자 한다면, MessageListener interface를 구현한 클래스를 다음과 같이 작성해야 할 것이다. public class ExampleListener implements MessageListener { public void onMessage(Message message) { if (message instanceof TextMessage) { try { System.out.println(((TextMessage) message)... 2018. 12. 12.