써먹는 웹개발

[Java] 12강 접근 제한자와 게터(getter)&세터(setter) 본문

Study/Java & Python

[Java] 12강 접근 제한자와 게터(getter)&세터(setter)

kmhan 2021. 2. 25. 17:25


728x90
반응형

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

 

728x90
반응형


Comments