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 로 꺼내서 편하게 쓰자
'Back to the Java' 카테고리의 다른 글
상속과 Override, 상속을 막는 final 메소드와 final 클래스. (0) | 2022.06.27 |
---|---|
클래스 안의 클래스 Inner class <- Outer class 에게 허락을 맡아라 (0) | 2022.06.27 |
Modifier - 접근제어자 / static / final / +싱글톤 (0) | 2022.06.23 |
배열을 품은 배열 - 이차 배열 (0) | 2022.06.23 |
참조형 DataType, Stack 과 Heap 메모리 저장 (0) | 2022.06.22 |