드코
3k
2019-06-27 13:16:29
6
282

자바 인스턴스화 관련해서 보고 있는데 이해가 잘 안됩니다.



package javaTest;

class A{
	public void z(){
		System.out.println("z");
	}
}

class B extends A{
	public void z(){
		System.out.println("z1");
	}
}

public class Test1 {
	public static void main(String[] args){
		

A a = new B(); // 
a.z();

B b = new B();
b.z();

B b1 = new A();
b1.z();
	}
}

오버라이딩과 같이 해서 간략하게 만들어 봤습니다

A a = new B(); a.z();

B b = new B(); b.z();

두개의 결과가 같은데 일단 각 변수에 B클래스를 부여해줘서 B클래스에 있는 오버라이드 된 z함수를 쓸 수있는건 알겠습니다.

하지만 변수 앞에 A와 B의 역할을 잘 모르겠습니다


또 마지막 세번째

B b1 = new A(); 이 구문은 에러( Type mismatch: cannnot convert from A to B ) 가 나옵니다

대강 뭐 타입이 안맞는다 이런소리같은데 이 에러도 왜 났는지 잘 이해가 안되서 물론 위에껄 이해를 해야 이해를 할 수있는 문제인거 같기도 합니다.



0
  • 답변 6

  • Frudy
    7k
    2019-06-27 13:34:01 작성 2019-06-27 13:40:57 수정됨

    왼쪽에 붙은건 타입을 의미합니다.

    int x = 3;

    변수 x의 타입은 int형입니다.


    String x = "123"

    변수 x의 타입은 String입니다.


    만약 직접 Cat클래스를 정의하고

    Cat cat = new Cat(); 한다면

    변수 cat의 타입은 Cat이라는 뜻입니다.


    다만, 차이가 있습니다.

    인스턴스 = 클래스로 부터 생성된 객체를 의미합니다.


    cat변수에는 Cat클래스로 부터 생성된 객체의 주소값이 저장되어있습니다.

    하지만


    int x = 3;은

    x변수에는 ??클래스로 부터 생성된 객체의 주소?? 뭔가 이상하죠? new연산자도 없고.

    이런 int같은것들을 primitive 타입이라고 하구요,


    new연산자로 생성해야하는 타입들을 reference type이라고 이해하시면 편할거에요.


    물론 예외로 String str = "123"; 이렇게 new연산자 없이 객체생성을 할 수 있는 경우가 있는대요,

    String은 예외적으로 reference 타입입니다.


    또한 에러메시지는요, Promotion할 수 없을때 발생하는 예외에요.

    (Promotion = 자동타입변환)


    Promotion이 되는 조건에 대해서 찾아보신다면

    java promotion rules이라고 검색해보시면 정보를 얻을 수 있을거에요.


    그리고,

    "클래스" vs "객체" vs "인스턴스" 에 대해서 찾아보시면 도움이 되실거같아요.

  • 드코
    3k
    2019-06-27 13:51:48 작성 2019-06-27 13:53:09 수정됨

    Frudy

    감사합니다

    A a = new B();
    // A라는 타입에 변수 a에  B클래스를 넣음 ( 클래스 B는 타입 A를 포함하고있어 선언이 가능 )


    B b = new B();
    //B라는 타입에 변수 b에  B클래스를 넣음 ( 클래스 B는 타입 B를포함하고있어 선언이 가능 )


    B b1 = new A();
    //B라는 타입에 변수 b1에  A클래스를 넣음 ( 클래스 A는 타입 B를포함하고있지 않아 선언이 불가능 )
    //예를들어 int라는 타입의 변수 a에 문자"가나다" 를 넣으면 "가나다는" int가 아니라 선언불가한것과 마찬가지

    타입이라고 생각되니 이렇게 이해가 됐는데 맞는지 모르겠습니다.

  • Frudy
    7k
    2019-06-27 13:55:00

    팁을 드린다면

    클래스이름을 바꿔보시는게 어때요?


    A랑 B로 생각하셔서 더욱 이해가 안되시는거같아요.

    일단 정정해드릴게요.


    ( 클래스 B는 클래스 B를포함하고있어 선언이 가능 )

    -->

    클래스 B는 클래스A를 상속하고 있기 때문에 가능.

    1. 선언이 아닙니다.

    2. 포함 --> 상속이라는말이 좀더 좋을거같습니다.


    그리고 A B 대신에, 이런건 어때요?

    class Parent

    {

    }


    class Child extends Parent

    {

    }


    class Cat

    {

    }


    class RussianBlue extends Cat

    {

    }


    이렇게 이름을 지으면 뭔가 이해가 잘되지않으세요?

    Parent parent = new Child();라던가..

  • Frudy
    7k
    2019-06-27 14:04:42
  • 드코
    3k
    2019-06-27 14:05:08


    그럼 만들어 주신거에서 만들 수 있는 인스턴스화는

    Parent parent = new parent();

    Parent parent = new Child();

    Child child = new Child();


     Cat  cat = new Cat();

     Cat  cat = new RussianBlue();

    RussianBlue  russianBlue = new RussianBlue();

    이렇게 만들 수 있는거겠네여?

    뭔가 감이 잡히는거 같습니다 감사합니다.

  • Frudy
    7k
    2019-06-27 14:07:33 작성 2019-06-27 14:07:57 수정됨

    네네 그렇습니다.


    그래서

    Parent parent = new Cat(); 이런 코드는

    아예 말이안되는 코드에요.


    삐빅 mismatch임니다!

  • 로그인을 하시면 답변을 등록할 수 있습니다.