String 클래스를 통해 문자열 생성 방법

- String 클래스는 기본형이 아니라 참조형이다.

- 문자열은 매우 자주 사용되어 자바 언어에서는 아래 1번과 같이 작성해도 new String("hello")와 같이 변경해준다.

1. String str1 = "hello";
2. String str1 = new String("hello");

 

String 클래스 - 비교

동일성(Identity) : == 연산자를 사용해서 두 객체의 참조가 동일한지 확인

동등성(Equality) : equals() 메서드를 사용하여 두 객체가 논리적으로 같은지 확인

String str1 = "hello";
String str2 = new String("hello");
String str3 = new String("hello");

System.out.println(str1 == str2); // false
System.out.println(str2 == str3); // false
System.out.println(str1.equals(str2)); // true
System.out.println(str2.equals(str3)); // true

 

문자열 풀

- String str = "hello"와 같이 문자열  리터럴을 사용하는 경우 자바는 메모리 효율성과 최적화를 위해 풀을 사용한다.

- 자바가 실행되는 시점에 문자열 리터럴이 있으면 문자열 풀에 String 인스턴스를 만들어둔다.

- 같은 문자열이 있으면 String 인스턴스를 만들지 않고 동일한 문자열에 인스턴스를 찾고 해당 인스턴스를 참조한다.

String str1 = "hello";
String str2 = "hello";

System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true

불변 객체

1. 변경이 필요한 경우 기존 값을 변경하지 않고 새로운 결과를 만들어서 반환한다.

2. String 내부의 값을 변경할 수 있다면 기존에 문자열 풀을 통해 같은 문자를 참조하는 변수의 String값이 변경되는 문제가 생길 수 있음

// 1번 예제
String str1 = "hello";
str1.concat("java");
String str2 = str1.concat(" java");

System.out.println("str1 = " + str1); // hello
System.out.println("str2 = " + str2); // hello java

// 2번 예제
String str3 = "hello";
String str4 = "hello";
str2 = "bye";

System.out.println("str3 = " + str3); // hello
System.out.println("str4 = " + str4); // bye

 

StringBuilder 가변 String

- 내부의 값을 변경할 수 있는 String

- 변경된 값을 사용할때 불변 객체와 다르게 새로운 객체를 생성하지 않는다.

- 내부의 값을 변경할때마다 새로운 객체를 생성하는게 아니기 때문에 성능과 메모리 측면에서 효율적이다.

불변 객체 값 변경

// 문자열 변경시 동작 순서
String str = String("A") + String("B") + String("C") + String("D");

// 1
String str = new String("AB") + String("C") + String("D");

// 2
String str = new String("ABC") + String("D");

// 3
String str = new String("ABCD");

- 1번과 2번에서 생성된 new String("AB")과 new String("ABC")은 사용되지 않는다.
- 이후에 GC의 대상이 된다.

가변 객체 값 변경

 StringBuilder sb = new StringBuilder();
 
 sb.append("A");
 sb.append("B");
 sb.append("C");
 sb.append("D");
 
 System.out.println("sb = " + sb); // ABCD

 

'인강 > 자바(중급1편)' 카테고리의 다른 글

불변 객체  (0) 2024.05.06
Object 클래스  (0) 2024.04.23

기본형과 참조형

기본형 : 하나의 값을 여러 변수에서 절대로 공유하지 않는다.

참조형 : 하나의 객체를 참조값을 통해 여러 변수에서 공유할 수 있다.

int a = 10;
int b = a;

System.out.println("a : " + a); // 10
System.out.println("b : " + b); // 10

b = 20;

System.out.println("a : " + a); // 10
System.out.println("b : " + b); // 20

Address addressA = new Address("seoul");
Address addressB = addressA;

System.out.println("addressA : " + addressA.getAddress()); // seoul
System.out.println("addressB : " + addressB.getAddress()); // seoul

addressB.setAddress("busan");

System.out.println("addressA : " + addressA.getAddress()); // busan
System.out.println("addressB : " + addressB.getAddress()); // busan

 

사이드 이펙트(Side Effect)

특정 부분에서 발생한 변경이 예상치 못한 다른 부분에 영향을 미치는 경우

// addressB의 값만 바꾸기를 원했지만 addressA값도 변하는 경우

Address addressA = new Address("seoul");
Address addressB = addressA;

System.out.println("addressA : " + addressA.getAddress()); // seoul
System.out.println("addressB : " + addressB.getAddress()); // seoul

addressB.setAddress("busan");

System.out.println("addressA : " + addressA.getAddress()); // busan
System.out.println("addressB : " + addressB.getAddress()); // busan

불변객체(Immutable Object)

- 객체 생성 이후 내부의 상태가 변하지 않는 객체

- 필드의 값을 final로 선언

- setter를 구현하지 않음

public class ImmutableAddress {

    private final String value; // final 사용

    public ImmutableAddress(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
    
    // setter 구현 X
    
}

 

'인강 > 자바(중급1편)' 카테고리의 다른 글

String 클래스  (0) 2024.05.15
Object 클래스  (0) 2024.04.23

java.lang 패키지

- lang은 Language의 줄임말이다

- 자바 언어를 이루는 가장 기본이 되는 클래스들을 보관하는 패키지이다

- 모든 자바 애플리케이션에서 자동으로 임포트 되어 있어서 임포트 구문을 작성하지 않아도 된다.

java.lang 패키지의 대표적인 클래스들

Object : 모든 자바 객체의 부모 클래스

String : 문자열

Integer , Long , Double : 래퍼 타입, 기본형 데이터 타입을 객체로 만든 것

Class : 클래스 메타 정보

System : 시스템과 관련된 기본 기능들을 제공

 

Object 클래스

- 모든 클래스의 최상위 부모 클래스는 항상 Object 클래스를 상속받는다.

- 상속 받을 부모 클래스가 없으면 묵시적으로 Object 클래스를 상속 받는다.

// extends Object는 생략하는것을 권장
public class Parent extends Object {

    public void parentMethod(int num) {
        System.out.println("Parent.parentMethod");
    }
}

public class Child extends Parent {
    
    public void childMethod () {
        System.out.println("Child.childMethod");
    }
}

// 최상위 부모 클래스 : Object
// 부모 클래스 : Parent
// 자식 클래스 : Child

 

Object클래스가 최상위 부모 클래스인 이유

- 공통 기능 제공

  - 모든 객체에서 toString(), equals(), getClass()같은 공통 기능을 제공해준다.

 

 

'인강 > 자바(중급1편)' 카테고리의 다른 글

String 클래스  (0) 2024.05.15
불변 객체  (0) 2024.05.06

+ Recent posts