개발 기록

자바의 접근제한자, getter/setter 본문

Java/javaSE

자바의 접근제한자, getter/setter

청군로 2021. 4. 29. 18:38

오늘은 접근제한자에 대해 알아보자!

 

접근제한자를 사용하는 이유

만약 내가 비밀일기를 친구와 공유하고 있다고 치자. 그럼 이 일기를 읽을 수 있는 사람은

나와 내 친구 둘 뿐일 것이다. 그런데 일기에 대해 접근 제한을 두지 않는다면, 나와 친구 둘 뿐만 아니라

부모님, 사촌, 심지어 지나가던 이웃마저 일기를 볼 수 있을 것이다! 이런 참사를 막기 위해 접근제한자를 사용해야 한다.

 

접근제한자의 종류

public < protected < default < private

(오른쪽으로 갈 수록 보안의 강도가 높아진다.)

 

1)public

public은 모두에게, 누구나 접근할 수 있게 만든다.

ex)일기를 SNS에 올려서 모두가 볼 수 있게 공개

 

2)protected

상속관계/ 같은 패키지 에게만 접근을 허락한다.

여기서 상속관계란 상속을 받은 부모와 자식 관계를 말한다.! 이런 부모 자식 관계 외에도 같은 패키지라면 접근 ok!

ex)부모님과 같은 반 친구들에게는 일기 공개

(아직 상속에 대해 깊이 배우지 않아서 내용을 추후에 추가하도록 하겠습니다.ㅜㅜ)

 

3)default

default는 접근제한자를 따로 지정해주지 않으면 기본적으로 적용되는 값이다.

default와 protected는 접근제한의 기준이 비슷하지만, default는 같은 패키지에게만 접근을 허락한다.

ex)같은 반 친구들에게만 일기 공개

 

4)private

이름에서 알 수 있듯이 가장 강력한 접근제한의 힘을 갖는다.

상속관계 같은 패키지에서도 접근을 금지하고 오직 나의 멤버만이 접근 가능하다.

ex)나만 볼 수 있지렁

 

그럼 접근제한자의 사용 예를 은행으로 들어보면

 

Bank라는 이름의 클래스가 있는데 이 클래스에는 money라는 이름의 멤버변수가 있다.

그런데 이 money변수는 은행의 돈과 직결되기 때문에 아무나 접근해서는 안된다. 이럴 때 접근 제한자를 지정해준다.

 

그럼 이제 Bank 클래스에 접근제한을 둘 것인지, money 변수에 접근제한을 둘 것인지 고민을 해봐야 한다.

만약 Bank클래스 자체에 private 접근제한을 둔다면, 다른 패키지에서는 접근조차 하지 못할 것이다.

(쓰라고 만들어 놓은 클래스에 접근조차 못하게 한다?..)

하지만 Bank클래스도 사용하라고 만든 것이기 때문에 Bank는 public으로 누구나 접근할 수 있게 만들고,

그 중 민감한 부분인 money변수에 private접근 제한을 해준다.

 

그럼 만약 은행 업무를 담당하는 직원이 다른 패키지에서 money변수에 접근을 하고자 할 때는 어떻게 접근을 해야되나

private제한자는 딱 같은 멤버까지만 접근을 허용한다. 우리는 이 점을 이용해 money에 접근해야 한다.

다른 패키지에서 money변수의 값을 가져오려고 시도하면 접근할 수 없다는 에러가 발생한다.

 

접근문제를 해결하기 위해서 멤버메서드를 같은 Bank클래스 안에 만들어준다.

이 메서드가 할 일은 money의 값을 반환 해주는 것!  메서드의 이름은 값을 가져온다는 의미에서 get+변수명을 사용

변수명이 money니까 getMoney(변수의 첫 알파벳은 대문자로 표기=>낙타등 기법을 사용하는게 약속이라고 합니다.)

getMoney는 아무나 접근할 수 없는 money의 값을 가져오는 것이 목적! 메서드의 접근 제한자는 public을 이용!

 

이때 getMoney를 이용해서 money에 아무나 접근하게 할거면 애초에 money 변수에 public을 주면 되는거 아닌가요?

이런 궁금증이 생긴다.(저는 생겼습니다. 제 기준입니다..)

 

조금 다른 점은 getMoney는 메서드의 { }중괄호 안에서 조건을 줄 수 있는데, 예를 들어 if(id == 1)

이런 식으로 조건을 만족하는 사용자를 가려낸다면, 보안의 효과를 낼 수 있다.

 

다시 getMoney의 목적은 money의 값을 반환 해주는 것이니 return을 사용하여 money를 반환한다,

public int getMoney(){ //public 뒤에 int는 반환되는 값의 자료형이다.
	return money; //getMoney 메서드와 money변수는 같은 멤버이므로 접근이 가능하다.
}

코드를 이렇게 작성하면 다른 패키지에서 getMoney메서드를 사용한다면 money변수의 값을 가져올 수 있다.

이렇게 접근이 제한된 변수의 값을 가져오는 메서드를 getter(게터)라고 부르고, 값을 변경하는 메서드는 따로 있다.

 

은행원이 잔액을 조회하는 것은 성공했는데, 잔액에 변경사항이 생겨 값을 변경해야되는 상황이 왔다. 이때

사용하는 메서드를 setter(세터)라고 한다. setter의 목적은 접근이 제한된 변수의 값을 변경할 때 사용한다.

 

getMoney가 값을 가져오기 때문에 get을 붙였다면, 변경을 뜻하는 set을 붙여 setMoney이름의 메서드를 생성하자.

//void는 반환값 즉, return 값이 없을 때 사용한다.
public void setMoney(int money){ //변경할 값을 매개변수로 받아온다!
	this.money = money; //여기서 매개변수 money와 멤버변수 money의 이름이 같으므로
    //혼란이 생길 수 있다. 이럴때는 멤버변수 money앞에 this.를 붙여준다.
    //이 this는 나중에 다뤄보겠음! this.이 붙은 변수는 멤버 변수라고 생각하면 된다.
}

이렇게 setMoney메서드를 작성하면 다른 패키지에서도 money의 값을 조작할 수 있다,

 

 

 

*내용이 정확하지 않거나, 실제 내용과 다른 부분이 있으면 댓글 부탁드립니다. 감사히 배우겠습니다!

'Java > javaSE' 카테고리의 다른 글

overriding[java]  (0) 2021.05.03
overloading [java]  (0) 2021.04.30
path설정하기[환경변수]  (0) 2021.04.27
자바의 자료형  (0) 2021.04.26
java jdk설치링크  (0) 2021.04.26
Comments