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()을 재정의, 오버라이딩 하지 않는다면 번지가 나온다.
--------------------
다형성 - 클래스의 유지보수가 쉬워진다. 확장성이 좋아진다
다형성의 전제조건: 클래스의 상속, 재정의, 업캐스팅이 되어 있어야 한다.
'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 |