728x90

이 강의는 자바의 프로젝트를 어떻게 만드는지, 또한 빌드를 어떻게 하는지에 대한 강의를 진행하지 않는다.

그러나 자바의 기본적인, 그리고 자바에 필수적인 기능들도 분명 존재하고 이 블로그엔 그 작업에 필요한 포스팅도 함께 제공하고 있다.

그 정보를 확인하고 싶다면 여기를 참조하라. 양이 조금 되고 현재진행형으로 늘어나고 있으므로 페이지내의 찾기(ctrl+f 나 cmd+f)로 찾아보도록하자.


저번시간에 부모 클래스를 super클래스라고 부른다고 하였다.

경우에 따라서 다르지만 부모클래스 보단 슈퍼클래스라는 말을 더 많이 사용하는 경향이 있다.

그 이유는 super라는 키워드가 있기 때문이다.

이번에는 이 키워드에 대해서 알아보도록 하자.


super


super라는 키워드는 this키워드와 맥락이 같다.

단 this키워드의 경우 "나의" 라는 뜻이라면 super의 경우 "내 부모의"라는 뜻이 된다는 것이다.

저번 시간의 예를 이어서 보도록하자. 약간 클래스를 변형 시켰다.


public class Book {
protected String name;
protected String publisher;
protected int page;

public Book(String name, String publisher, int page) {
this.name = name;
this.publisher = publisher;
this.page = page;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPublisher() {
return publisher;
}

public void setPublisher(String publisher) {
this.publisher = publisher;
}

public int getPage() {
return page;
}

public void setPage(int page) {
this.page = page;
}

public String toString() {
return "Book [name=" + name + ", publisher=" + publisher + ", page=" + page + "]";
}
}


Book클래스의 필드들을 protected로 선언하여서 sub클래스에서 사용할 수 있게 만들어둔다.

이제 Translation클래스를 보자. 저번과 마찬가지로 Book클래스를 상속받은 sub클래스이다.


public class Translation extends Book {
private String translator;

public Translation(String name, String publisher, int page) {
super(name, publisher, page);
}

public String getTranslator() {
return translator;
}

public void setTranslator(String translator) {
this.translator = translator;
}

public String toString() {
return "Translation [translator=" + translator + "]";
}
}


Translation클래스를 보면 생성자에 super라는 키워드가 있다.

이 말이 무엇을 의미하느냐? 여러분은 this라는 키워드로 메소드 형식으로 사용하면 그게 자기자신의 생성자를 호출하는 것이라 하였다.

여기서도 마찬가지다. super라는 클래스는 부모의 생성자를 호출하는 것이다.


이역시 생성자 규칙과 일맥상통하는 부분이 있다.

Book에는 디폴트 생성자가 없다. 그럴 경우 Translation은 마찬가지로 디폴트 생성자를 만들 수 없다.

따라서 반드시, Book의 생성자를 super라는 이름으로 호출해준다. 이는 문법상으로 강제되므로 반드시 지켜야 한다.


또한 아래의 상황을 보자.



보면 알겠지만 this처럼 super라는 이름으로 부모의 메소드,필드에 접근가능하다.

당연하지만 private에는 접근할 수 없다.


Overriding


여러분은 위의 Book과 Translation사례를 봤을때 뭔가 느껴지는게 없는가?

다시 한번 보면 Book에 toString클래스가 존재하는데 Translation에서 toString클래스가 존재한다.

상속관계에서 Translation은 Book의 모든것을 상속받는다. 따라서 잘생각해보면 toString이 이미 존재한다.

그러나 Translation에서 toString을 만들었다. 즉 이미 Book때문에 toString이 있음에도 불구하고

새로이 만든것이다. 어찌보면 오버로딩이랑 비슷한데 다른점이 있다.

오버로딩은 그래도 변수의 타입과 갯수로 메소드를 구별할 수 있다.

그러나 오버라이딩은 아예 덧쓰는 개념이다. 변수의 타입과 갯수가 동일하다.

즉 완전히 덮어 쓰는 것이다.


따라서 Translation으로 선언한 클래스에 toString을 사용할 경우 Book의 toString은 무시된다.

이러한 것을 오버라이딩이라고 부르는 것이다.

그럼 Book의 toString은 절대 못쓰는것인가?

그렇진 않다. 아래의 코드를 보자.


public class Translation extends Book {
private String translator;

public Translation(String name, String publisher, int page) {
super(name, publisher, page);
}

public String getTranslator() {
return translator;
}

public void setTranslator(String translator) {
this.translator = translator;
}

public String toString() {
return "Translation [translator=" + translator + "]";
}

public String toBookString() {
return super.toString();
}
}


+ Recent posts