반응형
# 정보은닉 (Private)
## 정보은닉
- 정보은닉 : 다른 객체(class)로부터 접근을 막는 것이다. (멤버변수를 private 하여 정보은닉.)
public class MemberVO {
private String name;
private int age;
private String tel;
private String addr;
public MemberVO() {
}
}
- 이때 객체생성해서 아래와 같이 바로 접근하는 건 제한 됨.
MemberVO member = new MemberVO();
멤버변수가 private 이기때문에 아래와 같이 접근 불가.
m.name
m.age
m.tel
m.addr
- private 멤버 변수에 접근하는 방법 : getter, setter method 를 활용.
## getter, setter method
- 정보은닉된 정보 접근 시 getter, getter method 활용.
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
- 아래와 같이 사용.
m.setName("자바");
m.getName();
## getter, setter method (실습)
- 아래와 같이 직접 접근하여 데이터를 넣게되면 잘못된 데이터가 들어갈수도 있다. 그렇기 때문에 정보은닉 필요.
package kr.tpc;
public class MemberVO {
public String name;
public int age;
public String tel;
public String addr;
public MemberVO() {
}
}
import kr.tpc.MemberVO;
public class TPC15 {
public static void main(String[] args) {
MemberVO member = new MemberVO();
member.name = "홍길동";
member.age = 5000; // 나이에 터무니없는 값 넣어짐.
member.tel = "010-1234-5678";
member.addr = "세종시";
System.out.println(member.name);
System.out.println(member.age);
System.out.println(member.tel);
System.out.println(member.addr);
}
}
- 정보은닉 적용.
package kr.tpc;
public class MemberVO {
private String name;
private int age;
private String tel;
private String addr;
public MemberVO() {
}
// getter, setter method
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0 && age <= 200) {
this.age = age;
} else {
}
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
import kr.tpc.MemberVO;
public class TPC15 {
public static void main(String[] args) {
MemberVO member = new MemberVO();
member.setName("홍길동");
member.setAge(1000);
member.setTel("010-1234-5678");
member.setAddr("세종시");
System.out.println(member.getName());
System.out.println(member.getAge());
System.out.println(member.getTel());
System.out.println(member.getAddr());
}
}
# 잘 설계된 클래스
## 잘 설계 된 DTO, VO 클래스
1. 정보은닉 (information hiding)
- 모든 멤버는 private로 정보은닉하여 객체의 상태를 보호해야 한다.
2. 생성자
- 디폴트 생성자를 명시적으로 만든다.
- 오버로딩 생성자를 만들어 적절하게 초기화 한다. (객체를 생성하는 작업은 생성자 내부에서 JVM이 자동으로 처리한다.)
3. getter, setter method
- getter, setter method 생성 : private으로 만들어진 멤버변수를 접근하기 위해 getter, setter method를 생성한다.
- DI (Dependency Injection) : 종속 객체 주입으로, setter method의 역할.
4. toString() method
- toString() method : 객체가 가지고 있는 값 전체를 출력하기 위한 toString() method를 재정의 한다.
package kr.tpc;
public class MemberVO {
// 1. 정보은닉.
private String name;
private int age;
private String tel;
private String addr;
// 2. 생성자
// 디폴트 생성자 명시적으로 생성.
public MemberVO() {
}
// 생성자 오버로딩(중복적용) -> 초기화를 효율적으로 하기 위함.
public MemberVO(String name, int age, String tel, String addr) {
this.name = name;
this.age = age;
this.tel = tel;
this.addr = addr;
}
// getter, setter method
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0 && age <= 200) {
this.age = age;
} else {
}
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
// 3. 디버깅 하기 쉽도록 toString() 메서드 생성.
@Override
public String toString() {
return "MemberVO [name=" + name + ", age=" + age + ", tel=" + tel + ", addr=" + addr + "]";
}
}
## 잘 설계된 클래스 (실습)
package kr.tpc;
public class MemberVO {
// 1. 정보은닉.
private String name;
private int age;
private String tel;
private String addr;
// 2. 생성자
// 디폴트 생성자 명시적으로 생성.
public MemberVO() {
}
// 생성자 오버로딩(중복적용) -> 초기화를 효율적으로 하기 위함.
public MemberVO(String name, int age, String tel, String addr) {
this.name = name;
this.age = age;
this.tel = tel;
this.addr = addr;
}
// getter, setter method
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0 && age <= 200) {
this.age = age;
} else {
}
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
// 3. 디버깅 하기 쉽도록 toString() 메서드 생성.
@Override
public String toString() {
return "MemberVO [name=" + name + ", age=" + age + ", tel=" + tel + ", addr=" + addr + "]";
}
}
import kr.tpc.MemberVO;
public class TPC16 {
public static void main(String[] args) {
MemberVO member = new MemberVO("홍길동", 100, "010-1111-1111", "서울시");
// 위와같이 했을땐 생성자를 이용하여 초기화 하여 getter, setter 필요 없음.
System.out.println(member); // toString() 메서드로 인해 하나의 문자열로 출력됨.
MemberVO m = new MemberVO();
m.setName("홍길순");
m.setAge(90);
m.setTel("010-1234-1234");
m.setAddr("세종시");
System.out.println(m);
}
}
반응형
'인프런 강의 학습 > Java TPC' 카테고리의 다른 글
Java TPC_11일차 class (0) | 2022.01.13 |
---|---|
Java TPC_10일차 메서드 오버로딩 / 동일한 구조와 이질적인 구조 (0) | 2022.01.12 |
Java TPC_8일차 private 생성자 / class, object, instance 상호관계 (0) | 2022.01.09 |
Java TPC_7일차 기본 자료형(PDT), 사용자 정의 자료형(UDDT), 객체 생성과정 (0) | 2022.01.08 |
Java TPC_6일차 메서드의 매개변수 전달기법(parameter passing) / JVM의 메모리 모델 (0) | 2022.01.06 |