클래스 상속
- 새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능을 확장하여 클래스를 구현함
- 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할때 기존 클래스를 상속함
- 이미 개발된 클래스를 재사용, 중복코드를 줄여준다.
- 부모(상위)클래스의 필드나 메서드는 자식(하위)클래스의 소유로 사용할 수 있다.
- 자바의 다형성을 보여준다.
- 상속은 클래스간의 결합도가 높은 설계
💡 상속 문법
public class 자식클래스(현재 파일 클래스 명) extends 부모클래스 { }
※ extends 키워드 뒤에는 단 하나의 클래스만 올 수 있음
= 자식은 한명의 부모로 부터만 상속이 가능하다.
= 자바는 단일 상속(single inheritance)만을 지원함
💡 상속이 가능한 경우
클래스 상속 ⇒ 트럭은 차이다. ⇒ YES
클래스 상속 ⇒ 사람은 차이다. ⇒ NO
- 상위 클래스는 하위 클래스 보다 더 일반적인 개념과 기능을 가짐
- 하위 클래스는 상위 클래스 보다 더 구체적인 개념과 기능을 가짐
- 하위 클래스가 상위 클래스의 속성과 기능을 확장 (extends)한다는 의미
💡 자식클래스를 사용할때, 부모클래스의 필드(변수)와 메서드 사용이 가능한 이유?
자식을 호출하면 부모가 먼저 호출된다!
모든 객체는 생성자를 호출해야지 생성이 된다.
부모 클래스는 자식클래스 생성자의 맨 첫줄에 숨겨진 super() 에 의해 호출된다.
※ super() 는 하위 클래스에서 가지는 상위 클래스에 대한 참조 값이다.
상위 클래스의 기본 생성자를 호출하는데, 코드에 적지 않아도 defult로 생성된다.
super에서 상위 클래스의 인스턴스 참조값을 가지므로 상위 클래스의 메서드나 멤버 변수에 접근할 수 있다.
- 모든 클래스에 디폴트 생성자가 꼭 필요한 이유이기도 하다.
만약 부모 클래스에 디폴트 생성자가 없다면 부모 클래스를 불러올 수 없다.
1) 매개 변수가 없는 부모
public class 부모클래스 {
private String model;
private String color;
//생성자 선언
public 부모클래스(){
System.out.printIn("생성자 실행")
}
}
public class 자식클래스 extends 부모클래스 {
private int number;
//생성자 선언
public 자식클래스(int number){
super(); //부모클래스 호출
this.number = number;
}
}
2) 매개 변수가 있는 부모
public class 부모클래스{
private String model;
private String color;
//생성자 선언
public 부모클래스(String model,String color){
System.out.printIn("생성자 실행")
}
}
public class 자식클래스 extends 부모클래스 {
private int number;
//생성자 선언
public 자식클래스(int number){
super(매개값, 매개값, .....); //부모클래스 호출
this.number = number;
}
}
💡업 캐스팅 ( Up Casting ) - 형 변환
부모클래스 vc = new 자식클래스();
- 상위 클래스의 변수에 하위 클래스 생성자로 인스턴스를 생성 할수 있다.
- 하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로 묵시적 형변환이 가능하다.
- 상속 관계에서 모든 하위 클래스는 상위 클래스로 형 변환(업캐스팅)이 가능하며 반대로는 불가능하다
- 부모 클래스로 형 변환 된 자식 클래스는 부모클래스의 변수와 메서드만 사용 가능하다. (*오버라이딩 된 메서드 제외)
💡다운 캐스팅 ( Down Casting ) - 형 변환
※ 참조 변수가 클레스를 참조하고 있는지 확인하고 형변환을 해주어야 안전하다.
참조변수 instanceof 클레스
원래 인스턴스의 형이 맞는지 여부를 체크하는 키워드 맞으면 true 아니면 false를 반환한다.
GeneraMember g1 = new GeneraMember("id_a", "홍길동", "서울시" , "일반");
SpecialMember bb = (SpecialMember) g1;
if(g1 instanceof SpecialMember){
SpecialMember sm = (SpecialMember )g1
sm.printPoint();
}
💡 자식 클래스에서 부모 클래스의 메서드 오버라이딩 (Overring)
상위 클래스에 정의된 메서드의 구현 내용이 하위 클래스에서 구현할 내용과 맞지 않는 경우, 하위 클래스에서 동일한 이름의 메서드를 재정의 할 수 있다.
@overriding 어노테이션을 사용하여 재정의된 메서드라는 정보를 제공할 수 있다.
자식 클래스가 부모클래스로 형변환이 되어도 오버라이딩 된 자식 클래스의 메서드는 사용이 가능한 이유? 자바의 모든 메서드는 가상 메서드 이다.
가상 메서드 테이블(vitual method table)에서 해당 메서드에 대한 주소값을 가지고 있는데, 오버라이딩으로 재정의 된경우 재정의되어진 메서드의 주소를 가르킨다.
다형성이란 ?
- 하나의 코드가 여러 자료형으로 구현되어 실행되는 것이다.
- 같은 코드에서 여러 다른 실행 결과가 나올 수 있다.
- 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징이다.
- 다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있다.
💡 다형성을 사용하는 이유?
- 상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있다.
- 다형성이 없는 경우 많은 if-else if문이 구현되고 코드의 유지보수가 어려워진다.
- 상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능 구현할 수 있다.
- 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있다.
※ 도형이라는 부모 클래스로 모든 자식 클래스를 핸들링 할수 있다.
ArrayList<도형> 도형리스트 = new ArrayList<도형>();
도형 사각형 = new 사각형();
도형 삼각형 = new 삼각형();
도형 원 = new 원();
도형 [] arr = {new 사각형(),new 삼각형(),new 원()};
//향상된 for문
for(도형 도형그리기 : 도형리스트){
도형그리기.draw();
}
'BackEnd > JavaProgram' 카테고리의 다른 글
[ JAVA ] 추상 클래스 abstract / 템플릿 메서드 (0) | 2023.03.15 |
---|---|
디자인 패턴 (0) | 2023.02.23 |
[ JAVA ] 자바 배열 문법 3 / 배열 메서드 ( Arrays ...) (0) | 2023.02.01 |
[ JAVA ] 자바 배열 문법 2 / 객체 배열 (0) | 2023.02.01 |
[ JAVA ] 자바 배열 문법 1 / 1차원 배열과 2차원 배열 (0) | 2023.02.01 |