어떠한 객체를 만든다는 것은 그 객체의 공간에 접근해 데이터를 저장하거나 빼오기 위함인데
어떠한 제약이 없으면 기억공간에 잘못된 데이터를 넣어도 아무런 문제가 되지 않는다.
객체의 상태정보는 보호를 해서 외부의 접근을 통해 무분별한 데이터 조작을 막아주어야 한다.
이를 위해 해주어야 하는 것이 정보 은닉이다.(private)
💡 1. 정보 은닉(private)
사람을 예로 들어보자.
한사람이 다른사람에게 사과의 영양분을 전달해 주고 싶다고 한다.
하지만 사과의 영양분을 얻을 수 있게 소화시키는 위는 외부로부터 보호(private) 되어 있다.
그 위로 직접 사과를 넣는것은 불가능하다.
만약 위가 보호되어 있지 않으면? public? 외부에서 위에 직접 음식을 넣는건 매우 위험할 것이다.
사람은 보호(private)되어 있는 위(상태정보)에 음식(정보)을 넣기 위해 입이라는
기관(setter method)을 통해서 음식을 넣게끔 되어있다.
🔍1-1 public 으로 객체를 만들었을 때.
Member라는 VO 객체를 설계한다고 해보자
만약 위의 멤버변수들의 접근제한자가 Private가 아니라 public 이라고 가정해보자.
객체를 생성하고 메모리에 객체가 만들었다.
객체의 내부 데이터들은 public 으로 되어 있기 때문에 모든 정보로 접근이 가능할 것이다.
m.age 를 통에 나이에 접근한다고 해보자. m.age를 이용해 나이를 1000으로 바꾸는 것도 가능할 것이다.
접근이 허용이 가능하기 때문에 1000을 넣어도 변경이 가능하다(실제 사람나이가 1000살이 불가능하다.)
🔍 1-2. private로 객체를 만들었을 때.
private로 설계된 객체는 m. 을 통해서 접근해 정보를 빼오거나 정보를 저장하는것이 불가능 할 것이다.
😮 네 ..? 기억공간은 쓰려고 만든건데 그러면 어떻게 접근해야하나요?
사람의 위(객체 변수들)가 보호(private)되어 있는데 그러한 위에 접근하기 위해서 우리는 입(method)을 이용한다.
그 입의 역할을 해주는 것이 getter(), setter() method 이다.
객체를 생성하기 위해 만든 클래스 내부에 각 변수에 접근할 수 있는 getter메서드와 setter 메서드를 만들어 준다.
객체의 name, age , tel, addr 에 setter 메서드를 통해서 데이터를 넣어주고 getter 메서드를 통해서 정보를 얻어 올 수 있다.
위처럼 getter와 setter 메서드를 같이 생성해주면 위 그림과 같은 모양으로 메모리에 생성된다.
🔍 1-3. 코드를 통해 배워보자 getter setter!!
생성하고자 하는 객체의 클래스에 선언된 변수가 private 로 설정되어 있다.
이 경우에 MemberVo의 객체를 생성하더라도
m. 을 통해서 바로 해당 객체의 정보값들에 접근이 불가능하다.
때문에 해당 클래스 내부 private 값에 접근할 수 있도록 클래스 내부에 getter/setter 메서드를 만들어 줘야 한다.
eclipse에서 변수정보가 입력된 class 함수에서 getter setter를 한번에 만들 수 있다.
getter / setter 함수를 넣고자 하는 위치에 오른쪽 마우스를 클릭해주고 Source ➡ Generate Getter and Setters... 클릭!
getter / setter 를 만들어 주려고 했던 변수들을
모두 체크해준다.
생성된 인스턴스 변수 m 안의 getter와 setter 메서드를 통해서 만 해당 정보에 접근이 가능한 것이다.
어?? 그런데 setAge를 통해서 나이 1000살로 할 수 있는건 똑같은데요??

아니죠! set이라는 메서드를 통해서 데이터를 받으니까 메서드에 조건문을 걸어주면 충분히 제약을 걸 수 있습니다!
마치 위(객체변수)에 음식(정보)을 입(setter method)을 통해 넘겨줄 때
이빨로 씹다보면(조건문 제약 등등) 돌맹이 같은 이물질을 알 수 있잖아요!!
마찬가지로 바로 인스턴스 변수에 접근해서 데이터를 조작하는 것이 아닌 인스턴스 변수 내부의 메서드를 통해서 접근해야 하기 때문에 여러가지 데이터 변경에 필요한 제약을 걸 수 있는 것이죠!!

💡 2. 잘 설계된 객체를 만드는 법.
객체 지향에서 객체를 설계 할때 모든 변수들을 정보 은닉(private)를 해야 한다.
1. 클래스 내의 멤버 변수들은 private 를 통해 은닉화를 해준다.
Default 생성자 메서드도 따로 하나 더 선언해준다.
2. 초기화를 효율적 으로 하기 위해 생성자 메서드를 Overloading으로 미리 만들어 놓는것도 좋다.
3. private로 되어 있는 setter와 getter로 접근하기 위해 메서드를 만든다.
여기서 setter는 DI(Dependency Injection :종속 객체 주입) 등의 setter method 의 역할을 한다.
외부로부터 데이터를 가지고 자신의 데이터에 넣는것을 DI라고 한다.
4. toString() 을 통해서 객체가 가지고 있는 값 전체를 출력하는 메서드를 정의해 놓는다.
원래는 getter을 통해 하나씩출력해야 하는데 toString이라는 메서드를 만들어 놓으면
디버깅이나 값 점검을 쉽게 할 수 있다.
💡 3. 코드로 학습하기
eclipse에서 class 변수들 관련 메서드 만들기.
생성자 메서드 만들기
단 맨 위의 MemberVO(){} 와 같은 Default Constructor 의 경우 따로 선언해준 것이다.
(초기화를 효율적으로 하기 위해 미리 만들어 놓는 것)
default 생성자 메서드의 경우 this를 통해 미리 데이터 값을 넣어놔도 좋다.
생성자 메서드에 매개변수 int를 넣어야 하는 클래스에서 만약 아무것도 안넣을 때를 대비해
자동으로 this 를 이용 본인 자기자신을 호출하며 매개변수를 10을 넣어놓는 default 생성자를 만들어도 좋다.
toString 메서드 만들기
각 변수가 모두 매개변수에 들어있는 메서드가 있는데 이 경우에는 멤버 변수가 private로 되어 있다고 하더라도
객체 생성 메서드를 이용해서 초기값 까지 넣을 수 있다(객체 생성과 동시에 초기화가 가능하다.)
그렇게 넣은 초기값들을 출력하고자 하면 보통은 getter로 하나씩 접근해서 줄력해야 하지만.
잘 설계된 클래스의 경우 toString() 메서드를 함께 가지고 있어 toString 메서드에만 접근해서 출력하면
모든 값들을 한번에 확인이 가능하다.
매개변수가 없는 default Constructor 을 이용해서 다른 인스턴스를 선언 한 경우이다.
이 경우에는 초기화를 할 때 반드시 setter를 이용해서 접근해야한다.
하지만 getter의 경우 꼭 getter가 아니라 선언해 놓은 toString()으로 접근이 가능하다.
그리고 toString의 경우 생략이 가능하다.
m1 객체만 출력해도 toString() 메서드만 있으면 m1.toString() 이 출력된다.
Java 관련 개념을 알려주실 때 그 내부 동작이 어떻게 구현되는지 자세하게 알수 있는 강의입니다.
출처: Java TPC (생각하고, 표현하고, 코딩하고) 대시보드 - 인프런 | 강의 (inflearn.com)
'Java > Java 활용 개념 정리' 카테고리의 다른 글
[Java] 클래스 부분 최종 정리 (2) | 2023.02.03 |
---|---|
[Java] 메서드 오버로딩(Method Overloading) (0) | 2023.02.02 |
[Java]class, object, instance 상호 관계. (0) | 2023.02.02 |
[Java] private 생성자와 static의 관계 (0) | 2023.02.01 |
[Java] 객체 생성 과정(new, 생성자 메서드, this) + 초기화 (0) | 2023.02.01 |
댓글