자바/자바 입문 공부일지

자바 기초 공부 일지 25. Object 클래스, final 선언, @Override 오버 라이딩

Tomitom 2022. 10. 31. 11:12
반응형

 

 

모든 클래스들은 Object 클래스를 상속합니다. 

만약 상속을 하는 클래스가 없다면 자동적으로 컴파일이 java.lang.Object 클래스를 상속한 것으로 인식합니다.

ex) class MyClass extends Object {...}

 

내가 작성한 클래스가 어떤 클래스를 상속하고 있는지 확인하기 위해서는 

Source -> Override / Implement Mathods 탭을 클릭하시면 확인할 수 있습니다. 

 

 

상속하고 있는 클래스들의 목록이 뜹니다. Object를 상시 상속하고 있는 것을 확인할 수 있습니다. 

 

 

tip) 여기서 사용하고 싶은 것들을 클릭하면 오버라이드 할 수 있는 형태들이 자동으로 양식 완성 됩니다.  ok를 누르면 출력 화면에서 확인할 수 있습니다. 

 

 

 

만약 클래스가 다른 클래스를 상속한다면 

ex) class MyClass extends OtherClass {...}

의 형태로 표현할 수 있지만 결과적으로 Other 클래스도 결과적으로는 Object 클래스의 자식 클래스 입니다. 

즉, 모든 클래스들은 간접적으로 Object 클래스를 상속하는 형태가 됩니다. 

 

예를 들어 

System.out.println
   public void println(Object x) {
      . . .
      String s = x.toString();
      . . .
   }

String 또한 오브젝트 클래스의 자식 클래스 이므로 오브젝트 안를 상속한 기능을 사용하는 것과 동일합니다. 

toString 메소드는 Object 클래스의 메소드였음을 알 수 있어요.

 

즉 String toString 의 경우 메소드를 오버라이딩 하는 것과 같은 역할을 하는 것입니다. 

 

class Cake {
   // Object 클래스의 toString 메소드를 오버라이딩
   public String toString() {
      return "My birthday cake";
   }
}

class CheeseCake extends Cake {
   // Cake 클래스의 toString 메소드를 오버라이딩
   public String toString() {
      return "My birthday cheese cake";
   }
}

 

클래스는 상속할 수 있지만 String 은 final로 선언되어 있기 때문에 상속을 할 수 없습니다. 

이렇게 final 로 선언된 클래스는 상속이 불가능합니다. 

 

public final class MyLastCLS {...}
   → MyLastCLS 클래스는 다른 클래스가 상속할 수 없음

 

메소드 또한 final 이 선언되면 오버라이딩을 할 수 없습니다. 

 

class Simple {
   // 아래의 메소드는 다른 클래스에서 오버라이딩 할 수 없음
   public final void func(int n) {...}
}

 

오버라이딩을 선언하는 방법은 @Override 을 작성함으로써 가능합니다. 

하지만 작성을 하든, 하지 않든 결과물은 동일합니다. 

한 가지 차이점은 @Override 를 선언하고 오버라이딩을 하고 오버라이딩의 규칙에 어긋나면 컴파일 오류가 발생한다는 것입니다. 

 

아래의 예제를 통해 확인해볼게요. 

 

class Runner{
	void running() {
		System.out.println("호다닥 호다닥") 
	}
		
} 

class FastRunner extends Runner{
	@Override   // 어노테이션 annotation
	void running() {
		System.out.println("도도도도"); 
		
	}
	
}

 

위에 적힌 코드처럼 작성할 경우 오버 라이딩을 할 때 @Override 을 쓰든 해당 코드를 삭제하든 동일한 결과가 출력됩니다. 

하지만 그 안에 인수를 넣었을 때, 오버 라이딩 선언을 하지 않았다면 해당 코드는 오버 로딩으로 인식하여 int의 값을 a로 인식했겠지만

오버 라이딩 선언을 했으므로 인수 a를 넣었을 때 오류가 발생합니다. 

 

 

 

오버 라이딩 한다며... 하고 뜨는 오류

 

 

반응형