본문 바로가기

국비지원_핀테크

13일차_ [java] 오버라이딩 ( Overriding ), final

 

 

 

 

 

오버라이딩 ( 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