[JAVA]Getter와 Setter /접근제한자(Public, Protected, Private, Default)2

@욕심쟁이

·

2020. 8. 18. 14:02

반응형

1. Getter 메서드

   - 내부의 멤버변수에 저장된 값을 외부로 리턴
   - 매개변수는 없고, 리턴값만 있는 메서드로 정의
   - 메서드명은 주로 getXXX() 형식으로 지정(XXX 은 해당 멤버변수의 변수명을 사용)
      (ex. int 타입 변수 num 의 Getter 메서드 이름 : getNum())


2. Setter 메서드

   - 외부로부터 데이터를 전달받아 멤버변수에 저장
     → 매개변수만 있고, 리턴값은 없는 메서드로 정의           
     → 메서드명은 주로 setXXX() 형식으로 지정(XXX 은 해당 멤버변수의 변수명을 사용)
         (ex. int 타입 변수 num 의 Setter 메서드 이름 : setNum())    

예시1)

public class Ex {

	public static void main(String[] args) {
		// Person 클래스의 인스턴스 생성
		// 다음과 같이 데이터를 저장한 후 출력
		// 이름 : 홍길동
		// 나이 : 20
		Person p = new Person();
//		p.name = "홍길동"; 
		// => private 접근제한자로 지정된 멤버변수는 외부에서 접근 불가능
//		System.out.println("이름 : " + p.name);
		
		// Setter 메서드(setName())를 호출하여 name 에 저장할 이름을 전달
		p.setName("홍길동");
		
		// Getter 메서드(getName())를 호출하여 name 에 저장된 이름을 출력
		System.out.println("이름 : " + p.getName());
				
//		p.age = 20;
//		System.out.println("나이 : " + p.age);
// => private 접근제한자로 지정된 멤버변수는 외부에서 접근 불가능
		p.setAge(20);
		System.out.println("나이 : " + p.getAge());
		
	}

}

class Person {
	// 주로, 멤버변수(인스턴스 변수)는 외부에서 함부로 접근할 수 없도록
	// private 접근제한자를 사용하여 접근을 제한한다.
	private String name;
	private int age;

	// -------------------------------------------------------
	// 단축키를 활용한 Getter/Setter 메서드 자동 생성
	// 단축키 : Alt + Shift + S -> R
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	// -------------------------------------------------------
	
	// 인스턴스 변수 name 에 접근할 Getter/Setter 메서드 정의
	// => 누구나 접근할 수 있도록 접근제한자 public 사용 
	// 1) Getter 정의(매개변수는 없고, 리턴값만 있는 메서드)
//	public String getName() {
//		// 인스턴스 변수 name 값을 리턴
//		return name;
//	}
	
	// 2) Setter 정의(매개변수만 있고, 리턴값은 없는 메서드)
//	public void setName(String newName) {
//		// 외부로부터 전달받은 newName 값을 인스턴스 변수 name 에 저장
//		name = newName;
//	}
	
	// 변수 age 에 대한 Getter/Setter
//	public int getAge() {
//		return age;
//	}
	
//	public void setAge(int newAge) {
//		age = newAge;
//	}
	


	// private 으로 선언된 멤버도 같은 클래스 내에서 자유롭게 접근 가능
	// => 같은 클래스 내에서 접근 시 참조변수명 없이 이름만 지정
	public void print() {
		System.out.println("이름 : " + name);
		System.out.println("나이 : " + age);
	}
	
}

예시2)

public class Test {

	public static void main(String[] args) {
		/* 
		 * Account 클래스의 인스턴스 생성 및 다음과 같이 데이터 저장, 출력
		 * 계좌번호 : 111-1111-111
		 * 예금주명 : 홍길동
		 * 현재잔고 : 100000원
		 */
		Account acc = new Account();
		// Account 클래스의 멤버변수들은 모두 private 접근제한자이므로
		// 외부 클래스에서 인스턴스 생성 후 직접 접근이 불가능하다!
//		acc.accountNo = "111-1111-111";
//		acc.ownerName = "홍길동";
//		acc.balance = 100000;
		acc.setAccountNo("111-1111-111");
		acc.setOwnerName("홍길동");
//		acc.setBalance(100000); // private 메서드는 외부에서 접근 불가
		// => 대신 deposit() 또는 withdraw() 메서드로 입/출금 기능 활용
		
		
//		System.out.println("계좌번호 : " + acc.accountNo);
//		System.out.println("예금주명 : " + acc.ownerName);
//		System.out.println("현재잔고 : " + acc.balance + "원");
		System.out.println("계좌번호 : " + acc.getAccountNo());
		System.out.println("예금주명 : " + acc.getOwnerName());
		System.out.println("현재잔고 : " + acc.getBalance() + "원");
	}

}

/*
 * Account 클래스 정의
 * - 멤버변수
 *   1) 계좌번호(accountNo, String)
 *   2) 예금주명(ownerName, String)
 *   3) 현재잔고(balance, int)
 */
class Account {
	private String accountNo;
	private String ownerName;
	private int balance;
	
	// 멤버변수들에 대한 Getter/Setter 정의

	public String getAccountNo() {
		return accountNo;
	}
	public void setAccountNo(String accountNo) {
		this.accountNo = accountNo;
	}
	public String getOwnerName() {
		return ownerName;
	}
	public void setOwnerName(String ownerName) {
		this.ownerName = ownerName;
	}
	public int getBalance() {
		return balance;
	}
		
	// 은행계좌에서 현재잔고를 직접 수정하는 것은 좋지 못하므로
	// setBalance() 메서드를 제외하거나, private 으로 선언하면 된다!
	private void setBalance(int balance) {
		this.balance = balance;
	}
}
반응형