728x90

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

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

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


프로그래밍을 하다보면 조금 다른 기능을 위해서 비슷한클래스를 마구만들어내는 경우가 있다.

예를 들면 책이라는 클래스가 있다고 치자.

자바로 코드를 짠다면 아래와 같은 모양새가 될 것이다.


public class Book {
private String name;
private String publisher;
private int 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 + "]";
}
}


그런데 만약 번역본이라는 클래스를 만드려고 한다고 치자.

번역본은 책이 가진 모든 멤버에서 역자라는 정보를 추가하려고한다.

그러면 번역본이라는 클래스는 아래와 같이 만들면 될것이다.


public class Translation {
private String name;
private String publisher;
private int page;
private String translator;

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 getTranslator() {
return translator;
}

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

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


책 클래스와 번역본 클래스의 차이는 무엇일까?

둘의 차이가 크다가 할 수 있는가?

둘의 차이는 미미하다. 그러나 차이가 없지는 않다.

이런 클래스들을 만들 때 일일히 만들어줘야하는점은 지금까지의 상식으로는 당연하게 느껴지겠지만 사실 문제점을 내포하고 있다.


예를들어서 책 클래스에 제작년도를 넣고싶다면 어찌해야하는가?

뭐 넣으면 그만이지만 번역본 클래스에도 추가해줘야하겠다.

둘은 논리적으로는 비슷하지만 클래스 구조적으로는 완전 남남이므로 둘을 같이 수정해줘야한다.

그나마 둘이라면 귀찮더라도 참고 할 수있다.

그런데 이게 여러개라면?? 귀찮은 작업을 넘어서서 커다란 문제다. 게다가 사람이 실수할 가능성역시 염두해 두어야한다.


이러한 문제점을 해결하기 위해서 나온것이 바로 상속이다.

상속이라는 것은 가 어원에서 느낄 수있듯이 특정 클래스가 특정 클래스에게 자신이 가진 모든 것을 상속시켜 주는 것이다.

그렇다면 기존의 Book클래스를 유지한채로 Translation클래스를 만드려면 어떻게 하면 좋을까?

상속이라는 개념을 제일 처음 도입해보도록하자.


public class Translation extends Book {
private String translator;

public String getTranslator() {
return translator;
}

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

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


여기서 새로보는 구문이 있다. 바로 extends이다.


extends - class와 class간에 상속을 의미한다.


이제 모든것이 상속되었다. Translation클래스는 Book클래스가 가진 모든 것을 가진다.

단 접근제한자는 그대로 유지된다. 이제 한번 Main으로 테스트를 할 시간이다.



자동완성 기능으로 접근할 수있는 멤버가 무엇인지 확인해보자. 그러면 놀랍게도 Transaltion에만 존재하는 메소드 뿐만아니라

Book에 존재하는 메소드들도 접근할 수 있다. 또한 Object클래스의 메소드들도 접근할 수 있다.

이로서 Book에 가진 모든 public멤버에 접근할 수 있음을 알 수있다.


그러면 하나 궁금증이 생긴다. Translation은 Book의 모든 멤버에 접근할 수 있는것일까?

이 역시 한번 테스트 해보자.



Translator는 부모의 모든걸 물려받는것은 맞다. 그러나 보면 알겠지만 Book의 private멤버들 (예를들자면 name이나 page)에 접근할 수없다.

이건 없는건 아니다. 분명 존재는 하나 접근을 할 수는 없다는 것이다.


그리고 자꾸 Object라는 클래스의 멤버들이 뜬다.

그 이유는 간단하다. 모든 클래스는 Object클래스를 상속 받기 때문이다.


정리


1.상속을 하면 상속받는 클래스는 상속하는 클래스에 존재하는 모든 필드 와 메소드가 상속된다.

2.기본적으로 모든 클래스는 Object클래스를 상속받는다.

3.private변수는 상속관계에서도 접근할 수 없다. 존재치 않는것은 아니나 접근을 못한다.


용어정리

Super Classs - 상속을 해준 클래스를 super클래스 혹은 parents클래스, 한국말로 슈퍼클래스나 부모클래스라고 불린다.

Sub Class - 상속을 받은 클래스를 sub클래스 혹은 derived클래스, child클래스, 한국말로 서브클래스나 자식클래스라고 불린다.


상속관계에서 자식에게"만" 접근시키고 싶다면 protected지시자를 쓰면된다.

Book의 모든 멤버를 protected로 바꿔보자.


public class Book {
protected String name;
protected String publisher;
protected int 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 + "]";
}
}


이제 다시 위처럼 접근시켜보자.



이제 보면 다시 멤버들에 접근할 수 있다.

따라서 저번에 protected는 어쩔때 쓰느냐에 대한 해답은 이것을 보면 알 수 있다.

+ Recent posts