Java

15 [인강] 자바의정석 ch07

Rosie_dev 2020. 12. 23. 14:23

| 접근제어자

  private   같은 클래스 내

  (default)   같은 패키지 내

  protected   같은 패키지 내, 다른 패키지 자손클래스 접근 가능

  public   접근제한 없음, 전체  

 

  class 앞에는 public, (default)

  void 등 멤버 앞에는 전부 가능


| 캡슐화

  외부로부터 데이터를 보호하기 위해 접근제어자 사용

  직접 접근은 막고, 메서드를 통해서 간접접근 허용

  class Time {

         private int hour;

         private int minute;

         private int second;

         public void setHour(int hour) {                       //메서드제공

                 if(isNotVaildHour(hour)) return;

                 this.hour = hour;

         }

         //매개변수로 넘겨진 hour가 유효한지 확인해서 알려주는 메서드

         //내부에서만 사용하는 메서드는 private으로

         private boolean isNotVaildHour(int hour) {

                  return hour < 0 || hour > 23;

         }

         public int getHour() {return hour;};

  }

  public class TimeTest {

         public static void main(String[] args) {

                Time t = new Time();

                t.hour = 100;

                t.setHour(21);

                System.our.println(t.getHour);

          }

  }

  //접근제어자범위 최대한 좁히기     


| 다형성

  조상타입 참조변수로 자손타입 객체를 다루는 것

  //반대의 경우는 허용안됨

  Tv t = new SmartTv();    //타입 불일치에도 가능

  참조변수가 조상인지 자손인지에 따라 사용가능한 멤버의 수가 달라짐


| 참조변수의 형변환

  사용할 수 있는 멤버의 갯수를 조절하는 것

  //기본형의 형변환: 값이 바뀜

  조상, 자손 관계의 참조변수는 서로 형변환 가능

  FrieEngine f = new FireEngine();

  Car c = (Car)f;                      //자손에서 조상타입으로 멤버 줄이는 것으로 형변환 생략가능, 안전

  FireEngine f2 = (FireEngine)c;  //조상에서 자손으로 멤버 늘리는 것으로 형변환 생략불가

  Ambulance a = (Ambulance)f;  //에러 


  public static void main(String args[]) {

          Car c = new Car();

          FireEngine fe = new FireEngine();      //실제 인스턴스가 무엇인지가 중요

          FireEngine fe2 = (FireEngine)c;         //c가 가리키는 것을 fe2에 복사, 컴파일러는 오케이, 실제 형변환 에러

          Car car2 = (Car)fe2;

          car2.drive();      //결국 car2에 저장된 값이 null이라서 NullPointerException 발생 


| instanceof 연산자

  참조변수 형변환 가능여부 확인에 사용, 반드시 사전확인 필요

  void doWork(Car c) {

         if ( c instanceof FireEngine) {

             FireEngine fe = (FireEngine)c;

             fe.water();

        else if ( c instanceof Ambulnce) {  ....  }

 

  FireEngine → Car → Object

  FireEngine fe = new FireEngine ();

  //모두 true

  System.out.println(fe instanceof Object);  

  System.out.println(fe instanceof Car); 

  System.out.println(fe instanceof FireEngine);


| 매개변수의 다형성

  다형성의 장점: 다형적 매개변수, 하나의 배열로 여러종류 객체 다루기

           Tv t = new SmartTv();

           참조변수의 형변환: 사용가능한 멤버갯수 조절

           instanceof 연산자 형변환 가능여부 확인

  참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다

  class Product {

       int price;

       int bonusPoint;

  }

  class Tv extends Product { }

  class Computer extends Product { }

  class Audio extends Product { }

  void buy(Product p) {             //조상으로 자손객체들을 가리킬 수 있다

         money -= p.price;

         bonusPoint += p.bonusPoint;

  }

  Buyer b = new Buyer();

  Tv tv = new Tv();

  Computer com = new Computer();

  b.buy(tv);

  b.buy(com);


  class Product {

         int price;

         int bonusPoint;

         Product(int price) {

                   this.price = price;

                   bonusPoint = (int)(price/10.0);

         }

  }

  class Tv1 extends Product {

       Tv1() {

              super(100);

       }

       public String toString() {return "Tv"; }

  }

  class Computer extends Product {

         Computer() { super(200); }

         public String toString() { return "Computer"; }

  }

  class Buyer {

         int money = 1000;

         int bonusPoint = 0;

         void buy (Product p) {

                if(money < p.price) {

                       System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");

                       return;

                }

                money -= p.price;

                bonusPoint += p.bonusPoint;

                System.out.println(p + "을/를 구입하셨습니다.");

         }

  }

  class Ex 7_8 {

         public static void main(String args[]) {

                  Buyer b = new Buyer();

                  b.buy(new Tv1());

                  b.buy(new Computer());  

                  System.out.println("현재 남은 돈은 " + b.money + "만원입니다.");

                  System.out.println("현재 보너스점수는 " + b.bonusPoint + "점입니다.");

          }

   }

 

'Java' 카테고리의 다른 글

17 [인강] 자바의정석 ch07  (0) 2020.12.28
16 [인강] 자바의정석 ch07  (0) 2020.12.28
14 [인강] 자바의정석 ch07  (0) 2020.12.22
13 [인강] 자바의정석 ch07  (0) 2020.12.21
12 [인강] 자바의정석 ch06  (0) 2020.12.21
댓글