JAVA

[JAVA] 객체&생성자(new 키워드,빌더 패턴)

EJUN 2023. 4. 3. 17:14

 객체(Objects)란?
물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신과 다른 것을 식별하는 것을 의

객체 생성

<객체 생성 순서>
1. 객체의 주소 정보를 담을 레퍼런스 변수를 선언한다.
2. 자바에서는 new라는 키워드로 객체를 생성한다. ex) class 타입 변수명=new 생성자();
3. 이때 new라는 키워드는 foo라는 객체에 저장될 메모리 공간을 할당해준다.

자바 JVM구조를 살펴보면 JVM(자바 가상 머신)이 new라는 키워드를 보면 new 뒤에 있는 클래스명을 보고 

해당 클래스를 메모리에 올리는 구조이다.

 

그렇다면 new라는 키워드는 레퍼런스 변수를 선언할 때 사용하는데

우리가 흔히 사용하는 String,Integer와 같은 Reference Type은 new 라는 키워드를 사용하지 않을까?

 

String 객체는 특별한 자료형이다. 그래서 아래와 같이 2가지 방식으로 코드를 작성할 수 있다.

String 참조 자료형 특징

물론 위처럼 new키워드를 사용해도 되고 안해도 된다.

new키워드를 사용한 String객체와 사용하지 않은 String객체의 차이는 메모리 상에 저장되는 방식이다.

출처 :&nbsp;http://www.journaldev.com/797/what-is-java-string-pool

위 사진을 보면 new라는 키워드를 사용하지 않은 레퍼런스 변수는 String Pool이라는 공간에 저장이 되고, 

new키워드를 사용한 레퍼런스 변수는 heap영역에 저장이 되는 차이가 존재한다.

s1,s2처럼 같은 리터럴 값을 가지는 객체는 같은 주소를 가지게 된다.

 

생성자(Constructor)
클래스와 같은 이름을 가진 특별한 메소드로
객체 생성시 레퍼런스 변수의 초기화를 담당

생성자

위의 생성자는 기본(default) 생성자라고 부르고 개발자가 굳이 입력하지 않아도 클래스를 생성하면 기본적으로 생성된다.

생성자 오버로딩

위 코드는 여러 개의 생성자를 오버로딩한 코드이다.

이렇게 하면 과연 컴파일러가 개발자가 어떤 생성자를 호출하는지 파악할 수 있을까?

오버로딩된 생성자 호출

위 처럼 객체를 생성할 때 매개변수의 갯수, 변수 타입에 의해 컴파일러가 어떤 생성자를 호출할 지 결정할 수 있다.

 

빌더 패턴
복잡한 객체를 생성하는 방법을 정의하는 클래스와 표현하는 방법을 정의하는 클래스를
별도로 분리하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를
제공하는 패턴

Builder Pattern

<빌더 패턴의 장점>
1. 필요한 데이터만 설정가능
2. 유연성 확보
3. 가독성 증가
4. 변경 가능성 최소화

 

'JAVA' 카테고리의 다른 글

[JAVA] 메소드(method)란?  (0) 2023.04.04
[JAVA] this키워드  (0) 2023.04.04
[JAVA] 클래스정의&종류  (0) 2023.04.03
[JAVA] 함수형 인터페이스 & (->)람다식  (0) 2023.04.02
[JAVA] 산술연산자 & 비트연산자  (0) 2023.03.22