instance of 연산자 



instaceof


참조 변수가 instanceof로 형 변환 가능한 타입인지 연산,
형 변환이 가능하다면 true로 반환, 가능하지 못하면 false 반환 한다.

부모 클래스 참조 변수 instance of 연산

class A{

}

class B extends A{

}

public class instanceOf {

        public static void main(String[] args){
            A a = new A();
            if(a instanceof Object){
                System.out.println("오브젝트 클래스 형변환 가능");
            }
            if(a instanceof A) {
                System.out.println("자신클래스 형변환 가능");
            }
            if(a instanceof B) {
                System.out.println("자식클래스 형변환가능");
            }
        }
}

//부모 타입의 객체는
오브젝트 클래스로 형변환이 가능하고 자신 클래스로 형변환이 가능하다.
자식 클래스로는 형변환이 불가능함,

class A{

}

class B extends A{

}



public class instanceOf {

        public static void main(String[] args){
            B b = new B();
            if(b instanceof Object){
                System.out.println("오브젝트 클래스 형변환 가능");
            }
            if(b instanceof A) {
                System.out.println("부모클래스 형변환 가능");
            }
            if(b instanceof B) {
                System.out.println("자신클래스 형변환가능");
            }
        }
}

//자식 타입의 객체는
자식클래스에 포함된 범위 object, 부모클래스 모든 타입들로 형 변환 가능하다.



Tom t1 = new LittleTom(); //다형성으로 이런식의 객체가 생성되면
LittleTom l = (LittleTom) t1; //형 변환 가능
        
if(t1 instanceof Tom) {
        System.out.println("x "); //어쨌든 들어있는건 LittleTom() 객체 이기 때문에 부모타입으로는 당연히
형변환이 가능하고
    }
        
        
if(t1 instanceof LittleTom) {//자식 타입으로도 형변환이 가능하다.
        System.out.println("y ");
    }



 if(little instanceof Bill) { //*상속 관계가 없어서 비교가 안되면 instanceof 연산자도 사용을 못함 *
            System.out.println("instanceof Bill");
  }




'JAVA > JAVA 기본 문법' 카테고리의 다른 글

[JAVA]- 리스트 ArrayListTest, Vector  (0) 2019.01.20
[JAVA]-#Collection API  (0) 2019.01.20
[JAVA]-interface  (0) 2019.01.20
[JAVA]-abstract  (0) 2019.01.20
[JAVA]- static  (0) 2019.01.19

#interface


인터페이스는 상수와 구현되지 않은 메서드로만 구성된다. (추상 아닌 메소드는 못들어온다)
추상아닌 메소드와 섞어서 쓰고 싶으면 추상클래스로 만들면 된다.
abstract 클래스는 꼭 추상 메소드만 들어가는게 아니라 추상이 아닌 메소드도 들어갈 수 있지만
interface는 무조건 추상 메소드만 들어가기 때문이다 !!!



interface field 는 기본적으로 public static final 수식어가 붙는다

interface method 는 기본적으로 public, abstract 붙어있다.

때문에 interface의 추상 메소드를 재정의 할때는 무조건 public을 적어줘야 한다. 상속받은 메소드 보다 접근제한자가

커져야 하는데 그 전 메소드가 public 이기 때문이다 .

interface를 implements 하면 무조건 모든 추상메소드를 재정의해줘야한다.


package com.inter;
//interface : 내부에 추상메소드만 가지고 있는 객체. 미완성 객체. 객체 생성 불가능
public interface Myinterface {
    
    //인터페이스 안의 필드는 기본으로 static 변수이다, final이 붙어있다
//총 public staitc fianl 3개가 붙어있다
    int num=100; //static, final

    public abstract void go(); //추상 메소드인데 abstract붙여도 안붙여도 똑같다 interface로 시작했기 때문에
    void stop();//인터페이스 안에 메소드는 기본으로 public abstract 붙어있다.

}



package com.inter;
//interface IShape를 상속 받아 추상 메소드를 완성 시켜 놔야 됨.
public class ICircle implements IShape{ //상속받는 키워드가 implements로 바뀜
    
int r;
    
public ICircle(int r) {
        this.r = r;
    }

    @Override
    public double getArea() { //접근 지정자를 무조건 public 으로 바꿔야한다
//아까 따로 적어주진 않았지만 interface 안에 메소드는
//public 과 abstract 붙어있다.
        return r * r * Math.PI;
    }

    @Override
    public double getCircum() {
        return 2 * r * Math.PI;
    }   
}


//interface 를 implements 해도 상속이라고 봐도 괜찮다.
class Boat{}

public class ICircle extends Boat implements IShape{

}

ICircle 입장에서 보면 Boat{} 은 클래스를 상속 받는 개념이고 IShape 도 implements로 상속 받는 개념이여서 다중 상속이 가능하다
extends 상속은 하나만 받을 수 있지만 interface는 계속해서 추가해서 넣어도 되기 때문에 다중상속이 가능.

interface Seoul{}
class Boat{}

public class ICircle extends Boat implements IShape,Seoul{

}
다 상속 관계로 묶여있음


package com.inter;

public interface Calculator { //틀
    int add(int a, int b);
    int sub(int a, int b);
    int multi(int a, int b);
    int divide(int a, int b);
}


package com.inter;

public class CalculatorImpl implements Calculator {
    
    int a;
    int b;
    
    public CalculatorImpl(int a, int b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public int add(int a, int b) {
        return a+b;
    }

    @Override
    public int sub(int a, int b) {
        // TODO Auto-generated method stub
        return a-b;
    }

    @Override
    public int multi(int a, int b) {
        // TODO Auto-generated method stub
        return a*b;
    }

    @Override
    public int divide(int a, int b) {
        // TODO Auto-generated method stub
        return a/b;
    }

    
}
//이런식으로 사용한다.


'JAVA > JAVA 기본 문법' 카테고리의 다른 글

[JAVA]-#Collection API  (0) 2019.01.20
[JAVA]- instance of 연산자  (0) 2019.01.20
[JAVA]-abstract  (0) 2019.01.20
[JAVA]- static  (0) 2019.01.19
[JAVA]- final  (0) 2019.01.19

타입상속 : 추상클래스, interface

부모 클래스에서 추상(미완성) 메소드를 자식에게 물려줌



타입 상속
여러 종류의 객체들을 하나의 배열에 넣고 핸들링 하면 좀 편하게 사용 할 수 있다.

ex) 상속 관계로 묶지 않으면 여러 클래스에서 객체를 만들고 list 에 쓸려면 각각 만들어야하는데

큰타입(부모클래스)로 만들면 부모클래스 타입으로 배열을 만들고 객체에 집어 넣을 수 있다


Shape (추상 클래스)
getArea() - 추상 메소드
getCircum() - 추상 메소드
Circle Rect TriAngle
getArea() getArea() getArea()
getCircum() getCircum() getCircum()

자식 클래스가 상속받은 추상 클래스를 완성시켜야한다.

추상클래스를 상속받을려면 무조건 오버라이딩을 해서 완성을 시키던가

아니면 자식 클래스도 추상클래스로 만들어야한다.

추상 메소드도 없는데 클래스를 추상클래스로 바꾸는 이유=> 객체 생성 못시키게 할려고


+ Recent posts