본문 바로가기

# 02/Java

[윤성우 열혈자바] 16-2. Object 클래스와 final 선언 그리고 @Override

반응형

모든 클래스는 Object 클래스를 상속한다.


class MyClass { ... }


상속하는 클래스가 없다면


컴파일러에 의해 다음과 같이 java.lang.Object 클래스를 상속하게 코드가 구성된다.



class MyClass extends Object { ... }



class MyClass extends OtherClass { ... }


이렇듯 다른 클래스를 상속한다면 Object 클래스를 직접 상속하지는 않게 된다.


그러나 간접적으로 (Object 클래스를 상속하는 클래스를 상속하는 형태로) Object 클래스를 상속하게 된다.










모든 클래스가 Object를 직접 또는 간접 상속하므로


// System.out.println

public void println(Object x) {

. . .

String s = x.toString();

. . .

}


모든 클래스는 Object를 상속하므로 위 메소드의 인자로 전달이 가능하다.


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









프로그래머가 정의하는 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";

}

}









클래스와 메소드의 final 선언


public final class MyLastCLS { ... }

-> MyLastCLS 클래스는 다른 클래스가 상속할 수 없음


class Simple {


// 아래의 메소드는 다른 클래스에서 오버라이딩 할 수 없음

public final void func (int n) { ... }

}








@Override


class ParentAdder {

public int add(int a, int b) {

return a+b;

}

}


class ChildAdder extends ParentAdder {

@Override

public double add (double a, double b) {

System.out.println( "덧셈을 진행합니다." );

return a+b;

}

}



오버라이딩이 아니라 상속으로 두 클래스에 걸쳐서 형성된 메소드 오버로딩이다.

(오버라이딩이 성립할려면 메소드 이름과 반환타입, 매개변수 타입, 갯수 모두 같아야함!!!!)


따라서 컴파일 오류 발생!!!


-> 이런걸 막고자 @Override 애노테이션 사용!! (안전성을 높이기 위해 사용)




@Override


상위 클래스의 메소드를 오버라이딩 하는 것이 목적이라는 선언!

오버라이딩 하는 형태가 아니면 컴파일러가 오류 메시지 전달.





반응형