22/04/14 JAVA 11 (Class 3 상속, 오버라이딩, 다형성)
상속
상속이란? 말 그대로 부모에게 물려받아서 사용하는 것을 말하며 프로그래밍에서는 상속 관계를 맺는다고 표현한다. 쌍 방으로 성립이 되는 경우 상속을 할 수 있다. 예를 들면 동물과 인간의 관계에서는 동물-인간은 인간은 동물이고, 동물에 포함된 것은 인간이기 때문에 쌍방으로 성립하여 상속이 가능하다. 리모컨과 버튼의 경우 리모컨에는 버튼이 포함되지만, 버튼은 리모컨이 될 수 없기 때문에 상속관계가 아니다. 이러한 일방적인 관계는 나중에 인터페이스에서 다뤄볼 예정이다.
기본적으로 상속은 클래스명 뒤에 extends 와 상속할 클래스명을 쓰면서 시작된다.
먼저 Animal이란 부모클래스를 생성해서 Human 클래스와 Tiger 클래스를 이후에 생성해주는데, Human은 부모 클래스에 상속관계를 맺어보고 Tiger는 그대로 써본다.
이후에 테스트 클래스를 생성해서 Human 과 Tiger를 불러보는데 상속된 Human은 접근이 되어 move가 나타나지만, Tiger는 상속 관계가 아니기에 move가 뜨지 않는 모습을 볼 수 있다.
이를 수정하여 상속관계를 맺으면 Animal에 있는 "동물에 움직입니다." 를 가져와서 출력이 가능하다.
오버라이딩(재정의)
오버라이딩(재정의)이란? 부모클래스, 인터페이스로부터 상속 또는 구현을 하게된 메소드를 재정의하여 사용하는 기법을 말한다. 즉, 부모님께 상속받은 물건을 내가 원하는 대로 꾸며서(재정의) 다시 돌려드린다는 것이다. 이때 내가 원하는 대로 꾸며서 돌려드렸기 때문에 부모님이 받는것도 원상태의 물건이 아닌 재정의된 물건인 것이다.
위에서 "동물이 움직입니다"를 오버라이딩 하여 "사람이 두 발로 걷습니다." 로 출력해본다.
Human 클래스에서 ctrl + space를 누르면 아래와 같이 오버라이딩 표시가 되는데 이를 누르면 오버라이딩을 할 수 있다.
super는 자식이 부모에게 상속받은 멤버를 참조할 때 쓰는 것으로 내부적으로 move를 가져오고 있다는 뜻이 된다. 저 super.move를 재정의 해줘서 내가 원하는 대로 출력을하면 오버라이딩 되어 출력이 된다.
상속에서의 주의점
상속은 부모와 자식의 관계이기 때문에 이를 다시말하면 자식은 부모가 없다면 생성될 수 없으며, 항상 부모가 위에오게 된다.
이는 자식객체 위에 숨겨진 super키워드로 인한 것이며 숨겨져있다. 이는 새로운 메소드를 생성해 super 내에 문자열을 입력했을 때 그 문자열이 먼저나오면 증명이 된다.
항상 부모가 위에 있기에 코딩 순서조차도 자식이 부모보다 위로 올라오면 에러가 나게 된다.
오버라이딩의 주의점
오버라이딩은 오버로딩이랑 이름이 비슷해서 혼동이 생길수도 있는데 오버라이딩과 오버로딩은 전혀 다른것이다. 오버라이딩은 메소드를 재정의한다는 뜻이고, 오버로딩은 메소드가 같은 이름이어도 매개변수유형이나 개수가 다르면 다른 메소드를 의미한다.
상속_다형성
다형성이란 이전에도 정의했듯이 객체의 기능이 다양한 형태를 가질 수 있는 것을 말하며 업캐스팅과 다운캐스팅으로 나뉜다고 앞서 서술했다. 업캐스팅은 부모가 자식으로 형 변환하는 것으로 딱히 명시를 해주지 않아도 그대로 가져올 수 있다. 하지만 다운캐스팅은 자식이 부모로 형 변환하는 것이기 때문에 이전에 문자 정수 실수 를 형변환 할 때와 마찬가지로 형변환하고자하는 자료형을 명시해줘야 한다.
animal move는 위에서 "동물이 걷습니다." 였는데, "사람이 두 발로 걷습니다." 로 나온것은 animal을 human으로 형변환하면서 오버라이딩도 같이 됐기 때문에 그대로 가져와서이다.