클래스는 다양한 객체를 카테고리로 나누는 성격을 가지고 있다.
예시)
만약 상속을하지 않는다면
이렇게 다시 모든걸 새롭게 정의 해야만 할것이다. 하지만 상속을 받는다면.
이렇게 사용할 수있다.
1) 먼저 새로운 클래스 이름 옆에 extends + 상속받는 클래스의 이름을 적어준다.
2) 그리고 새로 선언 되는 필드가 있다면 멤버필드를 추가해 준다.
3) 상속받은 클래스는 무조건 상속받는 클래스의 생성자를 호출해야 객체를 생성할수있다. 혹시 명시된 생성자가 상속하는 클래스에 없다면 기본생성자가 호출된다.
4) 상속받는 클래스에서 슈퍼클래스의 생성자를 호출할때는 this. 이 아니라 super(매개변수) 로 사용한다.
5) 생성자에서 상속받는 클래스의 매개변수 말고도 추가 되는 변수가 있다면 그 부분은 자기 자신을 가리키는 this.을 사용해서 대입시켜준다.
6) 상속하는 클래스에서 사용하는 메서드를 서브클래스에서 새로사용하고 싶다면 같은 이름의 메서드를 새롭게 정의해서 사용한다는 개념의 오버라이딩을 해야 한다. (오버 로딩은 같은 이름으로 여러 유형을 만들어서 여러 방식으로 사용하는것을 말한다.)
<상속의 정의>
<상속받을 때 호출 순서>
Super클래스와 이를 상속받는 Sub클래스 둘을 선언해놓고.
메인문 아래에 Sub 타입으로 객체를 생성하고 출력문을 실행 하게 되면. 결과는
Super 생성자 호출
Sub 생성자 호출
n1 : 10, n2 : 20
이렇게 나온다.
순서는
1) 먼저 메인문 아래의 Sub 타입의 객체 생성문이 실행된다.
2) Sub 클래스로 객체 생성시 매개변수는 int n1 n2를 전달 받게 되는데 일때 먼저 Super 클래스의 생성자가 실행이 되면 super(n1)이 실행이 되어 n1값이 저장이 되고
SUper 클래스의 출력문이 먼저 출력이 된다.
3) 출력이 끝나면 마지막 호출 자리인 super(n1) 다음인 this.n2로 n2가 저장이 되고 Sub 클래스의 출력문이 출력된다.
4) 다시 객체 생성시 호출됐던 자리로 다시 되돌아가서 그다음 실행문인 출력문을 출력하게 된다.
예를 들어 Human 이라는 클래스를 상속 받는 Student 와 Doctor 클래스가 있다면
Human 클래스에는 없는 각 클래스의 고유 속성이나 기능이 있을 수 있다.
클래스의 고유기능이 아닌 show 부분은 오버라이딩 해두었다면, 객체 생성후 각 객체의 show는 그 클래스 고유 기능에 오버라이딩 된 show 함수로 호출이 될것이다.
만들어진 객체를 상위 개념인 Human 타입으로 참조하는 변수를 만들어준 뒤에도, show()함수를 사용 할 수있다.
show()함수는 오버라이딩되어 각 객체의 새롭게 정의된 방식으로 덮어씌어져서 그렇게 사용이 된다.
하지만 오버라이딩이 되지 않은 Doctor의 heal 함수는 그냥 사용 할수가 없다. Human 타입으로 참조하는 변수로 사용을 하기 위해서는 Human 타입을 강제 형변환 시켜 Doctor로 사용해야 한다.
또한 만든 객체를 Human 타입으로 참조하는 변수를 만들면 이를 하나의 배열로 묶어서 저장하고 사용할수있다.
예시)
동물이라는 추상 클래스를 만들고, 추상메서드도 만들었다. 추상메서는 미완성되어 있어야 하므로, 내용이 없다.
만약 이 Animal을 상속받는 고양이를 만든다면,
서브 클래스이기에 슈퍼클래스의 생성자를 호출해야 하고, 추상 클래스에서 미완성으로 만들어 두었던 메서드는 해당 클래스에 맞게 새로 오버라이딩 하여 정의 해주어야 한다.
그리고 필요하다면 해당클래스의 고유 기능을 추가 하도록 한다.
그리고 메인 클래스에서 Cat 타입의 객체를 만들면.
bark는 오버라이딩 되어있어 호출이 가능하고
grooming은 Cat 클래스의 고유 메서드라 호출이 가능하다.
만약 Cat 타입의 객체를 생성하는데 이를 참조하는 방식이 Animal 방식이라면?
오버라이딩 된 메서드 bark는 이상없이 호출되지만, grooming은 animal 타입으로 수행할수없다. 이럴때는 해당 객체의 클래스 타입을 알아볼수 있는 instanceof를 사용하여 확인하고 다운 캐스팅해서 사용이 가능하다.
a1 의 타입의 객체가 Cat 타입이라면 Cat 타입의 변수 하나를 만들어서 a1을 강제 형변화 시켜서 대입시켜주면. a1의 강제 형변환된 c2로는 grooming을 호출 할수 있다.