자바의 정석 기초편

접근 제어자(access modifier)

  • private: 같은 클래스 내에서만 접근이 가능
  • (default): 같은 패키지 내에서만 접근이 가능
  • protected: 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능
  • public: 접근 제한이 전혀 없음
  • public > protected > (default) > private

 

캡슐화와 접근 제어자

 

 

  • 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서

class Time{
    private int hour; //0~23 사이의 값을 가져야 함.
    private int minute;
    private int second;


    public void setHour(int hour){
        if(isValidhour(hour)) return;
        this.hour = hour;
    }

    //매개 변수로 넘겨진 hour가 유효한지 확인해서 알려주는 메서드
    private boolean isValidhour(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); //hour의 값을 21로 변경
        System.out.println(t.getHour());
        t.setHour(100);
        System.out.println(t.getHour());

    }
}

 

  • 접근제어자의 범위는 최소화 시키는 것이 좋다

다형성(polymorphism)

  • 여러가지 형태를 가질 수 있는 능력
  • 조상 타입 참조 변수로 자손 타입 객체를 다루는 것
  • 타입 불일치해도 괜찮다
  • 객체와 참조변수의 타입이 일치할 때와 일치하지 않을 때의 차이
  • 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없음
  • 참조변수의 타입은 인스턴스의 타입과 일치하는 것이 보통이지만 일치 하지 않을 수도 있음
  • 참조변수가 조상타입일 때와 자손 타입일 때의 차이
    • 참조변수로 사용할 수 있는 멤버의 갯수가 달라짐
  • 자손타입의 참조변수로 조상 타입의 객체를 가리킬 수 없음

 

참조변수의 형변환

  • 사용할 수 있는 멤버의 갯수를 조절하는 것
  • 조상 자손 관계의 참조변수는 서로 형변환 가능
  •  
public class Ex7_7 {
    public static void main(String[] args) {
        Car car = null;
        FireEngine fe = new FireEngine();
//        FireEngine fe2 = null; //car = (Car)fe; 에서 형변환이 생략됨

        FireEngine fe2 = (FireEngine)car; // 조상 -> 자손으로 형변환
        Car car2 = (Car)fe2;              // 자손 -> 조상으로 형변환
//        car2.drive(); //NullPointerException 발생.
//        fe.water();
//        fe2 = (FireEngine) fe; //자손타입 <- 조상타입, 형변환 생략 불가
//        fe2.water();
    }
}

class Car{
    String color;
    int door;

    void drive() {
        System.out.println("drive, Brrrr~~");
    }

    void stop() {
        System.out.println("stop!!");
    }
}

class FireEngine extends Car {
    FireEngine() {
    }

    void water() {
        System.out.println("water!!!");
    }
}



+ Recent posts