JAVA_정보은닉

뚱이아저씨·2023년 2월 13일
0

자바

목록 보기
8/15
post-thumbnail
post-custom-banner

정보은닉(Iformation Hiding)

접근제어자

  • 접근제어자는 public, private,protected,default 4가지가 있다.
  • 접근 제어자를 사용하는 이유는 다음과 같다

    은행에 빗대어 말하면 은행원들은 은행에 오는 모든 손님들을 맞이하지만
    은행 안에 있는 금고 같은 경우는 관계자만 사용할 수 있도록 되어 있다.
    만약 금고가 아무나 사용할 수 있다면 큰일이 나게 된다.
    이처럼 사용자가 객체에서 사용하는 변수나 메소드를 건드리면 개발자의
    의도와 다른 오작동을 생길수 있다. 접근제어자는 객체의 로직을 보호하기
    위해서 외부의 접근을 허용하거나 차단하는 보안목적으로 사용이 된다.

접근제어자와 getter/setter의 관계

  • 접근 제어자 중 가장 많이 사용되는 것이 private인데 private은같은 클래스가 아니면 모든 접근을 막고 있는 접근 제어자 이다.
    같은 클래스가 아닌 다른 클래스에서 private필드를 사용하고 싶을 경우사용하는 것이 getter/setter이다.

Information Hiding을 이용한 getter/setter출력 예시

//Person클래스 생성
public class Person{
	private String name;
    private int age;
    
    public void setName(String name){this.name=name;}
    public void setAge(int age){this.age=age;}
    public void String getName(){return name;}
    public void int getAge(){return age;}
}
//Person클래스 호출
public class personTest{
	pyblic static void main(String[] args){
    	Person p=new Person();
        
        //private접근 제한자 때문에 필드_멤버 변수에 접근을 할 수 없다.
        //접근을 할 수 없으니 setter를 사용하여 값을 입력 및 저장한다.
        p.setName("뚱이아저씨");
        p.setAge(6);
        
        //setter를 사용하여 값을 저장했기 때문에 getter를 사용하여 값을 출력한다.
        System.out.printf("%s, %d", p.getName(), p.setAge());
   }
}

getter/setter

getter

  • getter메소드는 저장되어 있는 값을 읽어 올때사용 된다.
  • getter메소드는 저장되어 있는 값을 읽어올때 사용하는 메소드이기 때문에 return이 필요하다.
  • getter메소드는 setter메소드에 입력받고 저장한 값을 다시 읽어 오는 역할을 한다.

setter

  • setter메소드는 매개변수에 입력받는 값을 필드_멤버변수에 저장을 해준다.
  • setter메소드에서 입력받은 값을 getter에서 읽어 오도록 한다.
  • setter메소드는 private으로 선언된 필드의 값에 접근해서 값을 저장할때 필요하다.

getter/setter메소드 사용하는 이유

getter/setter는 private(정보은닉)으로 선언된 필드의 값을 수정또는
호출하고자 할때 필요하다.
private은 거의 모든 접근을 막는 접근 제한다 이기 때문에 필드를 직접 입력할 수 없어
private의 값을 수정 호출하고자 할때 getter/setter가 사용된다.

연습문제
문제 :

  • Man클래스(도메인)생성
  • 접근 제한자 get/set를 이용하여 정보은닉 반영
  • 객체의 이름, 나이를 입력받은 후
  • 객체의 이름, 나이,등록일(현재)를 출력
//도메인 생성
public class Man{
	private String name;
    private int age;
    //현재날짜를 출력하는 필드
    private LocalDate regDate;
    
    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;
    }
    public LocalDate getRegDate(){
    	return regDate;
   }
   public void setRegDate(LocalDate regDate){
   		this.regDate=regDate;
   }
}
public class ManTest{
	public static void main(String[] args){
    	Scanner sc=new Scanner(System.in);
        String name="";
        int age=0;
        
        LocalDate regDate=null;
        
        System.out.print("이름 : ");
        name=sc.nextLine();
        System.out.print("나이 : ");
        age=sc.nextInt();
		//LocalDate는 현재 날짜를 출력하는 값이므로 입력을 받지 않는다.
        regDate=LocalDate.now();

        Man m=new Man();
        m.setName(name);
        m.setAge(age);
		//LocalDate의 초기화된 값을 Man의 setter에 넣어준다.
        m.setRegDate(regDate);

        System.out.println("다음 사람을 입력하셨습니다.");
        System.out.println("이름 : "+m.getName()+"\n"+"나이 : "+m.getAge()+"\n"+"등록일 : "+m.getRegDate());
        
    }
}
profile
뚱이아빠의 개발자도전기
post-custom-banner

0개의 댓글