JAVA/Bootcamp 자바

최상위 클래스 Object

whyHbr 2024. 3. 13. 14:23
728x90
반응형

Object클래스를 이용해 객체 생성하기.

public class A extends Object{
    public A(){
        super();
    }
    public void display(){
        System.out.println("A. ");
    }

    public void printGO(){
        System.out.println("print go: A. ");
    }
}
//생략되어있는 것들을 추가 함.
//extends obj, public a super()
//결국은 전체가 a의 것.
//부모, 자식 뭘로 가리킬건지, 부모는 업캐스팅해야 다 가리킬 수 있다.

 

디폴트 생성자 메서드 : 클래스 이름과 이름이 같고, 리턴 타입 안되고, super() 가 생략되어 있음.

 

부모 클래스에도 extends Object 가 생략되어 있다. 즉 Object는 최상위 클래스 부모의 부모 클래스이다.

그렇다면 Object가 업캐스팅을 할 수 있을까? Object obj = new a(); 와 같이?

답은 안된다. 왤까?  -> 다운 캐스팅을 해야한다. 

 

[ 캐스팅? 타입을 변환하는 것. 형변환이라고도 함

업캐스팅 : 자식 클래스 객체가 부모 클래스 타입으로 형변환 되는 것. 자식이 부모로 위로간다. 그래서 업

다운캐스팅 : 부모 클래스가 자식 클래스 타입으로 형변환 되는 것. 업캐스팅 된 것을 다시 원 상태로 돌려줘야하는것. 부모가 자식으로 내려간다. 다운 ]

public class ObjectTest {
    public static void main(String[] args) {
        Object obj = new A(); //upcasting
        ((A)obj).display(); //downcasting
    }
}

 

Obj는 동적 바인딩을 사용해 display로 갈 수 없다

해결책: 형변환, 다운캐스팅을 해 A타입으로 바꾼 후 다시 display()를 한다.

 

 

 

Obj 클래스를 사용한 다형성 적용

a,b를 동시에 받을 수 있는 매개변수? -> 최상위 클래스 object

ex) public void display(object obj) 

다운 캐스팅을해 a,b에게 가야한다

public class ObjectPolyArg {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        display(a);
        display(b);
    }

    private static void display(Object obj) { //
        // Obj를 활용한 다형성 인수를 확인해봤다

        if (obj instanceof A) {
            ((A) obj).printGO();
        }else{
            ((B)obj).printGo();
        }
    }
}

 

새로운 객체가 생성될 때 마다 

private static void display(A a) {
        a.printGO()
;
   
}

   
private static void display(B b){
        b.printGo()
;
   
}
이렇게 private static void display()를 만들어 전달받고 전달해도 되지만,

하나의 display()로 만들어 해결 할 수 있다 

어떻게? a,b를 공통으로 받을 수 있는 인자인 object를 통해, 다형성 인수

private static void display(Object obj) {
   
if (obj instanceof A) {
        ((A) obj).printGO()
;
   
}else{
        ((B)obj).printGo()
;
   
}
}

이렇게 instance of로 형을 확인한다. 

 

 

다형성 배열로 object[] 배열 활용하기

 

public class ObjectPolyArray {
    public static void main(String[] args) {
        // a,b class를 저장할 배열을 생성
        //이게 다형성 배열
        Object[] obj =new Object[2];
        obj[0] = new A();//upcasting
      //  ((A)obj[0]).printGO();
        obj[1] = new B();//업캐스팅했다면 반드시 다운 캐스팅
       // ((B)obj[1]).printGo();

        display(obj);

    }

    private static void display(Object[] obj) {
        for(int i=0; i< obj.length; i++){
            //obj[i].printGo; obj타입이기에 불가능. 다운캐스팅을 해야
            if(obj[i] instanceof A){
                ((A)obj[i]).printGO();
            }else{
                ((B)obj[i]).printGo();
            }
        }
    }
}

a,b  를 모두 저장할 수 있는 Object[] obj = new Object[2] 를 선언한다. 이것을 다형성 배열이라고 한다. 

 

obj[1] = new A(); 와 같이 업캐스팅을 해주었다면 반드시 다운 캐스팅을 해줘야 한다. ((A)obj[1]).printGo()

  

 

 

Object클래스의 toString()메서드 

번지를 알고 싶을 때 쓰는 메서드가 toString() 인데, 우리가 오버라이딩, 재정의 해서 문자열 형태를 출력하는 것이다.

 

 

public class Board extends Object{
    private String title; //private이기 때문에 getter,setter가 필요하다

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        //부모의 tostring을 쓰고싶다면
        System.out.println(super.toString()); // 재정의 되기전, 상위클래스의 메서드
        return "Board{" +
                "title='" + title + '\'' +
                '}';
    }
}

 

ㅇprivate인 상태변수는 getterm setter가 필요하다

 

Board b = new Board();
b.setTitle("set title");
//System.out.println(b.getTitle());
System.out.println(b.toString()); //번지가 나옴.

toString()을 재정의, 오버라이딩 하지 않는다면 번지가 나온다. 

 

--------------------

다형성 - 클래스의 유지보수가 쉬워진다. 확장성이 좋아진다

다형성의 전제조건: 클래스의 상속, 재정의, 업캐스팅이 되어 있어야 한다. 

728x90

'JAVA > Bootcamp 자바' 카테고리의 다른 글

직접 만들어 사용하는 Class, Gson, Json  (0) 2024.03.14
추상클래스와 인터페이스  (1) 2024.03.13
추상 클래스, 인터페이스  (2) 2024.03.05
자바 - 다형성  (0) 2024.02.29
Downcasting, 객체형변환  (0) 2024.02.28