제어자


     - 클래스 , 변수 , 메서드의 선언부에 사용되어 부가적인 의미

     - 접근제어자와 그외 제어자

            - 접근제어자 - public protected default private

            -  그외제어자 - static , final , abstract , native 등등

     - 하나의 대상의 여러 개의 제어자 사용 가능 (단 접근 제어자는 하나만 가능)

 

 

 

static - 클래스 ,공통적인 - 멤버변수 메서드 초기화 블럭 

                 - 멤버변수 - 클래스가 메모리에 로드될때 사용

                -   메서드 - 인스턴스를 생성하지 않고 호출이 가능한 static메서드 ,인스턴스멤버들을 사용불가(static먼저 컴파일됨으로)

 

 

final - 클래스, 메서드, 멤버변수 , 지역변수

                - 클래스 - 변경될수없는 클래스 , 조상 클래스가 될수 없다.

                -  메서드 - 오버라이딩 불가

               -   멤버변수, 지역변수  - 값을 변경할 수 없는 상수

              - final은 선언과 동시에 초기화 하지만 인스턴스변수의 경우는 생성자에서 초기화 가능

    Card c = new Card("HEART",10);
        System.out.println(c.NUMBER);
        System.out.println(c.KIND);
		c.NUMBER =5  //에러
        Card c2 = new Card("DIA",8);
        System.out.println(c2.NUMBER);
        System.out.println(c2.KIND);
    }
}

class Card {
    final int NUMBER;  //상수지만 생성자에서 한번만 초기화 가능 
    final String KIND;
    static int width  = 100;
    static int height = 250;

    Card (String kind, int number)      //인스턴스에서 초기화
        this.KIND = kind;
        this.NUMBER = number;
    }
    Card() {
        this("HEART",1);
        System.out.println("생성자");
    }
    public String toString() {
        return KIND + " " + NUMBER;
    }
}

 - final도 생성자에서 인스턴스가 생성될때 한번만 초기화 가능

 - 인스턴스가 생성될때 한번만 초기화 되기 때문에 다른 인스턴스를 만들어도 다르게 초기화 된다.

 

 

 

abstract - 추상,미완성  - 클래스, 메서드

                   - 클래스  - 클래스 내에 추상메서드가 선언

                   - 메서드 - 선언부만 있고 구현부는 없는 메서드.

 

 

접근 제어자

          - 멤버 또는 클래스사용되며 외부로부터의 접근 제한 

          - private - 같은 클래스 내에서만 접근 가능

         -  default - 같은 패키지 내에서만 접근 가능

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

         - public - 접근 제한이 없음

 

생성자의 접근 제어자 - 클래스와 접근 제어자와 보통 같음.

 

 

 

다형성


다형성   - 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는것.

                        - 조상타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것.

               

Tv가 조상  CaptionTv가 자식이라고한다면

CaptionTv c = new CaptionTv();  //1
Tv t = new CaptionTv();  //2
CaptionTv c = Tv t() // 3

1은 CaptionTv클래스의  모든 변수를 사용하고

2는 Tv의 변수만 사용 가능하다. 

3은 불가능.

 

 

참조변수의 형변환

     - 서로 상속관계에만 가능

     - 자손 타입에서 조상타입 가능(생략가능)     자손-> 조상(up-casting)

              사용법 : 조상 = 자손;

     - 조상타입에서 자손타입 (생락불가)          자손 <- 조상(down-casting)

               사용법 : 자손 = (자손클래스)조상;

Car car = null;
        FireEngine fe = new FireEngine();
        FireEngine fe2 = null;
        fe.water();
        car = fe; // 조상 <- 자손
        //car.water();
        fe2 = (FireEngine)car;
        fe2.water();
    }
}

class Car {
    String color;
    int door;

    void drive() {
        System.out.println("Drive");
    }
    void stop() {
        System.out.println("Stop");
    }
}
class FireEngine extends Car {
    void water() {
        System.out.println("water");
    }
}
class Ambulance extends Car {
    void siren() {
        System.out.println("srien");
    }
}

  car.water(); 가 안되는 이유는 fe인스턴스를 참조하기는 하지만 조상클래스이기때문에 water()까지는 참조하지 못한다.

하지만 fe2는 fe인스턴스를 전체 다 참조하기 때문에 water()가 가능하다.

 

 

instanceof 연산자 - 참조변수가 참조하는 인스턴스의 실제 타입을 체크하는데 사용

                             - 연산결과가 true이면 해당타입으로  형변환 가능.

public static void main(String[] args){

    FireEngine fe = new FireEngine();

    if (fe instanceof FireEngine) {
        System.out.println("FireEngine instance");
    }
    if ( fe instanceof Car) {
        System.out.println("Car instance");
    }

 

 

 

참조변수와 인스턴스변수의 연결

              - 멤버변수가 중복정의된 경우는 참조변수타입에 영향을 받음

              - 메서드가 중복정의된 경우는 참조변수 타입에 관계없이 실제 인스턴스 타입에 정의된 메서드가 호출

자바의정석

 

매개변수의 다형성

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

 

 

+ Recent posts