써먹는 웹개발
[Java] 12강 접근 제한자와 게터(getter)&세터(setter) 본문
12 접근 제한자와 게터 세터
1. 접근 제한자란
- 정의 : 접근 권한을 제한하는 키워드
- 목적 : 개인 정보의 접근 문제를 해결하기 위해
- 종류 : private / default / protected / public
2. public과 private
- public 키워드는 완전한 공개
private는 비공개를 의미한다.
- 차이점 : public 선언되면 외부의 접근이 가능하나, private의 경우 외부 접근이 불가능하다.
3. 게터와 세터
- 필요성 : private 선언된 필드를 외부에서 접근하기 위함
4. 요약
5. 개념 실습
1. 접근 제한자가 없다면
public class Main {
public static void main (String[] args) {
// 1. 계좌 생성
Account myAccount = new Account(1000000);
System.out.println(myAccount.toString());
// 2. 계좌 해킹
Hacker.malcious(myAccount);
// 3. 결과 출력
System.out.println(myAccount.toString());
}
}
class Account {
// 필드
int balance;
// 생성자
public Account(int balance) {
this.balance = balance;
}
// 메소드
public String toString() {
return String.format("Account { balance: %d }", balance);
}
}
class Hacker {
// 클래스 메소드 - 계좌의 잔액을 0원으로 변경
public static void malcious(Account account) {
/* 1. 파라미터 계좌의 잔액을 0으로 변경하세요. */
account.balance = 0;
}
}
2. 외부로부터 감추기 - private
public class Theif {
// 메인 메소드
public static void main(String[] args) {
// 지갑 객체 생성
Wallet wallet = new Wallet(30000);
System.out.print(wallet.toString());
// 지갑에서 돈을 모두 꺼냄
Theif.steal(wallet);
// 지갑 확인
System.out.println(" -> " + wallet.toString());
}
// 클래스 메소드
public static void steal(Wallet target) {
target.money = 0;
}
}
class Wallet {
// 필드(인스턴스 변수)
private int money; /* 1. 주어진 필드를 외부로부터 감추세요. */
// 생성자
public Wallet(int i) {
money = i;
}
// 메소드
public String toString() {
return String.format("Wallet { money: %d }", money);
}
}
3. 감춰진 필드 가져오기 - 게터(getter)
public class PersonTest {
public static void main(String[] args) {
// 객체 생성
Person park = new Person("홍팍", "010-1234-5678");
/* 1. 게터를 호출하여 필드값을 얻으시오. */
System.out.printf("이 름: %s\n", park.getName());
System.out.printf("연락처: %s\n", park.getPhoneNumber());
}
}
class Person {
// 필드
private String name;
private String phoneNumber;
// 생성자
public Person(String n, String p) {
name = n;
phoneNumber = p;
}
// 게터
public String getName() {
return name;
}
/* 2. phoneNumber 필드의 게터를 추가하시오. */
public String getPhoneNumber() {
return phoneNumber;
}
}
4. 숨겨진 필드 변경하기 - 세터(setter)
public class LockTest {
public static void main(String[] args) {
// 객체 생성
Lock lock = new Lock("123!@#");
/* 1. 세터를 호출하여, 비밀번호를 변경하시오. */
lock.setPassword("654#@!");
// 객체 정보 출력
System.out.println(lock.toString());
}
}
class Lock {
// 필드
private String password;
// 생성자
public Lock(String p) {
password = p;
}
// 메소드
public String toString() {
return String.format("Lock { password: %s }", password);
}
/* 2. 비밀번호 변경을 위한, 세터 메소드를 추가하시오. */
public void setPassword(String p){
password = p;
}
}
5. 메소드 스코프 리뷰
public class MethodScope {
public static void main(String[] args) {
// main 메소드의 지역변수 score
int score = 88;
System.out.printf("score = %d in main()\n", score);
// Record 클래스의 메소드 수행
Record.foo(score);
// main 메소드의 지역변수 score 출력
System.out.printf("score = %d in main()\n", score);
}
}
class Record {
// 클래스 메소드
public static void foo(int score) {
// printMinus10 메소드의 파라미터 score의 값을 10 감소
score -= 10;
// printMinus10 메소드의 파라미터 score의 값을 출력
System.out.printf("score = %d in foo()\n", score);
}
}
6. 스코프와 this
public class CoffeeTest {
public static void main(String[] args) {
// 커피 객체 생성
Coffee americano = new Coffee("아메리카노", 1500);
System.out.printf("커피값 인상 전 => %s\n", americano.toString());
// 커피 값 인상: 1500 -> 1800
americano.setPrice(1800);
System.out.printf("커피값 인상 후 => %s\n", americano.toString());
}
}
class Coffee {
// 필드(인스턴스 변수)
private String name;
private int price;
// 생성자
public Coffee(String name, int price) {
/* 1. this 키워드를 사용하여 필드를 초기화하세요.*/
this.name = name;
this.price = price;
}
// 세터
public void setPrice(int price) {
/* 2. this 키워드를 사용하여 필드를 변경하세요.*/
this.price = price;
}
// 메소드
public String toString() {
return String.format("Coffee { name: %s, price: %d }", name, price);
}
}
7. 리뷰: 게터/세터와 this
public class KnightTest {
public static void main(String[] args) {
// 객체 생성
Knight knight = new Knight("돈키호테",30);
// 정보 출력
System.out.println("[객체 생성]");
System.out.printf("\t%s\n", knight.toString());
// 체력 증가: 기존 체력 + 30
knight.setKnightHp(knight.getKnightHp() + 30);
// 결과 출력
System.out.println("[체력 증가 +30]");
System.out.printf("\t%s\n", knight.toString());
}
}
class Knight {
// 필드
private String name;
private int hp;
// 생성자
public Knight(String nm, int nhp){
name = nm;
hp = nhp;
}
// 게터
public int getKnightHp(){
return hp;
}
// 세터
public void setKnightHp(int plusHp){
hp = plusHp;
}
public String toString() {
return String.format("Knight { name: %s, hp: %d }", this.name, this.hp);
}
}
강의 출처 : cloudstudying.kr/lectures/201
'Study > Java & Python' 카테고리의 다른 글
[Java] 14강 상속, 클래스의 확장 (0) | 2021.02.25 |
---|---|
[Java] 13강 자바 API (0) | 2021.02.25 |
[Java] 11강 레퍼런스와 static편 학습 내용 보내드립니다. (0) | 2021.02.25 |
[Java] 10강 생성자 호출과 정의 (0) | 2021.02.25 |
[Java] 9강 클래스와 객체 (0) | 2020.11.23 |