본문 바로가기

자바

상속

반응형

이른바 객체지향 언어라고 불리는 자바를 공부해보려고 합니다. 기본적인 문법은 배제하고 자바의 주요 특징인 객체지향이 무엇인지 개념적인 이해 위주로 공부해 보려고 합니다. 

 

객체지향의 언어 바의 주요 특징중 하나인 상속에 대해 알아보도록 하겠습니다. 문자 그대로 부모님의 재산을 물려받아 내 것이 된다는 의미로서 자바에서는 부모 클래스 내의 존재하는 모든 것들을 모두 이어받어 자식 클래스 내에서 사용 가능하다는 것을 의미합니다.

 

부모 클래스인 pa 입니다. 생성자 pa(), pa(name, number)를 통해 객체를 생산할 수 있고 changeVariable 메서드를 통해 인스턴스 변수 name과 number를 설정할 수 있습니다.

 

부모 클래스를 상속받은 자식 클래스 child 입니다. 3가지 생성자 child(), child(name, number), child(pname, pnumber, number, number)를 객체 생성하면서 자식 클래스 또는 부모 클래스의 변수를 선언할 수 있습니다. 

 

class child extends pa 를 통해 child 클래스는 pa라는 부모 클래스를 상속했습니다.

 

자식 클래스에서 객체 하나를 생성하겠습니다.

 

자식클래스 child에서 child1이라는 객체를 하나 만들었는데 부모의 객체도 하나 만들어졌다는 것을 알 수 있습니다. 여기서 알게 된 사실 하나 자식 클래스가 객체를 생성할 때는 자동으로 부모 클래스의 객체를 생성한다는 것을 알게 되었습니다. 실제로 부모님이 계셔야 자식들이 태어날 수 있듯이 자바도 같은 이치라고 할 수 있겠습니다. 

 

 

사실 생성자 child() 이렇게 super(); 가 숨어있습니다.  생성자 제일 위에 자리잡아서 child의 객체가 만들어지기 전 먼저 부모 클래스의 객체가 생성되고 자식을 생성합니다. 그렇기 때문에 생성자가 선언될 때 출력되는 문자들의 순서가 부모가 먼저 나오는 것입니다.

 

절대로 자식생성자가 부모 생성자 보다 먼저 만들어질 수는 없습니다. 

그런데 왜 'null 가 만들어졌습니다. 그리고 나이는 0' 이렇게 name과 number 변수가 선언되지 않았을까요? 인스턴스 변수인 String name과 int number는 선언만 되고 값이 초기화되지 않았습니다. 디폴트 값인 null과 0을 가지고 있을 뿐입니다. child()와 pa()에는 변숫값을 입력하는 기능이 없기 때문입니다. 

 

그러면 메인에서 child1.name = "Alice", child1.number = 34 라고 선언하면 'Alice 가 만들어졌습니다. 그리고 나이는 34'가 출력되겠구나 라고 생각할 수 있습니다. 그런데 부모 클래스에도 자식 클래스에도 똑같은 변수명이 존재합니다.

 

'Alice 가 만들어졌습니다. 그리고 나이는 34'

 

이 문구는 누구것인가? 34세 Alice는 부모인가 자식인가 라는 의문이 들게 됩니다. 직접 확인해 보겠습니다.

 

변수 name과 number 를 수정할 수 있는 매머드 changeVariable를 통해 name = "Alice", number = 34로 바꾸겠습니다.

 

그런데 또 하나의 의문 부모, 자식 클래스에는 동일한 변수명뿐 아니라 동일한 메서드가 changeVariable(name, number)  존재합니다. 네 직접 보겠습니다. main에서 child1.changeVariable("Alice", 34); 를 입력하게 되면

 

 

자식의 변수가 변경된다는 사실을 알게 되었습니다. 그리고 부모와 자식 클래스에서 동일한 변수명이 있을 때 자신의 변수에 접근한다는 것을 보았습니다.

 

그렇다면 부모 클래스의 name과 number를 변경할 수 있는 방법이 있을까요? changeVariable(name, number)는 부모의 클래스에도 존재하는데 자식 객체가 부모의 매서드에 접근해 부모의 name number를 바꿀 수 있을까요? 

 

얼핏 보면 부모의 클래스에 존재하는 changeVariable(name, number)로 부모의 name, number를 바꿀 수 있어 보이지만

 

부모 클래스 내에서 만들어진 changeVariable(name, number)는 자식 클래스에서 오버라이드 되었기 때문에 자식 객체가 부모 클래스의 오버 라이딩되기 전 매소드를 참조할 수 없습니다. 마치 'A'를 ctl + c로 복사 해놓고 다시 'B' 를 ctl + c 로 복사하면 ctl + v는 'B'가 나오지 'A'가 나오지 않는 것과 같은 이치입니다. 

 

하지만 다른 이름을 가진 부모의 매소드 ToString()와 자식의 매소드 ToString1()를 보면

 

System.out.println(child1.ToString1()); 
자식 클래스 Bob : null number : 68

System.out.println(child1.ToString());

부모 클래스 name : null number : 0 

 

자식 객체가 부모 클래스의 매소드를 호출할 수 있습니다.

 

정리하자면 자식 클래스가 부모 클래스를 상속하게 되면 부모 클래스의 모든 변수와 메서드를 이용할 수 있습니다. 하지만 매소드가 오버 라이딩되거나 변수명이 동일하게 선언되면 이것들은 더 이상 부모의 성분이 아니게 됩니다. 

 

그렇기 때문에 이를 구별하기 위한 식별자 this와 super 가 있는데 다음 글에서는 식별자 this 와 super에 대해 알아보겠습니다. 

반응형

'자바' 카테고리의 다른 글

클래스변수, 인스턴스변수, 지역변수  (0) 2019.10.04
오버로딩과 오버라이딩의 차이  (0) 2019.09.27
오버라이딩, overriding  (0) 2019.09.21
오버로딩, 오버라이딩  (0) 2019.09.06
상속, this, super  (0) 2019.09.04