오버라이딩 ( Overriding )
package overriding;
class Ferrari{
private int ye;
public Ferrari(int ye) {
this.ye = ye;
}
public int getYe() {
return ye;
}
public void speed() {
System.out.println(ye + "년식 페라리 속도 : 300km 달립니다");
}
public void onCar() {
System.out.println("자동차 시동을 켭니다!!!");
}
}
class NewFerrari extends Ferrari{
public NewFerrari(int ye) {
super(ye);
}
public void autoSystem() {
// 페라리를 상속받아 새로운 메소드를 추가
System.out.println("자동 운전모드를 실행합니다!!!");
}
public void speed() {
// 부모의 speed() 메소드를 오버라이딩 ( overriding )
// 오버라이딩 할 때는 접근제한자, 반환 자료형, 메소드명을 동일하게 해야한다
// 또한 오버라이딩을 하는 자식 클래스의 접근제한자는 부모클래스보다 크거나 같아야한다
System.out.println("500km 까지 달릴 수 있습니다!");
}
}
public class Ex01 {
public static void main(String[] args) {
NewFerrari f = new NewFerrari(2024);
f.onCar();
f.speed();
f.autoSystem();
}
}
오버라이딩 ( Overriding ) 예시
1. 오버라이딩을 할 때는 자식 클래스의 접근제한자는 부모 클래스의 접근 제한자보다 크거나 같아야 한다.
2. 오버라이딩 시 부모가 가지고 있는 메소드와 ( 접근 제한자, 반환 자료형, 메소드 이름 ) 이 동일해야 한다
package overriding;
import java.util.ArrayList;
class Test02 extends ArrayList<String>{
// ArrayList 를 상속
// get() 메소드 오버라이딩
public String get(int i) {
System.out.println( super.get(i) );
return super.get(i);
}
}
public class Ex02 {
public static void main(String[] args) {
Test02 t = new Test02();
t.add("111");
t.add("222");
t.add("333");
// 기존의 get() 메소드는 String 형태로 값을 반환만 해줌, 출력 X
// get() 메소드를 오버라이딩하여 해당 값을 바로 출력하게끔 변경
t.get(2);
// 3 출력
}
}
ArrayList 오버라이딩 예시
( 오버라이딩 코드에서 프린팅 값과 return 값에 super. 를 사용하지 않으면 자기 자신의 메소드가 재실행 되므로 무한으로 코드가 재실행되어 StackOverflowError 가 발생하기 때문에 super. 를 사용하여 부모 클래스의 값을 호출하여 사용한다.
final
package overriding;
final class Test03{
public void test() {
System.out.println("test03의 test 기능");
}
}
class TestClass03 { // extends Test03 불가
// 에러 발생 final 클래스는 상속을 받을 수 없음
public void test() {
System.out.println("Testclass03의 test 기능");
}
}
public class Ex03 {
public static void main(String[] args) {
TestClass03 t = new TestClass03();
Test03 t3 = new Test03();
// final 이 붙은 클래스는 상속을 받아 사용할 수 없으므로
// 객체화하여 사용해야 한다
t3.test();
}
}
final 을 붙이는 경우 상속, 오버라이딩 등을 변경할 수 없는 상태가 된다
위에서 만약 TestClass03 클래스가 Test03 클래스를 상속 받으려고 extends Test03 을 입력하면 컴파일 오류가 출력된다
package overriding;
class Test04{
// 메소드의 접근제한자가 protected
protected void test() {
System.out.println("부모 실행");
}
}
class TestClass04 extends Test04{
// test() 메소드 오버라이딩된 상태
// 부모 클래스의 test() 메소드가 protected 이며 오버라이딩
// 접근제한자로 설정한 것이 public 이므로 부모의 접근제한자보다
// 크기 때문에 오버라이딩이 가능하다
// 만약 부모 클래스의 접근제한자보다 작다면 오버라이딩이 불가하다 ( 컴파일 오류 )
public void test() {
System.out.println("자식 실행");
}
}
public class Ex04 {
public static void main(String[] args) {
}
}
오버라이딩 시 접근제한자는 오버라이딩 하려는 부모 클래스의 메소드보다 무조건 커야한다
package overriding;
class TestDTO{
String name;
int age;
// toString() 메소드를 오버라이딩
// 저장된 공간이 출력되는 toString() 메소드는 자체로
// 사용할 일이 많이 없기 때문에 오버라이딩하여 사용하는 경우가 많다
@Override
public String toString() {
return "[name : " + name + ", age = " + age + "]";
}
}
class Test06{
TestDTO t;
// 생성자
public Test06() { t = new TestDTO(); }
// 메소드
public void setDTO() {
t.name = "홍길동";
t.age = 200;
}
public void print() {
System.out.println(t.name);
System.out.println(t.age);
System.out.println("------------------");
System.out.println(t.toString());
// 오버라이딩 전 : overriding.TestDTO@43a25848
// 오버라이딩 후 : [name : 홍길동, age = 200]
System.out.println(t);
// 오버라이딩 전 : overriding.TestDTO@43a25848
// 오버라이딩 후 : [name : 홍길동, age = 200]
}
}
public class Ex06 {
public static void main(String[] args) {
Test06 t = new Test06();
t.setDTO();
t.print();
// 오버라이딩 전 : overriding.TestDTO@43a25848
// 오버라이딩 후 : [name : 홍길동, age = 200]
}
}
toString() 메소드를 오버라이딩
toString 메소드는 모든 자료에 다 내재되어 있으며 해당 메소드를 사용하면 저장된 메모리 공간이 출력된다, 하지만 이 기능을 사용할 일이 없으므로 오버라이딩하여 많이 사용하며 해당 메소드 오버라이딩은 DTO 클래스에서 진행하는 경우가 많다
728x90
'국비지원_핀테크' 카테고리의 다른 글
13일차_ [java] 추상 클래스 ( Abstract ), 인터페이스 ( interface ) (0) | 2024.02.21 |
---|---|
13일차_ [java] 업캐스팅 ( upcasting ), 다운캐스팅 ( downcasting ) (0) | 2024.02.21 |
12일차_ [java] 예외 처리 ( Exception ) (0) | 2024.02.20 |
12일차_ [java] 상속 ( Inheritance ) (0) | 2024.02.20 |
11일차_ [java] 미니 실습 ( 사용 시간 계산기, 스탑워치 ) (0) | 2024.02.19 |