1. Constructor[생성자]

  1. [설명]

    1. 클래스의 이름과 동일한 이름을 가진 메서드
    2. 반환 타입이 없습니다(void도 아니며, 반환타입 자체가 없는 것이고, 반환타입이 있을 경우 생성자 메서드가 아니게 됨)
    3. 객체가 생성될때 객체의 초기화를 위해 실행되는 메서드
  2. [기능]

    1. 객체 생성 시 초기화 작업을 수월하게 함
    2. 객체가 생성된 후 자동으로 실행되고, 객체 생성 후 처음으로 실행할 작업을 생성자 메서드로 구현
    3. 시작 작업으로는 멤버변수를 초기화하는 작업과 외부자원(네트워크, 데이터베이스 등)과 연결하는 작업
  3. [특징]

    1. 객체를 생성할때 new 키워드 다음에 적음 ⇒ User user1 = new User();

    2. 참조변수를 통해 실행할 수 없음 ⇒ 참조변수.생성자메서드(); [실행불가합니다]

    3. 클래스에 생성자 메서드가 없으면 컴파일러가 기본생성자 메서드를 자동으로 추가 ⇒ public User() {}

    4. 생성자도 중복 정의가 가능

    5. this 키워드가 함께 활용함

    6. [This 키워드]

      1. this는 객체 자신을 가리키는 레퍼런스임
      2. 현재 실행되고 있는 메서드가 속한 객체에 대한 레퍼런스를 말함
    7. [This 필요성]

      1. 매개변수의 이름을 멤버변수와 같은 이름으로 붙이고자 할때 this를 사용함

      2. 메서드가 객체 자신의 레퍼런스를 리턴해야하는 경우에 this를 리턴함

      3. [예제]

        public String getName() {
        	return this;
        }
        
    8. [This() 메서드]

      1. 같은 클래스 내에 생성자가 다른 생성자를 호출할때 사용함

      2. [예제]

        public class User{
        	public String name;
        	public String phoneNumber;
        
        	public User() {
        		this("");
        	}
        
        	public User(String name, String phoneNumber) {
        		this.name = name;
        		this.phoneNumber = phoneNumber;
        	}
        
        	void print() {
        		System.out.println(name);
        		System.out.println(phoneNumber);
        	}
        	
        	public static void main(String[] args) {
        		User user1 = new User("Test", "010-1234-5678");
        		user1.print();
        		// Test 
        		// 010-1234-5678
        	}
        }
        
    9. [This() 유의]

      1. 반드시 생성자에서만 호출할 수 있음
      2. 같은 클래스 내 다른 생성자를 호출할 때 사용함
      3. 생성자의 첫번째 문장이어야 함
  4. [선언]

    // 매개변수가 없는 생성자를 선언
    클래스이름() { ... }
    // 매개변수가 있는 생성자 선언
    클래스이름(인수1, 인수2, ...) { ... }
    
  5. [유의]

    1. 기본 생성자 메서드가 아닌 다른 어떤 생성자 메서드라도 이미 만들어져 있다면, 기본 생성자 메서드는 자동으로 추가 되지 않는다는 점
    2. 만약 생성자 메서드의 중복정의를 사용한다면 기본 생성자 메서드는 직접 만들어주는 것이 좋음

2. Setter

  1. [설명]

    1. private로 선언된 필드의 값을 수정하고자 할 때 필요함
    2. private필드는 직접 접근할 수 없게 되어 있기에 객체는 입력값을 setter메서드의 매개값으로 넘겨주고 값을 검사하고 나서 그 값이 필드의 값으로 적절한 경우에만 저장함
    3. 값을 변경하는 역할은 생성자에서도 가능함
    4. 생성자가 없는 경우도 있기에 setter를 이용해서 값을 입력할 수 있음
    5. 주로 데이터를 변경하는 역할을 함
  2. [선언]

    // Setter
    public class User{
    	private String name;
    	private int age;
    
    	// Setter
    	public void setName(int age) {
    		this.age = age;
    	]
    }
    

3. Getter

  1. [설명]

    1. 값을 변경하였다면, 데이터를 읽어오는 역할을 Getter에서 수행함
    2. 외부에서 객체의 데이터를 읽어올 때도 안전하게 값을 유지할 수 있도록 사용함
    3. 경우에 따라서는 필요한 메서드만 생성함
  2. [선언]

    // Getter
    public class User{
    	private String name;
    	private int age;
    
    	// Getter
    	public void getName() {
    		return name;
    	]
    }
    

4. Getter, Setter를 줄여야하는 이유?

  1. Setter를 쓰면 안되는 이유?
    1. 다른사람의 코드를 보거나, 나중에 내가 짠 코드를 봤을 때, 값을 변경한 의도를 파악하기 힘듬
    2. 값을 넣어야할 필드가 많아지면 무분별하게 setter가 나열됨
    3. setter를 나열하기만 하면 어떤 의도로 데이터를 변경한 것인지 명확하게 알수가 없음
    4. 객체의 일관성이 떨어짐
    5. setter로 값을 변경할 수 있다면 모든 곳에서 객체 값의 변경이 가능한데, 객체의 값을 변경하는 메서드가 의미가 왜 필요한지를 생각해야함
    6. 그리고 setter때문에 의도치 않게 값이 변경될 수 없는 위험이 존재하므로 사전에 차단해야함
  2. Getter를 쓰면 안되는 이유?
    1. 캡슐화의 의미가 없음
    2. private로 필드를 선언해놓고 getter로 아무 곳에서나 값을 꺼내올 수 있다면 상태 정보가 그대로 노출되는데 private를 굳이 선언한 의미가 없어지기 때문
  3. Setter를 안쓰고 어떻게 처리를 할까?
    1. Entity의 생성자를 사용하여 값을 변경하는 것이 아니라, 완전히 초기화하는 방식임
    2. 생성자를 쓸 때 각각의 매개변수의 의미를 파악하기 어렵고, 상황에 따라 특정 매개변수만 초기화하는 경우도 있는데 이 경우 하나하나 생성자를 써야하기에 코드가 혼잡해 질 수 있다는 점
    3. 빌더 패턴을 활용해서 매개변수의 의미를 파악하기 쉽게하고, 선택적으로 필요한 변수는 값을 초기화해줘서 매개변수 대응을 해결해 주는 방법
  4. Getter를 안쓰고 어떻게 처리를 할까?
    1. 로직을 객체에 존재하게 하여, 메서드가 상태값을 모른 채로 객체에게 질문을 하도록 해야함
    2. 어떤 값이 객체의 상태값과 같은 지 확인할려면, 특정 값을 객체에게 넘겨주고 이값이 같은지 안 같은지 여부만을 응답받는 방식으로 설계를 하는 방법
  5. Getter를 써도 되는 경우는 어떤경우일까?
    1. 값을 출력하기만 할 때나, 멤버변수 값의 전달을 위해 필요한 경우 Getter를 사용 할 수 있음