Java/Java

접근 제한자, 게터와 세터

이게뭐여 2021. 5. 31. 21:14

1. 접근 제한자?

접근 제한자는 클래스의 필드와 메소드에 대한 접근 권한을 제한하는 키워드이다.

접근 제한자는 총 4가지의 종류가 있다.

  • private(비공개): 필드 및 메소드가 선언된 클래스 내부에서만 접근 가능
  • default(패키지 내부 공개): 필드 및 메소드가 선언된 패키지에서만 접근 가능
  • protected(상속 공개): 필드 및 메소드가 다른 패키지여도 상속관계 클래스면 접근 가능
  • public(완전 공개): 필드 및 메소드가 상속 관계 클래스가 아니어도, 다른 패키지에서 접근 가능

 

2. 게터와 세터

접근 제한자로 인해 접근이 제한된 영역에서 필드에 대해 접근하기 위해서는 게터와 세터가 필요하다.

 

1) 게터(getter)는 접근이 제한된 필드에 대해 우회적으로 접근하기 위해 사용된다.

  • 필드를 반환한다.
  • public이다.
  • 메소드명은 'get + 필드명'이다.

2) 세터(setter)는 접근이 제한된 필드값을 우회적으로 변경하기 위해 사용된다.

  • 필드값을 변경한다.
  • public이다.
  • 메소드명은 'set + 필드명'이다. 

 

3. this

클래스의 필드명과 메소드의 파라미터명이 같을 경우, 필드명과 파라미터명의 스코프 중복으로 인해 의도하지 않은 방향으로 동작할 수 있다. 이런 경우 필요한 것이 this이다.

this는 메소드 수행의 주체 객체를 가리킨다. 이 this를 통해 필드명과 파라미터명을 구분하는 명령이 가능하다.

 

 

예시 코드

public class WarriorTest {
	public static void main(String[] args) {
	    // 객체 생성
	    Warrior w1 = new Warrior("바바리안", 30);
	    // 체력 증가: 기존 체력 + 30
	    w1.setHp(w1.getHp(), 30);
	  }
}	  

class Warrior {
	  // 필드
	  private String name;
	  private int hp;
	  
	  // 생성자
	  public Warrior(String name, int hp) {
	    this.name = name;
	    this.hp = hp;
	    System.out.printf("[객체 생성]\n");
	    System.out.printf("\tWarrior { name: %s, hp: %d }\n", this.name, this.hp);
	  } 
	  
	  // 게터
	  public int getHp() {
	    return this.hp;
	  }
	  
	  // 세터
	  public void setHp(int hp, int change) {
	    this.hp = hp + change;
	    System.out.printf("[체력 증가 +%d]\n", change);
	    System.out.printf("\tWarrior { name: %s, hp: %d }\n", this.name, this.hp);
	  }
}

 

우선 위의 예시코드에서 Warrior 클래스의 필드명인 name, hp가 생성자 및 세터의 파라미터명과 중복되는 것을 볼 수 있다. 이럴 경우, 필드명의 스코프(클래스 스코프)와 파라미터명(메소드 스코프)의 스코프가 중복되기 때문에 의도한 대로 작동하지 않는 오작동이 발생한다.

그래서 this.name, this.hp를 통해 주체 객체의 필드명(this.name, this.hp)과 메소드의 파라미터명(name, hp)을 구분해주고 있다.

 

위의 예시코드에서 Warrior 클래스의 필드인 name과 hp는 private 접근제한자를 통해 접근 영역이 필드가 선언된 클래스 내부로 제한되어있다. 따라서 w1.hp로는 w1의 hp에 접근할 수 없으며, 게터와 세터를 사용해야한다.

 

getHp() { return this.hp }는 주체 객체의 hp를 반환하는 게터 메소드이다.

setHp() { .... }는 주체 객체의 hp 값을 변경하기 위한 세터 메소드이다.