IT개발및프로그래밍/자바

리터럴(Literal)이란? 프로그래밍에서 리터럴의 역할과 종류, 그리고 값과의 차이점까지!

devgodmj 2024. 11. 11. 11:07

 

  • 리터럴이란?
    리터럴은 코드에서 고정된 값을 표현하는 방식입니다. 예를 들어 숫자 10, 문자열 "Hello", 논리값 true등은 모두 리터럴입니다. 리터럴은 값이 변하지 않고 그대로 사용되기 때문에 상수처럼 활용됩니다.

  • 정수 리터럴 (Integer Literal)
    정수형 데이터에 사용하는 리터럴로, int와 long 타입에서 주로 쓰입니다. int 타입이 기본이며, long 타입으로 지정하려면 값 뒤에 L을 붙입니다.
int age = 25;      // 정수 리터럴 25
long distance = 1000L;  // long 타입 정수 리터럴 1000L
데이터타입 int형 long형
크기 32bit(=4byte) 64bit(=8byte)
범위 범위: -2147483648 ~ 2147483647   범위:  -9223372036854775808 ~ 9223372036854775807
특징   int형에 비해 많은 메모리를 필요로 하며 속도가 상대적으로 느림
  • 실수 리터럴 (Floating-Point Literal)
    부동소수점 데이터에 사용하는 리터럴로, float와 double 타입에서 쓰입니다. 기본적으로 double 타입이며, float 타입으로 지정하려면 값 뒤에 F를 붙입니다.
double pi = 3.14159;   // 실수 리터럴 (double)
float rate = 0.05F;    // float 타입 실수 리터럴
  • 문자 리터럴 (Character Literal)
    단일 문자 데이터를 나타내며, char 타입에서 사용됩니다. 작은 따옴표(' ')로 감싸 표현합니다.
char initial = 'A';    // 문자 리터럴 'A'
char digit = '1';      // 문자 리터럴 '1'
  • 문자열 리터럴 (String Literal)
    문자열 데이터를 표현하는 리터럴로, String 타입에 사용됩니다. 큰 따옴표(" ")로 감싸서 표현하며, 여러 문자를 한 번에 나타낼 수 있습니다.
String greeting = "Hello, World!"; // 문자열 리터럴
String name = "John";               // 문자열 리터럴

 

  • 논리 리터럴 (Boolean Literal)
    논리값을 나타내는 리터럴로, boolean 타입에서 사용됩니다. true 또는 false 두 가지 값만 가질 수 있습니다.
boolean isAdult = true;   // 논리 리터럴 true
boolean isStudent = false; // 논리 리터럴 false

 


  • 리터럴과 메모리 관리
    리터럴은 프로그램 실행 중 메모리에 고정된 값으로 저장됩니다. 특히 문자열 리터럴(String Literal)의 경우, 자바에서는 문자열 풀(String Pool)이라는 특별한 메모리 영역에 저장됩니다. 이 문자열 풀은 메모리를 효율적으로 관리하는 역할을 합니다. 동일한 문자열이 여러 번 등장할 경우 메모리에서 같은 주소를 참조하도록 하여 메모리 사용을 절약합니다.
public class StringLiteralExample {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "Hello";
        
        // 각각의 문자열의 identityHashCode 출력
        System.out.println("str1의 해시코드: " + System.identityHashCode(str1));
        System.out.println("str2의 해시코드: " + System.identityHashCode(str2));
        
        // 주소 비교
        if (str1 == str2) {
            System.out.println("str1과 str2는 같은 메모리 주소를 참조합니다.");
        } else {
            System.out.println("str1과 str2는 다른 메모리 주소를 참조합니다.");
        }
        System.out.print("str1 == str2? ");
        System.out.println(str1 == str2); // true, 같은 문자열 풀에 저장된 "Hello" 참조
    }
}

 

자바에서는 변수나 객체의 메모리 주소를 직접 가져오는 방법은 없습니다. 자바는 메모리 관리와 객체의 위치를 JVM이 관리하므로, C/C++처럼 메모리 주소를 직접 다룰 수 없도록 설계되었습니다. 그러나 객체가 동일한 메모리 위치에 있는지 확인하는 용도로는 System.identityHashCode()를 사용할 수 있습니다. 이는 객체의 고유한 해시 코드(주소와 유사하게 사용할 수 있는 값)를 반환하여, 객체의 메모리 위치를 비교하는 데 유용합니다.

 

System.identityHashCode() 사용하여 str1과 str2가 동일한 메모리 위치에 있으며 str1과 str2는 동일한 문자열 "Hello"를 참조 한다는 것을 확인 합니다.. 자바는 문자열 리터럴을 최적화하여 중복된 문자열이 메모리에 반복적으로 생성되는 것을 방지합니다.


  • 리터럴의 중요성
    리터럴은 자바와 같은 언어에서 데이터를 직관적으로 표현할 수 있게 해줍니다. 다양한 리터럴을 사용하여 코드에 필요한 값들을 손쉽게 설정할 수 있고, 데이터 타입에 맞는 리터럴을 사용함으로써 프로그램이 예측 가능한 방식으로 작동하도록 합니다.
    • 직관적 표현: 코드에서 데이터의 의미를 쉽게 파악할 수 있어 가독성이 좋아집니다.
    • 타입 안정성: 데이터 타입에 맞는 리터럴을 사용함으로써 불필요한 형 변환이나 오류를 줄일 수 있습니다.
    • 효율적 메모리 관리: 자바는 문자열 리터럴의 경우 문자열 풀을 이용하여 메모리 관리를 최적화합니다.

  • 정리
    • 리터럴은 프로그래밍에서 값 그 자체를 나타내는 기본 요소이다.
    • 자바에서는 정수, 실수, 문자, 문자열, 논리 리터럴을 통해 다양한 데이터를 표현 할 수 있다.
    • 특히 문자열 리터럴의 경우 자바에서 효율적인 메모리 관리를 위해 문자열 풀을 사용하므로 동일한 문자열을 여러 번 사용할 때 메모리 사용이 최적화된다.

리터럴과 값의 차이

리터럴과 값은 유사하게 보이지만, 프로그래밍에서 표현되는 방식과 의미에서 차이가 있습니다.

  • 리터럴: 코드에서 고정된 값을 직접 나타내는 구체적인 표현입니다. 소스 코드에 고정된 형태로 등장하여 컴파일러가 이를 인식하고, 해당 데이터 타입에 맞게 메모리에 할당합니다. 예를 들어 10, "Hello", true 같은 것은 모두 리터럴입니다.
  • : 프로그램 실행 중에 메모리에 실제 저장되는 데이터 그 자체입니다. 값은 리터럴로 나타낼 수도 있지만, 반드시 리터럴로만 생성되는 것은 아닙니다. 예를 들어 변수나 상수에 저장될 수 있으며, 연산이나 함수 호출 결과로도 생성됩니다.
int a = 10;          // 10은 정수 리터럴
int b = a + 5;       // a + 5의 결과는 값
  • 10은 리터럴입니다. 코드에서 특정 값을 그대로 표현하고 있기 때문입니다.
  • a는 변수이며, 10이라는 을 참조합니다.
  • a + 5의 결과는 입니다. 5는 리터럴이지만, a + 5는 연산을 통해 나온 값이므로 리터럴로 볼 수 없습니다.

즉, 리터럴은 코드를 작성할 때 눈에 보이는 특정 값의 표현이고, 값은 프로그램 실행 중 실제로 메모리에 저장되는 데이터입니다.