본문 바로가기

생활코딩/JAVA1

생활코딩) JAVA1 - 13.5. 자바 문서 보는 법 - 상속

youtu.be/LdWx-kHRoH4

자 이번 시간에는 어 자바에서 굉장히 중요한 것이라고 할 수 있고 또 너무 어렵기 때문에 여러분의 이해 못해도 전혀 힘들어 할 필요는 없는 하지만 도전해볼만한 주제인 상속이라는 것에 대해서 살펴보도록 하겠습니다. 지금 보고 있는 이 화면은 PrintWriter라고 하는 클래스의 사용 설명서 화면인데요.

 

\

   
여기 보시면 이렇게 생긴 부분이 있습니다. 자 이게 뭐냐면 PrintWriter라는 클래스는 Writer라는 클래스를 상속받았다. 즉 PrintWriter가 자식이고 Writer가 부모인 거에요. 자 그럼 Writer라는 클래스는 Object라고 하는 클래스를 상속 받았다. 즉 Object가 부모고 Writer가 자식인 겁니다. 자 그럼 이제 그게 무슨 뜻일까 를 말씀드려보면. 자 우리가 어떤 기능을 만들 때 처음부터 끝까지 다 만드는건 좀 어렵잖아요. 그래서 이 PrintWriter라는 클래스를 만든 사람이 처음부터 끝까지 다 만들기 싫은 거예요. 그래서 이미 있는 Writer라는 클래스가 갖고 있는 메소드 변수를 그대로 물려 받으면서 거기에다가 자기가 원하는 메쏘드 변수를 추가한 것이 PrintWriter 인 겁니다. 마찬가지로 Writer라는 클래스를 만든 사람은 Object라는 클래스를 상속받아서 자기의 원하는 변수와 메소드를 추가한 것입니다.

자 저는 이클립스를 켰는데요. 이클립스에서 이 PrintWriter라고 하는 저 클래스가 어떤 상속관계를 가지고 있는지를 한번 살펴보는 정말 신박한 기능을 제가 선물로 드릴게요.

 


그래서 오른쪽 클릭해 보시면 Open Type Hierachy 라는 것이 있습니다. 저것을 클릭하면 저 PrintWriter라고 하는 제가 선택한 클래스의 상속 관계를 보여 줘요 .

 

이렇게 보시면 PrintWriter는 Writer를 상속했고 Writer는 Object를 상속했다 라는 것이고 Object 클래스는 이런 메소드와 변수,(자바에서는 변수를 패드 라고 하죠) 를 가지고 있다. 그것을 Write가 상속한 것이고 Writer는 PrintWriter를 상속한 것입니다. Object가 가지고 있는 메쏘드 중에서 여기 보시면 toString이라는 굉장히 중요한 메소드가 있는데요. 저 메소드를 Writer 클래스 는 구현한 적이 없어요. PrintWriter도 구현한 적이 없습니다 자 그럼에도 불구하고 PrintWriter는 Object를 상속 받고 있기 때문에 우리가 toString 이라고 하는 메소드를 사용할 수 있는 거예요.

 

이 관계를 그림으로만 나타내 봅시다. 자 자바의 가장 기본적인 클래스, Object 클래스의 모든 클래스 는 오브젝트 클래스를 반드시 상속 받습니다.  자 아무튼 자 그리고 이제 누군가가 Writer 라고 하는 어떤 취지를 가지고 있는 클래스를 만드는데. 사실 이건 필수이기도하고 또 Object의 기능을 사용을 하고 싶기도 해서 Object를 상속 받는 거에요. 그 때 사용하는 키워드가 extends 라고 하는 겁니다. 즉 Object를 extends 에서 확장해서 Writer 클래스를 만들었다는 뜻이에요.

그리고 나서 또 누군가가 PrintWriter라고 하는 클래스를 만드는 데 처음부터 끝까지 만드는 것이 아니라 Writer 클래스를 확장해서 상속 받아서 만들고 싶은 거예요.  그럼 이렇게 하면 이런 관계가 형성이 됩니다.

 


자 이 상태에서 우리가 PrintWriter의 인스턴스를 만들고 그 인스턴스에 toString이라고 하게 되면 전 toString 오브젝트에 있다고 하면 자반 어떻게 동작 하냐. 일단은 PrintWriter 클래스에 toString 메소드가 있는지를 보고 없으면, extends 가 가리키는 Write에서 찾아봅니다. 없으면 extends가 가리키는 Object에서 찾아봅니다. 없으면 에러가 날 것이고 있으면 toString이 실행이 되는 것입니다.

 

이번엔 조금 다른 측면을 좀 살펴볼게요. Writer라는 클래스는 Write 그리고 입력값으로 스트링을 받는 메소드가 정의 되어 있어요.  자 그런데 PrintWriter에서도 Write 그리고 입력 값이 String인 메소드가 정의가 되어 있는 상태입니다. 즉 Writer에 도 있는데 그것을 상속받는 PrintWriter가 자기도 Write를 갖고 있어요. 다시 말해서 덮어쓰기 한 거예요. Write라는 메소드를.

 

자 그런 상황에서

 


우리가 p2.write("hello 2") 라고 요렇게 하게 되면 여기 있는 Write는 누구의 Write 일까요.

 


바로 PrintWriter에 있는 Write기능을 사용하는 것입니다. 자 이 관계를 그림으로 나타내 보면 

 

Writer에서 Write라는 기능을 만들었는데 PrintWriter를 만드는 사람이 저 Write가 맘에 안드는 거예요. 또는 자기 취지에 맞지 않아요. 그러면 덮어쓰기 하는 거예요 자 그랬을 때 p1.write 하면 누굴 쓴다고요? 바로 자기가 속해 있는 Write를 쓰게 된다. 자 그리고 이러한 관계를 뭐라고 하냐. PrintWriter의 Write가 Writer의 Write를 덮어쓰기했다. 영어로 Override 했다라고 부릅니다.


자 이런 용어는 중요하지 않습니다 중요한 것은 여러분이 다른 사람이 만든 클래스가 또 메소드가, 또 변수가 상속 관계에 있을 때 그것의 관개 또 그것을 메뉴얼 상에서 어떻게 해석하는 지를 파악하는 것이 중요합니다. 우리 수업에서는.

자바의 공식 사용 설명서에 보면 tree라는 것이 있습니다 져 tree는 상속 관계를 나무의 모양으로 보여준다. 이런 뜻이에요 tree. 그럼 보시는 것처럼 이렇게 나오는데요. 어마어마하게 많은 정보들이 있는데 이게 뭐냐 이 자바가 기본적으로 우리한테 제공하는 표준 라이브러리의 클래스들이 서로 간에 어떤 상속관계를 맺고 있는가를 보여줍니다. 그 정점의 누가 있냐면 바로 Obhect가 있어요.

 


그리고 이 Object가 갖고 있는 메소드들은 모든 클래스가 공통적으로 사용할 수 있는 메쏘드 이기 때문에 여러분들이 나중에 시간되시면 오브젝트 클래스가 갖고 있는 메소드의 어떤 의미, 쓰임이 이런 것들은 좀 알아 보시면 좋습니다. 그리고 이렇게 보시면 상속 관계들을 엄청나게 복잡하게 맺고 있는 것을 볼 수가 있죠. 자 이제 안 보이던 게 보이죠 여기 있는 게 어떤 의미인지 아셨구요.

제가 Writer 클래스 를 클릭했을 때, 요 밑에 나오는 요것들은 뭐냐면

 


이 Writer 클래스를 상속받은 자식들 중에 알려진 것들로는 이런 것들이 있다 라는 뜻이에요. 왜 알려져 있는 것 이란 뜻이 썼을까요. 뭐 저도 잘은 모르지만 이 표준 라이브러리가 아니라 여러분도 이 Writer라는 클래스를 상속받아서 여러분의 클래스를 만들 수 있거든요. 그런 것들은 이 공식 사용 설명서 상에는 나타나지 않기 때문에 아마 Known이라고 하는 '알려진' 이라는 표현을 쓰는 것이 아닐까란 추론을 해봅니다. 


자 다시 PrintWriter로 들어가보면 보시는 것처럼 이렇게 생겼구요. 여기 보시면 unlock 이라고 하는 어떤 그 변수 다른 말로는 필드가 Writer 라고 하는 클래스에 정의 되어 있고 그것을 상속받아서 이 PrintWriter 도 lock 이라고 하는 필드를 사용할 수 있다라는 그런 뜻입니다. 자 밑으로 조금 더 내려가 보면 이건 무슨 뜻이에요. Object라는 클래스가 갖고 있는 이러이러한 메소드를 상속 받았기 때문에 이 메소드를 사용할 수 있습니다 라는 것을 우리한테 보여주는 것이라고 할 수 있습니다.

 

자 이렇게 해서 우리 어 자바에서 문서를 보는 법과 문서를 보기 위해서 여러분이 필수적으로 좀 알고 있으면 좋은. 자바의 구조를 담당히는 친구들, 패키지, 클래스, 인스턴스, 상속 이러한 것들에 대해서 살펴봤는데요. 우리가 이제 만들지는 몰라도 사용할 줄은 알죠. 스마트폰 만들줄은 몰라도 사용할 줄 아는 알면 일단 되는 것인 것 처럼요.  여러 여기서 끝내지 마시고 내가 알고 있는걸 꺼내 보셔야 돼요. 상속 이란 무엇이고 또 상속을 했을 때 어떤 점이 좋은지 이러한 것들에 대해서 댓글로 표현해 보시고 다른 사람의 생각과 비교해 보십시오. 

 


------

* 유튜브 강의에서 자막을 추출해 정리했습니다.

-----

 

 

* 상속이란? : 상속이란 상위 클래스의 메소드나 변수를 물려받는 것? 그 덕분에 처음부터 끝까지 모든 것을 만들지 않아도 괜찮다. 예를 들어, Object에 toSpring이라는 메소드가 있으면 Object에게 상속받은 Writer라는 클래스는 toSpring이라는 메소드를 따로 정의하지 않아도 사용할 수 있음! 그리고 만약 정의되어 있는 toSpring이 마음에 들지 않으면 새롭게 정의해서 덮어쓸 수도 있다. (Override)

 

* 중요한 것: 중요한 것은 여러분이 다른 사람이 만든 클래스가 또 메소드가, 또 변수가 상속 관계에 있을 때 그것의 관개 또 그것을 메뉴얼 상에서 어떻게 해석하는 지를 파악하는 것이 중요합니다. 

 

반응형