-
오버라이드 / 오버로딩 / 클래스 상속프로그래밍/JAVA 자바 2021. 7. 24.반응형
package ex0723; public class Ex01_override { public static void main(String[] args) { //오버 라이드 User1 ob1 = new User1("1001", "홍길동"); User1 ob2 = new User1("1001", "홍길동"); System.out.println(ob1 == ob2); //주소를 비교 false //User1에서 equals() 메소드를 재정의해서 학번과 이름이 동일하면 true를 반환 System.out.println(ob1.equals(ob2)); } } class User1 { private String hak; private String name; public User1() { } public User1(String hak, String name) { this.hak = hak; this.name = name; } public String getHak() { return hak; } public void setHak(String hak) { this.hak = hak; } public String getName() { return name; } public void setName(String name) { this.name = name; } // Object 클래스의 equals() 메소드를 재정의 @Override public boolean equals(Object obj) { User1 u = (User1)obj; // Object 객체를 User1로 다운 캐스팅 return hak.equals(u.getHak()) && name.equals(u.getName()); } }
User1 클래스에서 equals를 오버라이드(재정의)를 했다.
오버라이딩 = 부모 클래스로부터 상속 받은 메소드를 자식 클래스에서 재정의 하는것
Object의 equals() 메소드를 재정의 한것.
package ex0723; public class Ex02_override { public static void main(String[] args) { // 하위 클래스에서 상위 클래스의 메소드를 재정의 Sample2 t = new Sample2(); t.print(); t.write(); } } class Test2 { int a = 10; public void print() { System.out.println("a:"+a); } } class Sample2 extends Test2 { int x = 100; public void write() { super.print(); } /* protected void print() { //컴파일 오류 재정의 되는 메소드의 접근 제어자는 크거나 같아야 한다. 위에가 public이니까 크거나 같아야 한다. System.out.println(); } */ // 메소드 override : 메소드의 시그니처가 동일해야 한다 // 상위 클래스의 메소드를 재정의하면 재정의된 상위 클래스의 메소드는 숨는다. @Override //메소드가 오버라이드 규칙에 맞는지를 검증하고 맞지 않으면 에러 public void print() { System.out.println("a:"+a+",x:"+x); } // overloading public void print(int n) { System.out.println(n); } }
@Override = 메소드가 오버라이드 규칙에 맞는지를 검증하고 맞지 않으면 에러
Test2에는 a만 있어서 a만 출력하면 되었으나
Sample2에는 x가 있다 그래서 x도 출력하려면 메소드를 새로 만들거나 오버 라이딩을 해야 하는 것이다.
package ex0723; public class Ex03_classTypecast { public static void main(String[] args) { // TODO Auto-generated method stub Test3 t = new Test3(); t.print(); //a=10, b=20 //Test3의 객체니까 Sample은 접근 불가능 //클래스는 상속 관계가 아니면 무슨 경우에도 형변환 불가능 // Integer와 Long은 형변환 불가능 // Test3(부) > Sample3(자) // up casting : 상위 클래스의 객체가 하위 클래스의 객체를 참조하는 것 // 업 캐스팅은 언제나 가능하며 형변환 하지 않아도 된다. Sample3 s1 = new Sample3(); Test3 t1 = s1; System.out.println(t1 == s1); // true 참조하는 영역이 동일하므로 동일한 객체임 System.out.println(s1.b); //100 System.out.println(t1.b); //20 업캐스팅 객체라 할지라도 필드는 자기 자신것을 나타낸다 //System.out.println(t1.c); // 컴파일 오류 Test3안에 c가 없음 // 업캐스팅 객체에서 재정의된 메소드는 숨어버리기 때문에 메소드는 하위 클래스의 메소드가 호출된다. // 이곳에서 Test3 클래스의 print() 메소드를 호출 할 방법은 없다. t1.print(); System.out.println(); t1.disp(); // t1객체가 업캐스팅 객체라 할지라도 Test3 클래스에 write() 메소드가 존재하지 않기 때문에 컴파일 오류 //t1.write(); //다운 캐스팅 : 업 캐스팅한 객체를 다시 원래 객체로 캐스팅 하는것. // 다운 캐스팅은 업 캐스팅을 했던 객체만 가능하다. // 다운 캐스팅은 반드시 강제 캐스팅을 해야 한다. Sample3 s2 = (Sample3) t1; // down casting System.out.println(s2.c); } } class Test3 { int a=10; int b=20; public void print() { System.out.println(a+":"+b); } public void disp() { System.out.println("disp..."); } } class Sample3 extends Test3 { int b=100; int c=200; @Override public void print() { System.out.println("a:"+a+",b"+b+", super.b:"+super.b+", c:"+c); } public void write() { print(); super.print(); disp(); } }
package ex0723; public class Ex04_ClassTypeCast { public static void main(String[] args) { // TODO Auto-generated method stub Test4 t1 = new Test4(); Sample4 s1 = new Sample4(); System.out.println(t1.b+", "+s1.b); //20,100 // up casting Test4 t2 = new Sample4(); Test4 t3 = s1; Object o = new Sample4(); // 오브젝트 최상위 클래스 그니까 업캐스팅 System.out.println(t2.b); //20 //필드는 무조건 자기 것 System.out.println( ((Sample4)t3).c ); // 200 다운 캐스팅 System.out.println( ((Sample4)o).c ); // 200 다운 캐스팅 t2.print(); // 메소드는 재정의된 하위 클래스 메소드를 호출(상위 메소드는 숨는다.) //t2.write(); //컴파일 오류 Test4에 없는 메소드라서 ((Sample4)t2).write(); //다운 캐스팅 //(Sample4)t2.write(); // 컴파일 오류 연산자 우선순위가 .이 더 높아서 그럼 // down casting //Sample4 s2 = (Sample4) t1; // 런타임 오류 업캐스팅 한것만 다운 캐스팅 가능 t1은 진짜 Test4의 객체임 if(t1 instanceof Sample4) { //instanceof 연산자 : 객체가 해당 클래스의 객체인지를 확인 Sample4 s2 = (Sample4) t1; System.out.println(s2); } else { System.out.println("Sample4 객체가 아님"); } //Sample4 s2 = t2; // 컴파일 오류 다운 캐스팅은 반드시 강제 캐스팅 필요 Sample4 s2 = (Sample4)t2; //다운 캐스팅 Sample4 s3 = (Sample4)t3; //다운 캐스팅 System.out.println(s2.c+","+s3.c); //200,200 Test4 t4 = (Test4)o; //다운 캐스팅 System.out.println(t4.a+","+t4.b); //10,20 필드는 무조건 자기것이 우선순위가 높다. Sample4 s4 = (Sample4)o; //다운 캐스팅 System.out.println(s4.a+","+s4.b); //10,100 } } class Test4 { int a = 10; int b = 20; public void print() { System.out.println(a+":"+b); } public void diso() { System.out.println("disp..."); } } class Sample4 extends Test4 { int b = 100; int c = 200; public void print() { System.out.println(a+":"+super.b+":"+b+":"+c); } public void write() { System.out.println("write..."); } }
instanceof 연산자 : 객체가 해당 클래스의 객체인지를 확인
package ex0723; public class Ex05_ClassTypeCast { public static void main(String[] args) { // TODO Auto-generated method stub Test5 t1 = new Test5(); Test5 t2 = new Sample5(); Test5 t3 = new Demo5(); t1.disp(); //Test5의 print. t2.disp(); //Sample5의 print.. t3.disp(); //Test5의 print. //Integer a = 10; //Long b = a; 컴오류 //Long b = (Long)a; 컴오류 } } class Test5 { public void print() { System.out.println("Test5의 print.."); } public void disp() { // write(); 컴오류 print(); } } class Sample5 extends Test5 { public void print() { System.out.println("Sample5의 print.."); } public void write() { System.out.println("write..."); } } class Demo5 extends Test5{ public void sub() { System.out.println("sub..."); } }
반응형'프로그래밍 > JAVA 자바' 카테고리의 다른 글
중첩 ,내부 ,익명 클래스 (0) 2021.07.28 추상 클래스 / 인터페이스 (0) 2021.07.26 클래스 상속, override (0) 2021.07.22 Calendar 클래스 / 날짜 형식이 올바른지 판단하기 (0) 2021.07.22 기타 API (0) 2021.07.22