자바/정리

(JAVA)캡슐화 (getter와 setter)

acid7937 2022. 11. 13. 18:22

날짜 입력 프로그램이 있다고 가정해보자

 

사용자가 날짜를 입력 할 때 우리는 어.. 오늘은 xxxx년 xx월 xx일  이라고 입력할 것이다.

 

그런데 만약 개발자가 외부로 부터의 데이터 보호 라는 이유로 일부 항목을 private으로 막는다고 생각해보자.

 

이것 때문에 우리는 접근제어자를 배웠었다.

---------------------------------------------------------------------------------------------------------------------------------------

 

그런데 접근제어자로 막아버리면 입/출력은 어떻게 진행시킬까 하는 의문이 들것이다. 캡슐화는 유지하면서 입출력만 따로 시켜줄때 필요한 것이 getter와 setter 이다.

 

이번에는 getter와 setter 메서드를 알아 보기로 하자

 

get을 보면 느낌이 어떻게 되는가? 뭘 얻는 느낌이고 set은 세팅하는 느낌들지 않는가? 바로 코드로 확인해 보자. (편의상 한달은 30일 이라고 하였다)

 

class ymd{
    private int year;
    private int month;
    private int date;
    public void setyear(int year){
        if(year<0) return;
        this.year = year;
    }
    public void setMonth(int month){
        if(month<0 || month>12) return;
        this.month = month;
    }
    public void setdate(int date){
        if(date<0 || date>30) return;
        this.date = date;
    }
public int getyear()
        {
            return year;
    }
    public int getmonth()
    {
        return month;
    }
    public int getdate()
    {
        return date;
    }
}

public class getset {
    public static void main(String[] args) {
        ymd t = new ymd();
        t.setyear(2022);
        t.setMonth(11);
        t.setdate(13);
        System.out.printf("%d년 %d월 %d일 입니다.", t.getyear(),t.getmonth(),t.getdate());
    }
}

출력 결과는 다음과 같다.

2022년 11월 13일 입니다. 

 

1.먼저 우리가 알고 있는 내용인 private 쪽을 보자.

private int year;
private int month;
private int date;

외부에서 접근 할수 없게 private로 처리를 하였다 그러면 외부 클래스에서는 호출이 불가능하다.

 

 

 

2.저번에 없던 개념인 setyear과 getyear 등이 보일 것이다.

 

set과 get을 쓰기 위해서는 메서드 이름 앞에 set과 get을 직접 넣어 줘야 된다.

public void setyear(int year){
    if(year<0) return;
    this.year = year;

set이라는 이름을 붙여 줘서 외부에서 받은 값을 year에 넣어주는 기능이 되도록 만들어 주었다.

 

3.

public int getyear()
        {
            return year;
    }

외부에서 set으로 값을 입력 받은뒤에 get으로 외부의 출력으로 보낼수있게 통로를 열것이다.

 

4.

public class getset {
    public static void main(String[] args) {
        ymd t = new ymd();
        t.setyear(2022);
        t.setMonth(11);
        t.setdate(13);
        System.out.printf("%d년 %d월 %d일 입니다.", t.getyear(),t.getmonth(),t.getdate());
    }
}

보이는것처럼 다른 클래스이다. 그런데 위와 같은 양식으로 get 과 set을 사용해 준다면 입력값들이 set과 get 메서드에 접근이 가능하게 만들어 진다.

 

 

 

 

여기까지 읽었으면 보이는점이

 

get set을 사용하려면 인스턴스 변수를 막고 메서드는 public 으로 열어 줘서 간접 접근이 가능하게 만들어야 한다는 점이다. 캡슐화에서는 get set이 이렇게 동작한다.(get set이 캡슐화에서만 쓰이는 것이 아님 다른 포스트에서 설명 예정)

 

왜냐하면 인스턴스 변수를 사용자가 직접 변경해 버리면 값이 고정이 되고 그렇게 되면 프로그램이 개발자가 설정한 값대로 흘러가지 못할 확률이 매우 높아지기 때문이다. (위에 프로그램이 5만줄 짜리 라고 생각해보자.)

 

그래서 우리는 이전 게시물에서 언급한 캡슐화의 첫번째 이유를 이해할수 있게 되었다.

 

1.정보(데이터)를 보호하기 위해서.

---------------------------------------

 

 

우리가 예제의 private 인스턴스 변수를 보면 바로 생각할수가 있는게 아... 이 전역변수는 상속 같은것도 없이 여기 클래스 안에서면 사용 되겠구나... 라고 생각할수 있다.

 

프로그램의 규모가 커지면 캡슐화는 가독성을 높혀주게되어 유지보수에 도움이 될것이다. 이로서 두번째 이유도 알게 되었다!

 

2.내부적으로만 사용하는 정보를 쉽게 알기 위해서 (유지보수에 좋겠죠?)

 

 

긴 글이였지만 쉽게 이해할수 있었으면 좋겠다.