상세 컨텐츠

본문 제목

Object Class, 불변객체, String

java

by nownow 2024. 3. 30. 22:47

본문

Object 객체는 모든 자바 객체의 상위 객체로서 Object Class로 배열을 생성하면 모든 객체를 담을 수 있다.

하지만 자식 객체의 메서드들을 알고 있지는 않기 때문에 자식 객체의 메서드를 사용하려면 명시적 다운 캐스팅必

 

toString()과 같은 Object Class에도 정의된 부분은 그냥 사용 가능

오버라이딩 시 Generator(shift+INS) 눌러 사용하자.

 

public class ObjectPrint{
	public void print(Object obj){
    	System.out.println(
    }
}

정적 의존관계 -> Obejct 객체와 연관 돼 있을 것이란 것. (일반적으로 표현하는 의존관계)

동적 의존관계 -> 매개변수 Object 자리에 어떤 객체가 올지는 예상할 수 없음 (상속된 객체들이 올 수 있다)

 

 

동일성, 동등성

동일성(Identity) == 실제로 동일한 객체를 가리키고 있는지.

동등성(Equality) equals() 메서드. 두 객체가 논리적으로 동등한지.

기본 메서드로는 동일성 연산을 제공한다. (객체의 어떤 필드를 비교해야 할지 알 수 없음.)

equals() 메서드를 오버라이딩 해주어서 어떤 것을 기반으로 비교할지 결정 한다.

IDE constructor 사용하면 됨.

 

불변 객체

두개의 변수가 하나의 객체를 참조하고 있을 때(address를 공유하는 중, 공유참조) 하나만 바꾸어도

의도치 않게 두가지 모두 값이 바뀌는 경우(side effect) 가 있다.

객체의 값을 변경하지 못하게 한다면 방지 할 수 있다.

 

생성자를 통해서만 값을 변경할 수 있도록 필드 값을 변경할 수 없게 필드를 final 처리 하거나

private field로 만들고 set 메서드를 삭제하면 불변 객체로 처리할 수 있다.

 

불변객체의 값에 특정 값을 더하는 등 수정이 필요하다면. 새로운 객체를 만들어 반환하는 식으로 반환을 유지하며 변경.

이럴 때 메서드명에 with를 붙여준다. 원본을 두고 with ~ . ~를 담은 것을 새로 만든다는 것.

 

String

String str = new String("hello");

String str2 = new String("hello");

string 인스턴스 생성 시에는 

str==str2 비교는 false가 발생한다. 당연히 동일성 비교 실패.

equals() 비교로는 String 객체에 오버라이딩 되어 있기에 true 반환됨.

 

String str = "hello";

String str2 ="hello";

이렇게 리터럴 초기화를 하게 된다면 컴파일 시에 문자열 리터럴로서 문자열 풀(힙 영역)에

따로 저장하고 둘이 같은 곳을 가리키기에 동일성 비교와 equals() 비교 모두 true가 된다.

메서드 만들 때 어떤 것이 올지 알 수 없기에 항상 equals() 사용할 것.

 

String은 불변객체이므로 concat 등 사용시 반환값을 받아서 사용.

불변객체가 아니었다면 문자열 풀의 같은것을 가리키는 변수들이 다 바뀔것.

 

가변 문자열이 필요하다면  StringBuilder 클래스 사용.

append와 insert로 수정한다. 수정이 완료되면 안전하게 toString 해주는 것이 좋다.

 

String간 + 연산 등 수행시 StringBuilder로 자체적으로 변환해 언어에서 최적화를 지원하지만

반복문에서는 불가능 하기에, 반복문을 사용해서 문자열 + 등을 수행 시 StringBuilder를 활용할 수 있다.

append 메서드 사용.

'java' 카테고리의 다른 글

상속, 다형성  (0) 2024.03.30
생성자, 접근제어자, static  (0) 2024.03.29

관련글 더보기