객체를 잘 만든다는 것은? Getter Setter

Kyu·2021년 1월 16일
1

Java 공부기록

목록 보기
11/40

객체를 잘 생성한다는 것은?

객체를 설계하면 메모리에 기억공간이 만들어진다
기억공간의 주 목적은 데이터를 넣고 빼는 것이다.
데이터를 넣고 뺄때 어떤 제약이 없으면 이 기억공간에 잘못된 데이터를 넣어도 필터링이 되지 않는다.
그래서 클래스를 설계할때 이런 데이터 공간의 하나하나의 상태정보는 보호받아야한다
데이터를 그렇게 보호하는 것을 정보은닉이라고한다. 정보은닉: 다른 객체로부터 접근을 막는것.

왜 막아야할까?
해커로부터 막아야해서???

철수와 영희가 있다.
철수가 영희에게 사과를 준다고 했을 때, 상식적으로 영희가 사과를 손->입->식도->위를 통해 먹는다.
영희의 위 속에다가 바로 사과를 넣을 수 없다.
먹는 것이 불편하다해서 위에 바로 쳐넣으면 안된다.
여기서 위는 private이다. 위가 public인 사람은 없다.
위는 보호되어있다. 위로 오기전에 사과가 여러 단계를 거쳐온다
로그램에서 입을 메소드라 할수있다 (동작,기능)
데이터도 어떤 사람이 입을 통해서 데이터를 주면 씹어서 위로 넣어야하는 그런 방법을 택해야한다.

지금부터는 객체를 생성할때 객체의 상태를 전부보호해야한다. 그것이 정보은닉이다.
어떻게 해야 정보은닉을 합니까?

은닉을 했을때 VS 안했을때

public class MemberVO {
	private String name;
	private int age;
	private String tel;
	private String addr;
}

이게 만약에 전부 public으로 되어있다면?

일단 이걸 생성해보자
MemberVO m = new MemberVO();

그럼 생성된게 메모리안으로 다음과 같이 들어갈것이다.

public이면 m을 이용해서 name,age,tel,addr에 접근할수있다.
클래스를 만드는 목적은?
기억공간에 데이터를 넣고 빼는게 주목적인데!
어떤 문제가 발생할수있냐?

예를 들어서 m.age = 1000; 이라고한다면 그냥 받아들일것이다.
이렇게 잘못된 데이터가 들어올수있고 큰 문제가 되지 않는다 메모리안에서는.
그래서 위에 그냥 쳐넣으면 문제가되는거처럼 객체도 문제가 생길수있다

객체를 어떻게 만들어야 잘 설계한다는 것일까?
첫번째는 객체가 가지고 있는 모든 변수를 private으로 한다.
그러면 m.을 이용해서 접근할수없다. 그리고 데이터를 넣을수없다

기억공간을 만들어놓고 접근을 못하게하면 어떻게 하라는 말인가?
그렇다고 퍼블릭으로 하면 내 위를 밖에 꺼내주는 격이다

기본적으로 모든 멤버변수는 정보은닉을해야한다.
모든 객체를 접근을 private으로 막아야한다는게 정보은닉이다.

접근하려면 별도의 메소드가 필요하다. 입같은 메소드가 필요하다.
그 메소드를 setter Method라고 한다. setter를 통해서 데이터를 넣어준다
그리고 그 데이터를 가져오려면 getter method를 통해서 데이터를 얻어와야한다.

How to make Getter and Setter?

메소드 이름 앞에 get과 set을 붙인다!

public void setAge(int age){
	this.age=age; //데이터를 넣어주고
}
public String getAge(){
	return age; //데이터를 가져온다
}

그리고 불러올때는?

MemberVO m = new MemberVO();

m.setAge(20);
System.out.println(m.getAge());

이렇게했을때 장점은 뭘까?

앞에서 클래스를 통해서 바로 나이를 저장해줬을때는 잘못된 데이터가 들어올수있었지만!

setAge()를 통해서 나이를 저장해주기때문에 만약에 1000살이 들어온다? 그러면 if문을 통해서 막을수가 있다

public void setAge(int age) {
	if (age < 0 || age > 200) {
		//age의 범위를 정해주고 하고싶은 로직..
	}
	this.age = age;
}

잘 설계된 DTO, VO 클래스

  1. private으로 객체의 상태를 보호한다.

  2. 디폴트 생성자를 명시적으로 만든다. 생성자(오버로딩)를 만들어 적절하게 초기화한다. 객체를 생성하는 작업은 생성자 내부에서 JVM이 자동으로 처리한다.
    디폴트 생성자를 안만들면 다른 생성자가있을떄 기본생성자를 자동으로 안만들어주기떄문에, 기본생성자를만들떄 오류가 발생한다. 그래서 명시적으로 만들어주는게 좋다.

  3. private으로 만들어진 멤버변수를 접근하기 위해서 setter, getter method를 만든다

    • DI (Dependency Injection : 종속객체 주입)
      - setter method의 역할
  4. 객체가 가지고 있는 값 전체를 출력하기위한 toString() method를 재정의 한다. -> 디버깅을 하기쉽도록.

public class MemberVO {
	private String name;
	private int age;

	public MemberVO() {}

	public MemberVO(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "MemberVO [name=" + name + ", age=" + age + "]";
	}
}

질문1 : Override를 하는 이유는?

질문2: 객체를 생성했하고 모든 변수를 출력해주기 위해 toString()을 만들었다. 그리고 System.out.print(객체.toString()); 라고 선언하면 예상하다시피 toString에서 return해준 값이 나온다. 그런데 System.out.print(객체) 객체만 넣어줘도 toString에 리턴되는 값들이 나온다. 이유가 뭐지?

profile
TIL 남기는 공간입니다

0개의 댓글