객체 지향 프로그래밍에서는 프로그래밍의 질서를 위하여 기본적으로 객체 외부에서 직접적으로 접근하는 것을 막는다.
예를 들어, 지구는 지구인은 입국이 가능하다. 하지만 외계인은 입국이 불가능하다. 지구의 질서가 흐트러질 수 있기 때문...
객체 지향 프로그램은 이러한 직접적인 접근은 지향하고, get,set 메소드를 통해 간접적으로 데이터를 변경하는 방법을 선호한다.
객체를 생성했을 때, 필드값을 private으로 한 경우 get과 set을 통해 값을 가지고 오거나 변경해준다.
연습했던 은행 코드로 확인해보자
아래의 코드느 1000원의 파라메터값을 private 으로 정해주지 않아서 , 어느 누구나 balance를 변경할 수 있다.
Hacker라는 객체가 A1 계좌를 받아 잔액을 0으로 설정하면 그대로 잔액이 0으로 변경된다.
public class Main{
public static void main(String[] args){
Account A1 = new Account(1000); // 1000원이 있는 계좌 생성
A1.letsPrint();
Hacker.thief(A1);
A1.letsPrint();
}
}
calss Account{
int balance;
public Account(int balance){
this.balance = balance;
}
public void letsPrint(){
System.out.printf("잔액은 %d원 입니다",balance);
}
}
class Hacker{
public static void thief(Account hacker){
hacker.balance = 0;
}
}
위의 상황을 방지하기 위하여 나온것이 private으로 필드에 접근지정자를 해주면, get 을 써야만 파라메터값에 접근할 수 있다.
참고로 여기서 A1은 계속해서 메모리가 복사되니까 reference 변수로 볼 수 있다
public class Practice{
public static void main(String[] args){
Account A1 = new Account(1000); // 1000의 계좌 생성
Customer.check(A1); // a1객체를 넣어서 잔액확인
}
}
class Account{
private int balance; //접근 지정자를 private으로 함
public Account(int balance){
this.balance = balance;
}
public int getBalance(){
return balance; //getBalance()호출시 필드값 호출한다.
}
}
class Customer{
public static void check(Account balance){
System.out.printf("잔액: %d원 \n" , balance.getBalance());
}
}
getter와 setter를 쓰는 법을 더 자세히 알아보자
지구는 외계인이 직접적으로 접근하지 못하도록 막고,
지구인이 지구에 들어 올 수 있는 방법을 알려줌
즉, 데이터는 외부에서 접근하지 못하도록 막고, 메소드만 공개하여
외부에서 메소드를 통해 데이터에 접근하도록 유도한다.
이러한 역할을 하는 메소드 Setter
void setEarthLanguage(int langauge){
if(language < 0){ //언어 능력이 0보다 아래면, 필드에 0으로 저장하고 실행
this.french = 0;
return;
} else{
this.language = language;
}
}
Setter의 경우 값을 수정해야하기 떄문에 파라메터값이 존재한다
또한 return 타입도 메소드 안에서 파라메터값을 바로 수정하는 것이기 떄문에 void로 해준다.
하지만. 이처럼 객체 외부에서 객체 필드값을 사용하기 부적절한 경우가 있다.
이런 경우, 메소드로 필드값을 가공 후 , 외부로 전달 할 수도 있음
이런 역할을 하는 메소드 Getter
int getLanguage(){
int fluent = language * 10;
return fluent;
}
외계인이 language테스트를 보면 10을 곱해서 리턴해준다.
Getter의 경우 값을 바로 보내는 것이기 떄문에 리턴타입이 있다.
대신 따로 파라메터값은 지정해주지 않는데 이는 변수값만 가져오는 것이기 때문에 변수값을 수정해주는 setter와는 다르게 따로 할필요가 없다.
필트 타입이 boolean일 경우 , getter는 get으로 시작하지 않고 is로 시작한다.
private boolean stop;
//getter
public boolean isStop(){
return stop;
}
//setter
public void setStop(boolean stop){
this.stop = stop;
}
'Java' 카테고리의 다른 글
this참조 변수와 this()메소드 (0) | 2022.01.07 |
---|---|
i++랑 ++i의 차이점 (0) | 2022.01.07 |
== 와 .equals의 차이점 (0) | 2022.01.07 |
레퍼런스 타입과 레퍼런스 변수 (0) | 2022.01.07 |
static 키워드 정리 (메소드) (0) | 2022.01.07 |
댓글