GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Java

생성자 Constructor / vs GetterSetter / this

Backcoder 2022. 6. 24. 20:17

class Member{ 
public Member( ){ }    //생성자 (기본생성자) default 값 


=> 이게 있어야 클래스로 객체 생성할때 

                                    (생성자) 

Member m1 = new Member( ); << 오류가 나지 않는다. 


만약 생성자를 파라미터 값을 준걸로 만든다면 


public Member( Long id, String name ){ }  

 

이렇게 생성자를 만들어놓으면, 객체 생성할때, 바로 인자값을 넣으면서 만들수가 있다. 
getter setter 로 일일이 해주지 않고 편하게 만들 수 있는 것이다. 

(1) Member m1 =  new Member( 1, "June" ); 

(2) Member m1 = new Member( ); 

  m1.setId( 1 ) ; 

 m1.setName( "June" ); 

 

하지만 이렇게 파라미터 Sign을 정해서 생성자를 만들어 두면,

객체 생성할때, 
Member m1 = new Member( ); <= 이건 이제 안된다.

파라값을 맞춰서 줘야지만 만들어진다.                                         "생성자에서 2개로 정해뒀으면 2개를  내놓으시게!" 

 

근데 싫다면? 

당장 para 값 안주고, 일단 생성해두고 나중에 넣어야 할 경우가 있을거 아닌가. 

 

파라값 안주고도 생성자를 만들고 싶으면, 


"명시적"으로 dafault 기본생성자를 따로 선언해 놓으면 된다. 

( 원래 dafault 로 깔렸었는데, 새로 생성하면 지워지니까, 다시 명시적으로 까는 것 )

 

그럼 생성자가 2개다.

파라 2개 줬을 땐, 2개짜리로 들어가고, 안줬을땐 기본생성자로 들어가면서 둘 다 생성 가능하다. 

(다형성 Overloading)



< 생성자 overloading > 
1개의 클래스 내부에 여러개 생성자 정의 가능 
클래스명과 같고 매개변수 리스트 반드시 다르게 정의 
(순서나 타입이나 갯수 다르게 ) 

 

오버로딩을 활용해서 2개의 경우의 수가 아니라, 

아주 그냥 다 만들어 놓을 수 도 있다.  

 

 

< 생성자에서 this >  
=> 현재 자신의 객체 자바 키워드   
1. 전역변수(멤버변수)명과 매개변수명이 같거나 전역변수명과 지역변수명이 같은경우가 생길수 있기때문에 
"구분" 용도로 사용 
    ( class 엔티티 에서 전역변수로  id; name; 선언해 놨는데, 생성자 만들면서 
파라미터로 보통(안그래도 되지만) id name 똑같은 이름으로 받잖아. 그래서 그거 두개 구별해주려고.) 
   this.전역변수name = 매게변수name;

 

 

< this 를 쓰는 이유 >   - BackCoder
class A { 
(1) int a; int b;   <= 전역변수 선언 ( 멤버변수 ) 

(2) public  A (int x, int y){  }  
생성자에서 파라미터로 값을 받아옴 

(3) this.a = x; this.b = y;  
x, y 받아온 값을 전역변수 int a, int b 에 넣음 

그 메소드(생성자) 에서만 받아온 x,y 값 사용하고 끝낼거면 상관 없겠지만,     

( 생성자에서 쓸일이 어디있겠는가. 이거 안해주면 사실상 매개변수로 받아놓고, 그대로 갖다 버리는거다)

 

여기서 받아온 파라미터 값이 그 클래스 내에서 공통적으로 사용되어야 한다면, 

그 파라미터값을 클래스의 전역변수로 집어 넣어놓고 
다른 곳에서도 계속 사용하는거다. 

이걸 안해주면, x,y 파라미터값은 오직 그 메소드 안에서만 사용하고 끝나는 일회용 데이터가 된다. 

( 단, 위와 같은 경우에는 (this.) a = x; (this.) b  = y;  이렇게만 해줘도 이름이 다르기 때문에 잘 작동한다. 

      중요한건, "파라미터 변수를 멤버변수에 넣어준다." 라는 개념이고, 

      this 는 보통 (파라-멤버변수) 이름을 똑같이 만들기 때문에, java 에게 구분할 수 있도록 알려주는 것이다. 

     즉, 여기처럼 이름이 다를 경우에는 this 를 생략해도 된다. ) 

 

 

(4) 즉 Entity 클래스의 경우 

파라미터로 받아온 data 를 그 객체 안에 집어넣는다 라는 의미 

class Person{ 

Long id;                  //요기로 집어넣어서 Person 객체 완성! 

String name; 

Person( Long id, String name) {               //아직까진 Person 생성자(메소드) 안에서만 쓰이는 쓸모없는 매개변수일 뿐, 

this. id = id; 

this. name = name; } 

 

 

( 2. 생성자가 Overloading 되서 여러개 있을 때, 다른 생성자 호출 기능  
Member ( int id, String name, double pay ){ 
this.id = id; 
this.name = name; 
this.pay = pay; 
=> 이거 3개 삭제하고 
한방에 점 안찍고 
=> this ( id, name, pay, "부서이동중", "발령이전" ); //현재클래스의 다른 생성자 호출해서 재사용 
5개 꽉차있는 다른 생성자로 가져와라  ) 

 

 

 

 .title  VS .getTitle(); 
엔티티에서 private 로 설정해두면 그 안에서만 .title 사용가능 
다른 클래스에서 객체로 가져와서 사용할때는 .title 불가능 
대신 가져올수 있는 방법을 메소드로 열어놓음 
그게 getTitle 게터. 

 

 

< Getter Setter 와 Constructor 의 차이 > 

Getter Setter 으로 하면 객체의 각 부분별로 뽑아서 쓸 수 있다 - 장점
하지만, 객체 자체를 담고 뽑고 할때는 하나하나 다 해줘야한다 - 단점 

Constructor 으로 하면, 

DTO 의 경우도 toEntity 메소드를 만들어 한방에 객체로 만들수도 있고 
객체 생성할때도, ( ) 괄호안에 한방에 넣어 줄 수 있다.  - 장점 
하지만, 객체 안의 데이터 하나하나를 따로 get 해볼 수는 없다. - 단점
set은 ( )괄호 안에서 사실상 하는거니까. 

 
전체를 꺼내보는건 편하게 가능하지만 ( toString )   
하나하나 꺼내보고 싶으면 toString 처럼 메소드 만들어서 뽑으면 되는데 

바로 그게 Getter Setter 인거지.

<toEntity( )> 
public Board toEntity( ){
     return new Board(id, title, contents);}      // 받아올 DTO의 type 에 맞춰서 들어갈 값들을 넣어준다. 

dtofrom.toEntity( );  -> dto 에서 받은 data들이 한방에 Boardentity 로 만들어진다 

Board 클래스에서 생성자로, 저 (id, title, contents) 를 지정해놓아야 사용할 수 있다. 

 

 

==> 결론 :  둘다 만들어두자   
값 넣을때는 편하게 constructor 로 넣고 
대신, 객체만 생성할 경우 생각해서 기본 생성자도 따로 만들어두고   
꺼내서 써야할 때는 getter setter 로 꺼내서 편하게 쓰자