Wanna be Brilliant Full-Stack Developer

자바 Object클래스란 무엇인가? 본문

Some Memos/Java

자바 Object클래스란 무엇인가?

Flashpacker 2023. 3. 16. 23:12


Object에 대한 정의를 먼저 내리자면? Object클래스가 무엇인가? 

예전에 배웠던 object는 new가능한 대상이라고 배웠다.

지금 말하는 Object클래스는 무엇인가?

모든 클래스의 부모이다.

이게 무슨말인가?

이 두개의 클래스가 있는데! 이 두개의 클래스는 모든 오브젝트는 모든 클래스의 부모라고 했으니까!

실제로 extends  

실제로 컨트롤 클릭해서 들어가면 실제로 object라는 클래스가 있다.

Object클래스를 보면 이 Cat은 오브젝트를 익스텐즈를 안했고 DOg은 했다.

그런데 둘다 된다!? 내가 Cat클래스에 Extends Object를 하지 않더라도 모든 클래스에 생략이 되어있다!

Object는 모든 클래스의 부모이다!

 

자 그러면 모든 클래스의 부모니까 Dog는 오브젝트고 Cat도 오브젝트고 

o1과 o2는 name을 안가지고있다. 그래서 이렇게 object를 사용하면 어떤 클래스든지 타입을 묶을 수 있다.

굳이 추상클래스를 만들지 않더라도 된다.

 

이러면 묶어놓고 사용할때는 어떻게 해야하는가? 조금 불편하다.

이게 안된다!? 왜 안되는가? 이 o1은 Object 타입이다. 타입이 Object니까 앞에 Dog라고 다운캐스팅을 해야한다

.이게 무슨말인가? 설명을 한번 들어보자!

이제 Dog라는 클래스가 있는데! Cat이라는 클래스가 있는데 

이 두개는 그냥 무조건 Object의 자식이다. 자바는 모든 클래스의 부모는 Object이다.

만약에 new DOg를 하면 메모리에 Dog와 OBject가 뜬다.

내가 new cat을 하면 메모리에 cat과 object가 뜬다.

여기서 name값을 누가 들고 있는가? Dog가 들고 있다.

이상태에서 이런 코드를 우리가 적었다. Object o1 = new Dog(); 

 

그러면 o1이 가리키고 있는것은 object이다.

o2는 object이다. 그러니 당연히 o1,name은 안된다.

그럼 name을 쓰고 싶다면? 

그럼 어떻게 해야하는가?

dog타입으로 다운캐스팅을 해야한다. 타입을 아래로 내려야한다.

내릴때  타입을 Dog타입으로 맞추고 Dog d1 = o1;이라고 하면 안된다. 

왜냐하면 o1은 오브젝트 타입이니까 오브젝트 타입이 Dog타입이 될수없다. 

한칸 내린다고해서 다운캐스팅은 (괄호) 

Cat도 Cat c1 = (Cat)o2; 

이게 안되는 경우가 있는데?!  Cat c2 = (Cat)o1;은 안된다. 

왜 안되는가? 이게 지금 여기서 오류가 안나지만 이게 말이 안되는데

o1은 누구를 바라보고 있는가? 오브젝트를 바라보고 있다. o1은 Dog 메모리 공간에 OBject를 바라보고 있다!

o1을 Cat으로 다운캐스팅을 하려면 Dog로는 가능하지만 Cat으로는 다른공간으로 다운캐스팅이 안된다.

문법상으로는 오류가 안나지만 

CastException이라고 캐스팅이 안된다고 한다. 

이게 실행시에 오류가 난다.

실행하기 전에는 오류가 안나지만  

Dog는 Cat으로 다운캐스팅이 안된다.

다운캐스팅은 같은 메모리 공간에 있는 경우 자기들끼리만 된다.

 

왜 이런걸 사용하는가? 

여기서 하고 싶은것이 배열을 하나 만들어보자!

이렇게하면 이 배열에는 궁수 타입이니까 궁수밖에 저장을 못한다.

s1의 0번지에 new 궁수(); 

s1의 1번지에 new 궁수(); 이렇게밖에 저장을 못한다.

실행이 잘된다!

궁수 배열에는 궁수만 저장할 수 있는 배열이다.

내가 하고싶은것은 궁수와 전사를 같이 두개를 저장하고 싶은데 지금은 할 수 없다.

여기에는 new전사를 못한다! 

왜 안되는가? s1은 궁수 타입이기 떄문이다.

이때 Object타입으로 저장하면?! Object타입으로 저장이 되니까 첫번째는 궁수고 두번째는 전사다.
Object는 모든 클래스의 부모니까 모든 애들을 다 담을수 있다.

그러면 이제 이름을 적을떄 오류가 난다.

왜 오류가 나는가? s1은 name을 안가지고 있기 떄문이다. 

그러면 이걸 다운 캐스팅을 해야하는데? 다운캐스팅 하는 방법은? 

근데 다운캐스팅이 잘먹지 않는다. 전체를 다운캐스팅하는걸로 개념이 되고 있기 떄문이다.

여기서 괄호를 묶어서 애를 다운캐스팅한다고 명확하게 잡아줘야한다

이렇게 다운캐스팅을 해주면 된다.

이 오브젝트는 그렇게 자주 활용할일은ㅇ 없지만

어떤 타입을 묶을때 굉장히 유용하게 쓸 수 있다.

궁수와 전사의 타입을 하나로 묶을수있다.

단점이 있는데 다운캐스팅을 해야한다는것이다!