본문 바로가기
* Web/[Back] Java

[Java] 자바 : 접근 제한자 private을 우회적으로 접근하는 getter, setter 이해하기

by codinguser 2021. 3. 17.

2021.03.17 - [* Language/Java] - [Java] 자바 : 접근 제한자 큰 그림 이해하기

 

[Java] 자바 : 접근 제한자 큰 그림 이해하기

자바를 공부하다 보면 접근제한자라는 개념이 나온다.(public, private, default, protected) 이 접근제한자를 전체 큰 틀에 맞춰 빠르게 이해해보자. 접근제한자란 무엇인가? 공개 범위를 결정하는 하나

codinglevelup.tistory.com

 

이전 글에서 자바 전체에서 다루는 접근제한자에 대한 전체 큰 틀을 잡아봤다.

이 중 private에 대한 이해를 해볼려고 한다.

 

 

 

 

 

생각 해보기


private을 통하면 완전 비공개를 통해 어떠한 외부에도 공개를 하지 않는다. 하지만 인가된 사람이 접근을 할려고 할 때는 어떻게 해야 할까?

 

 

 

 

 

 

해 결?  우회적으로 접근하기(getter, setter)


class bankAccount{

    // 필드

    public userNum;
    private pw;
    private balance;

    

   // 메소드
   public getter();
   public setter();

}

: private으로 선언된 이상 직접적인 접근은 불가능하다. 그렇다면 우회적으로 접근을 해야 한다. 바로 getter()와 setter()메소드 를 통해서.

 

 

 

 

정 의


* getter() - > private 필드 반환(get) CRUD 중 Read를 위한 호출이라 생각

: get - > 가져오다(받는 사람입장에선 가져 오지만 주는 입장에선 반환)

: private 필드를 우회적으로 접근 할 수 (Read) 있음.

 

* setter() - > private 필드 변경(set) CRUD중 Update 생각

: set - > Db Query문에서 set생각하면 쉽다.

: private 필드를 우회적으로 변경(Update) 가능.

 

 

 

 

코드로 살펴보기(getter, setter)


getter 예시

 

 

Problem)

: User 클래스의 필드 영역에 id와 number의 접근 제한자가 private 상황에서

Main 클래스에서 호출을 u.id, u.number로 호출하는 상황

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Main {  
  public static void main(String args[]) { 
    User u = new User("user1"1);
 
    System.out.printf("유저 아이디 : %s\n", u.id);
    System.out.printf("회원번호 : %d\n", u.number);
  } 
}
 
class User {
  private String id;
  private int number;
 
  User(id, number){
    this.id = id;
    this.number = number;
  }
}
 
cs

 

 

 

 

 

Solution)

: private 영역은 직접적인 접근이 불가능하다. 그렇기 때문에 우회적으로 접근을 해야하기 때문에

getter()로 추가해준다.(읽기 위해 가져오는 것!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Main {  
  public static void main(String args[]) { 
    User u = new User("user1"1);
 
    System.out.printf("유저 아이디 : %s\n", u.getId());
    System.out.printf("회원번호 : %d\n", u.getNumber());
  } 
}
 
class User {
  private String id;
  private int number;
 
  User(id, number){
    this.id = id;
    this.number = number;
  }
 
  public String getId(){
    return id;
  }
 
  public String getNumber(){
    return number;
  }
}
 
cs

 

: 게터 부분은 public으로 접근제한자 설정을 해줘야 한다. 그래야 접근 할 수 있으니까. 또한 반환 값을 적어야 한다.

 

 

 

 


 

 

setter예시

 

상황 : 12345 - > 67890 으로 변경

password = null

password = 12345

password = 67890 ← 최종 목표

 

 

Problem)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Main {  
  public static void main(String args[]) { 
    User u = new User("12345");
 
    u.password = "67890";
    System.out.println(u.toStr());
  } 
}
 
class User {
  private String password;
 
  public User(String pw1){
    password = pw1;
  }
 
  public String toStr(){
    return String.format("pw = %s", password);
  }
}
 
cs

 

: 잘못된 호출  User 클래스에 password의 접근제한자는 private 즉, 우회해서 변경을 해야 함.

 

 

 

 

Solution)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Main {  
  public static void main(String args[]) { 
    User u = new User("12345");
 
    u.setPassword() = "67890";
    System.out.println(u.toStr());
  } 
}
 
class User {
  private String password;
 
  public User(String pw1){
    password = pw1;
  }
 
  public String toStr(){
    return String.format("pw = %s", password);
  }
 
  public void setPassword(String pw2){
    password = pw2;
  }
}
 
cs

 

: setPassword()를 통해 전달 값인 인자를 설정해주고 해당 인자를 다시 필드 값으로 초기화

이 때 setPassword()는 반환하는게 아니라 그대로 변경하기 때문에 void로 선언 또한 get과 마찬가지로 public 접근제한자 설정

댓글