새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능을 확장하여 클래스를 구현하기도 한다. 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할때 상속을 한다. 문법은 아래와 같다. (B 클래스가 A 클래스를 상속받음) 참고로 자바는 단일 상속만을 지원한다.
class B extends A{
}
상속 과정에서, 하위 클래스를 생성하면 상위 클래스가 먼저 생성 되고 하위 클래스의 생성자에서는 반드시 상위 클래스의 생성자를 호출 한다.
super()는 상위 클래스의 기본 생성자를 호출한다. super는 생성된 상위 클래스 인스턴스의 참조 값을 가지므로 super를 이용하여 상위 클래스의 메서드나 멤버 변수에 접근할 수 있다.
상위 클래스로 변수를 선언하고 하위 클래스의 생성자로 인스턴스를 생성할 수도 있다. [ex. Customer vc = new VIPCustomer(); ]하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로의 묵시적 형 변환(업캐스팅)이 가능하다. 반대로 상위 클래스에서 하위 클래스로의 형 변환은 불가능!
그럼 Customer vc = new VIPCustomer(); 여기에서 vc는 무엇을 가르킬까? VIPCustomer() 생성자에 의해 VIPCustomer 클래스의 모든 멤버 변수에 대한 메모리는 생성되었지만 변수의 타입이 Customer 이므로 실제 접근 가능한 변수나 메서드는 Customer의 변수와 메서드이다.
오버라이딩(overriding)이란 상위 클래스에 정의된 메서드의 구현 내용을 하위 클래스에서 동일한 이름의 메서드로 재정의하는 것이다. 앞서 설명한 vc의 변수 타입은 Customer지만 인스턴스의 타입은 VIPCustomer 이다. 자바에서는 항상 인스턴스의 메서드가 호출 된다. (가상메서드의 원리!)
다음으로 다형성(polymorphism) 이란 하나의 코드가 여러 자료형으로 구현되어 실행되는 것을 의미한다. 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나로 다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있다.
다운 캐스팅(downcasting)은 업캐스팅된 클래스를 다시 원래의 타입으로 형 변환하는 것을 의미한다. 하위 클래스로의 형 변환은 명시적으로 해야 한다.
Customer vc = new VIPCustomer(); //묵시적 (업캐스팅)
VIPCustomer vCustomer = (VIPCustomer)vc; //명시적 (다운캐스팅)
instanceof 를 이용하여 인스턴스의 형 체크가 가능하다. 아래와 같은 코드에서 인스턴스 형이 Human 이면 True, 그렇지 않으면 False를 반환한다.
추상 클래스란 구현 코드 없이 메서드의 선언만 있는 추상 메서드(abstract method)를 포함한 클래스를 의미한다. abstract 예약어를 사용하며, 추상 클래스는 인스턴스화 할 수 없다.
참고로 메서드 선언(declaration)은 반환타입, 메서드 이름, 매개변수로 구성하는 것 [ int add(int x, int y); ]/ 메서드 정의(definition)는 메서드 구현(implementation)과 동일한 의미로 구현부( {} )를 가지는 것 [ int add(int x, int y){ } ] 을 의미한다.
메서드에 구현 코드가 없거나 abstract로 선언된 메서드를 가진 클래스는 abstract로 선언한다. 모든 메서드가 구현 된 클래스라도 abstract로 선언되면 추상 클래스로 인스턴스화 할 수 없다. 추상 클래스의 추상 메서드는 하위 클래스가 상속 하여 구현하며, 추상 클래스 내의 구현 된 메서드는 하위 클래스가 공통으로 사용한다. ( 필요에 따라 하위 클래스에서 재정의 함! )
추상 클래를 응용해서 템플릿 메서드 패턴을 사용할 수 있다. 추상 메서드나 구현 된 메서드를 활용하여 코드의 흐름(시나리오)를 정의하는 메서드로, final로 선언하여 하위 클래스에서 재정의 할 수 없게 한다. final 예약어는 변수에 사용되면 값이 변경될 수 없는 상수를, 메서드에 사용되면 하위 클래스에서 재정의 할 수 없는 메서드를, 클래스에 사용되면 상속할 수 없는 클래스를 의미한다.
'etc... > 패스트캠퍼스 챌린지' 카테고리의 다른 글
Java & SpringBoot로 시작하는 웹프로그래밍 : 자바 인강 - Ch.6 (0) | 2021.12.19 |
---|---|
Java & SpringBoot로 시작하는 웹프로그래밍 : 자바 인강 - Ch.5 (0) | 2021.12.13 |
패스트캠퍼스 챌린지 최종 후기 (0) | 2021.12.07 |
패스트캠퍼스 챌린지 30일차 - Part1. Ch10 (0) | 2021.11.30 |
Java & SpringBoot로 시작하는 웹프로그래밍 : 자바 인강 - Ch.3 (0) | 2021.11.30 |