[JAVA] 상속과 다형성
key word : 상속, 다형성, 부모 클래스, 자식 클래스, Object, super, this, Overriding, extends
상속
자바의 클래스는 다른 클래스를 상속할 수 있다. 상속 되는 상위 클래스를 부모 클래스, 상속 받는 하위 클래스를 자식 클래스라고 하며 상속이 객체지향의 특징 중 하나인 다형성을 형성할 수 있게 해준다.
- 상속이란?
- 상속해주는 상위 클래스(부모 클래스)와 상속받는 하위 클래스(자식 클래스)가 있고, 부모 클래스의 멤버변수와 메소드들이 자식 클래스에게 상속된다.
- 메소드의 경우 상속 받은 자식 클래스에서 재정의할 수 있으며, 이를 Overriding이라고 부른다.
- static 변수나 메소드는 상속되지 않는다.
- 모든 클래스들의 최상위 클래스는 java.lang.Object이며 이 클래스는 11개의 메소드를 가지고 있다. toString()이나 equals()와 같이 필요한 메소드만 골라서 재정의하면 된다.
- extends 키워드가 없는 클래스의 경우 extends Object 코드가 자동으로 적용된다.
- 상속의 필요성
- 부모 클래스의 멤버변수와 메소드들을 따로 정의하지 않아도 사용할 수 있기 때문에 코드의 재생산성이 좋아진다. 유지보수가 용이할뿐더러 개발 속도도 빨라지고, 기업의 관점에서 보면 비용까지 절감된다고 볼 수 있다.
- 관련 있는 클래스들 사이의 관계를 더욱 명확히할 수 있다.
-
상속 문법
class 자식클래스명 extends 부모클래스명{ @Override // jdk 1.5부터 추가된 애노테이션으로 // 상속시에 재정의하는 메소드에 선언하는 것이 권장된다. //자식 클래스의 새로운 멤버변수와 메소드도 아래에 자유롭게 선언 가능하다. }
-
사용되는 키워드
- super
부모 클래스의 멤버를 호출할 때 .과 함께 사용한다. - super()
부모 클래스의 생성자를 호출할 때 사용. 부모 클래스에 정의된 것에 맞게 인자를 넘겨줄 수 있다. - this
자신의 객체를 참조하는 키워드. 객체 내의 멤버를 호출할 때 사용한다. - this()
동일 클래스 내의 다른 생성자를 호출하고싶을 때, 정의돼있는 인자를 함께 사용해 호출할 수 있다.
- super
- 메모리 로딩 순서 (컴파일 순서)
- 자식 클래스에서 부모 클래스의 변수와 메소드를 사용해야 하므로 객체 생성시 함께 생성돼야 함
- Object 객체 -> Parent 객체 -> Parent 멤버변수 -> Child 객체순으로 메모리에 생성됨
- 실행 순서
- 자식 클래스 먼저 실행한다.
- 재정의된 메소드를 실행하는 이유.
다형성
- 다형성이란?
- 자료형이 다른 자료형에 속할 수 있는 성질이다.
- 상속 관계에서만 다형성이 적용될 수 있다.
- API 개발 등 모든 타입을 커버해야 할 경우 사용하면 된다.
ex) println : 인자로 기본타입뿐만 아니라 String과 Object를 받을 수 있게 개발돼 있음
- 사용 예
- 부모 타입의 참조 변수가 자식 타입의 객체를 가리키게 할 수는 있으나 반대의 경우는 불가능하다.
ex) Parent p = new Childe(); -> o
Child c = new Parent(); -> x
- 부모 타입의 참조 변수가 자식 타입의 객체를 가리키게 할 수는 있으나 반대의 경우는 불가능하다.
- 형변환(casting)
- 상위 타입의 변수는 절대 하위 타입만이 가지고 있는 멤버를 호출할 수 없으므로 다운캐스팅(하위 타입으로 형변환)이 필요하다.
- 특히 API 상에 인자로 혹은 반환 타입으로 Object 타입이 쓰인 경우 필연적으로 다운캐스팅을 하여 사용하게 됨.
- 업캐스팅(상위 타입으로 형변환)은 명시적으로 하지 않아도 되나, 다운캐스팅은 명시적으로 형변환 해야한다.
ex) Child c = (Child)p