JAVA/이론 정리 및 예제
[JAVA/자바] #8_1 상속 / 예제
chaewon
2021. 9. 17. 18:19
상속
- 다른 클래스가 가지고 있는 멤버(필드와 메소드)들을 새로 작성할 클래스에서 직접 만들지 않고, 상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있게 만든 기술
- = 부모가 가지고 있는 맴버에 해당하는 것을 중복 작성없이 물려받아 자식것만 따로 작성하기만 하면 되는것
상속의 목적*
- 클래스의 재사용, 명확한 특성이나 추가적인 메소드를 더해서 구체적인 타입으로 만드는것
상속의 장점*
- 보다 적은 양의 코드로 새로운 클래스를 작성 가능
- 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경이 용이함
- 부모 클래스(공통 코드)를 하나의 클래스로 관리하면서 유지보수가 용이하다
- 코드의 중복을 제거하여 프로그램의 생산성과 유지보수성이 증가한다.
표현식
- 클래스간의 상속시에는 extends 키워드 사용함
[접근제한자] class 클래스명 extends 클래스명{}
상속받는 클래스 상속하는 클래스
후손클래스 상위클래스
자식클래스 부모클래스
파생클래스 선조클래스
서브(sub)클래스 슈퍼클래스
단일상속(Single inheritance)
- 하나의 클래스로부터만 상속을 받는다. ( Java )
- 클래스간의 관계가 다중 상속보다 명확하고 신뢰성 있는 코드를 작성
다중상속(Multiple inheritance)
- 여러 부모 클래스로부터 상속을 받음 ( C++ )
- 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 문제점 발생

Is a 상속관계
- “자식클래스는 (하나의) 부모클래스이다.”관계

- Circle클래스는 하나의 Shape클래스이다.(is a 포함관계)
Has a 상속관계
- 한 클래스의 멤버변수로 다른 클래스타입의 참조변수를 선언함.

- private Point center = new Point();
- 객체를 필드로써 선언
- Circle클래스는 Point클래스를 가지고 있다
- association 연관관계 필드로 다른 객체를 참조
상속의 특징
- 부모클래스의 생성자, 초기화블럭은 상속 안됨
- 후손클래스 객체 생성시, 부모클래스 생성자가 먼저 실행되도록 되어 있음
- 후손클래스 생성자 안에서 부모클래스의 생성자 호출을 명시하고 싶으면 super();
- super(); → JVM이 자동으로 추가
- 부모의 private 멤버는 상속은 되지만 접근 불가능
- 접근제한자가 클래스 내부이기 때문에 접근이 불가능 => 접근제한자가 우선이다.
- 후손 생성자 안에서 부모의 private 필드에 직접 초기값 대입 못함
- 전달받은 부모 필드값을 부모생성자 쪽으로 넘기는 방법을 이용한다

public class Person{
private Stirng name;
private int age;
//기본생성자 포함
public Person(String name, int age){
this.name = name;
this.age = age;
}
}
public class Policeman extends Person{
private string job;
-> name과 age와 job이 있다(상속 받기 때문에)
public Policeman(String name, int age, String job){
//기본생성자를 호출하는 super(); 생략 되어있다.
this.job = job;
super(name, age); //생성자 존재해야함
super.name = name; -> private는 접근불가
}
}
- 모든 클래스는 Object 클래스의 후손이다.
- Object클래스가 제공하는 메소드를 오버라이딩해서 메소드 본래 기능을 변경할 수 있음
- java.lang.String 클래스의 equals()과 toString()
super()
- 후손 객체 생성시에는 부모 객체부터 생성된다. 그렇기 때문에 후손클래스 생성자 안에는 부모의 생성자를 호출하는 super(); 가 첫 줄에 존재한다.
- 후손의 매개변수 있는 생성자 작동 시 초기값의 일부를 부모 생성자 쪽으로 넘겨야 할 경우에도 사용할 수 있다.
super.
- 상속을 통한 자식 클래스를 정의 시 해당 자식 클래스의 부모 객체를 가리킨다.
- 레퍼런스변수 부모가 생성된 주소 → 부모가가진 맴버에 접근할때
this. → 내가 가진 맴버에 접근할때
오버라이딩(overriding)
- 부모가 제공하는 기능을 후손이 일부 고쳐 사용하겠다는 의미
- 메소드 헤드라인 위에 반드시 Annotation 표시
- Annotation : 자바 컴파일러에게 알리는 주석문
- @Override
public 반환형 메소드명([자료형 매개변수]){}
- 부모 메소드의 접근제어자 수정 가능
- 단, 부모의 것보다 같거나 넓은 범위로만 변경 가능하다.
- 부모 메소드의 예외처리 클래스 개수 수정 가능
- 메소드 헤드라인 위에 반드시 Annotation 표시
오버라이딩 성립요건
- 부모 클래스의 메소드와 자식 클래스의 메소드 비교
- 이름이 동일해야 한다
- 매개변수의 개수와 타입, 순서가 동일해야 한다
- 리턴 타입이 동일해야 한다
- private 메소드의 오버라이딩은 불가하다
- @Override 어노테이션을 메소드 선언부 앞에 명시하자
- @Override는 컴파일러에게 이 메소드가 슈퍼클래스의 해당메소드를 오버라이드한다는 것을 알린다
- 해당 메소드가 없거나, 오탈자가 발생했을때 에러를 발생시켜준다
@Override
public String printInformation() {
//부모의 필드가 private인 경우 바로 접근하지 못한다.
/*return super.brand;*/
/*return super.getBrand() + ", " + super.getProductNumber() + ", "
+ super.getProductCode() + ", " + getProductName() + ", "
+ getPrice() + ", " + getManufacturingDate() + ", "
+ this.inchType;*/
return super.printInformation() + ", " + this.inchType;
}
오버라이딩(overriding) VS 오버로딩(overloading)*

제어자 조합 유의사항

- 메소드에 static과 abstract를 함께 사용할 수 없다.
- 클래스에 abstract와 final을 동시에 사용할 수 없다.
- abstract - 상속을 강화시킬 목적으로 사용 ↔ final - 상속을 받지못하게
- abstract 메소드의 접근제어자가 private일 수 없다.
- 상속을 받아서 오버라이딩 해야하는데 private면 접근이 불가하기때문에 함께 사용불가
- 메소드에 private와 final을 같이 사용할 수 없다
클래스와 메소드의 final 키워드*
- final class – 상속 못하게 함
- 예시) public final class FinalClass{} //상속 불가 final method
- 오버라이딩 못하게 함
- 예시) public final void method(){} //오버라이딩 불가