반응형

# 정보은닉 (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);		
	}
}
반응형

+ Recent posts