EEALL@ONCE

☕ 자바 자료형 - String : 문자열 자료형 (1 ) : 리터럴 방식 / 인스턴스 방식 본문

언어💻/자바☕

☕ 자바 자료형 - String : 문자열 자료형 (1 ) : 리터럴 방식 / 인스턴스 방식

올엣원스 2023. 8. 1. 17:40
728x90

String : 문자열 자료형

 

  • 쌍따옴표로 둘러쌈
  • 참조 자료형
  • 리터럴 방식 / 인스턴스 방식 모두 가능

리터럴 방식:

  • 문자열 리터럴을 사용하여 String 변수를 선언하고 초기화
  • String str1 = "Hello World!";
  • == 을 사용하여 비교 가능 
	String hl1 = "Hello";
        String hl2 = "Hello";
        boolean bool1 = hl1 == hl2; // true

인스턴스 생성 방식:

  • new 키워드를 사용하여 String 클래스의 인스턴스를 생성
  • String str4 = new String("Hello World");
  • 인스턴스와 비교하려면 .equals 메소드를 사용해야 함 ( 문자열은 인스턴스 비교 방식을 사용해야 함)
        String hl1 = "Hello";
        String hl2 = "Hello";
        String hl3 = new String("Hello");
        String hl4 = new String("Hello");
        boolean result1 = hl3 == hl4; // false 
        boolean result2 = hl1.equals(hl2); // true

인스턴스와 비교하려면 .equals()를 써야할까?

 

🐭 :  인스턴스 경우 서로 다른 메모리 주소를 가지고 있습니다. 따라서, ==으로 비교하면 서로 다른 주소 값을 가지고 있기에 false를 반환합니다.


1.== 연산자:

  • == 연산자는 두 객체의 레퍼런스(메모리 주소)를 비교합니다.
  • 즉, 두 변수가 같은 객체를 참조하는지 여부를 확인합니다.
  • 예를 들어, String str1 = "Hello";과 String str2 = "Hello";를 선언하고 str1 == str2를 비교하면, true가 반환됩니다. 이는 str1과 str2가 모두 문자열 리터럴인 "Hello"를 가리키기 때문에 동일한 객체를 참조합니다.



2. `equals()` 메서드:
   - `equals()` 메서드는 객체의 내용을 비교하는 데 사용됩니다.
   - 기본적으로 `equals()` 메서드는 `==` 연산자와 동일하게 작동합니다.
   - 그러나 많은 클래스들은 `equals()` 메서드를 재정의하여 객체의 내용을 비교하도록 구현합니다.
   - 예를 들어, `String` 클래스는 `equals()` 메서드를 재정의하여 문자열의 내용을 비교하도록 구현합니다. 따라서, `String str1 = "Hello";`과 `String str2 = "Hello";`를 선언하고 `str1.equals(str2)`를 비교하면, `true`가 반환됩니다. 이는 `str1`과 `str2`가 내용이 동일한 문자열을 가지고 있기 때문입니다.

요약하면, `==` 연산자는 두 변수가 같은 객체를 가리키는지를 확인하는 데 사용되며, `equals()` 메서드는 객체의 내용을 비교하는 데 사용됩니다. 

 

 


근데 그럼 왜 리터럴은 서로 다른 주소 값을 가지지 않을까? 

 

🐭 :  리터럴은 중복으로 저장되지 않고, 하나만 저장하고 그 곳은 같이 바라보게 합니다. 

String constant pool(문자열 상수 풀)은 Java에서 문자열 리터럴을 관리하는 특별한 메모리 영역입니다. Java의 String constant pool은 문자열 리터럴이 중복 저장되지 않도록 하고, 문자열을 재사용하여 메모리를 효율적으로 관리하는 역할을 합니다.

일반적으로 Java에서 문자열 리터럴은 쌍따옴표(`" "`)로 둘러싸인 문자열을 의미합니다. 예를 들어 `"Hello"`와 `"Java"`는 모두 문자열 리터럴입니다. Java에서는 코드 내에 문자열 리터럴이 등장할 때마다 이를 String constant pool에 저장합니다.

String constant pool은 다음과 같은 특징을 갖습니다:

1. 중복된 문자열 리터럴은 하나만 저장됨: 같은 문자열 리터럴이 여러 번 사용되더라도 String constant pool에는 하나의 객체만 저장됩니다. 이렇게 중복을 허용하지 않음으로써 메모리를 절약합니다.

2. 문자열 리터럴은 변경 불가능(immutable): String constant pool에 저장된 문자열 리터럴은 변경이 불가능합니다. 즉, 한 번 생성된 문자열은 수정할 수 없으며, 수정하려면 새로운 객체를 생성해야 합니다.

3. 자동 생성: 문자열 리터럴을 사용하여 변수를 초기화하거나, `new` 키워드를 사용하지 않고 문자열을 생성하면 자동으로 String constant pool에 문자열이 저장됩니다.

String constant pool을 사용함으로써 동일한 문자열을 가진 객체가 중복 생성되는 것을 막아 메모리를 효율적으로 관리하고, 문자열 비교와 같은 연산에서 성능을 향상시킵니다. 하지만, `new` 키워드를 사용하여 인스턴스 생성 방식으로 문자열을 생성하면 String constant pool이 적용되지 않고 매번 새로운 객체가 생성됩니다.

 

 


참고로 instance란 

🐭 : 

인스턴스(Instance)는 객체 지향 프로그래밍(OOP)에서 중요한 개념으로, 클래스(Class)를 기반으로 실제 메모리에 할당된 구체적인 객체(Object)를 의미합니다.

클래스는 객체를 만들기 위한 템플릿 또는 설계도로, 데이터와 메서드를 포함하는 멤버들의 집합입니다. 클래스 자체는 실제 데이터를 가지지 않으며, 객체를 생성하기 위한 청사진 역할을 합니다.

이때, 클래스를 바탕으로 생성된 실체화된 개체를 인스턴스라고 합니다. 인스턴스는 클래스의 구조에 따라 메모리에 할당된 실체입니다. 이렇게 인스턴스는 클래스의 객체가 실제로 메모리에 존재하는 것을 의미합니다.

예를 들어, 자동차 설계도(클래스)를 가지고 실제로 제작된 실제 자동차들(인스턴스)은 각각 다른 속성(색상, 모델, 번호 등)을 가지고 있으며, 서로 독립적으로 동작합니다.

자바에서 클래스를 정의한 후, `new` 키워드를 사용하여 클래스의 인스턴스를 생성할 수 있습니다. 인스턴스를 생성하는 것은 클래스의 템플릿을 바탕으로 메모리에 실제 데이터를 할당하는 작업을 의미합니다. 생성된 인스턴스는 클래스에 정의된 속성과 메서드를 사용할 수 있으며, 각 인스턴스는 서로 독립적으로 동작합니다.

예를 들어, 다음은 `Car` 클래스를 정의하고, `Car` 클래스를 기반으로 `car1`, `car2`라는 두 개의 인스턴스를 생성하는 예제입니다:

public class Car {
    String model;
    String color;

    public void start() {
        System.out.println("The car is starting.");
    }

    public void stop() {
        System.out.println("The car is stopping.");
    }
}

public class Main {
    public static void main(String[] args) {
        Car car1 = new Car();
        car1.model = "SUV";
        car1.color = "Blue";
        car1.start();

        Car car2 = new Car();
        car2.model = "Sedan";
        car2.color = "Red";
        car2.stop();
    }
}



위 코드에서 `Car` 클래스를 정의하고, `Car` 클래스를 기반으로 `car1`과 `car2`라는 두 개의 인스턴스를 생성합니다. 각 인스턴스는 `Car` 클래스의 멤버인 `model`, `color` 속성을 가지고 있으며, `start()`와 `stop()` 메서드를 호출하여 동작합니다. 인스턴스는 각각 독립적으로 존재하며, 자동차의 모델과 색상 등을 개별적으로 가집니다.


 

728x90