JAVA/이론 정리 및 예제

[JAVA/자바] #8_1 상속 / 예제

chaewon 2021. 9. 17. 18:19

상속

  • 다른 클래스가 가지고 있는 멤버(필드와 메소드)들을 새로 작성할 클래스에서 직접 만들지 않고, 상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있게 만든 기술
  • = 부모가 가지고 있는 맴버에 해당하는 것을 중복 작성없이 물려받아 자식것만 따로 작성하기만 하면 되는것

 

상속의 목적*

  • 클래스의 재사용, 명확한 특성이나 추가적인 메소드를 더해서 구체적인 타입으로 만드는것

 

상속의 장점*

  • 보다 적은 양의 코드로 새로운 클래스를 작성 가능
  • 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경이 용이함
    • 부모 클래스(공통 코드)를 하나의 클래스로 관리하면서 유지보수가 용이하다
  • 코드의 중복을 제거하여 프로그램의 생산성과 유지보수성이 증가한다.

표현식

  • 클래스간의 상속시에는 extends 키워드 사용함
[접근제한자] class 클래스명 extends 클래스명{}
                상속받는 클래스  상속하는 클래스
                  후손클래스      상위클래스
                  자식클래스      부모클래스
                  파생클래스      선조클래스
                서브(sub)클래스   슈퍼클래스

 

단일상속(Single inheritance)

  • 하나의 클래스로부터만 상속을 받는다. ( Java )
  • 클래스간의 관계가 다중 상속보다 명확하고 신뢰성 있는 코드를 작성

다중상속(Multiple inheritance)

  • 여러 부모 클래스로부터 상속을 받음 ( C++ )
  • 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 문제점 발생

 

Is a 상속관계

  • “자식클래스는 (하나의) 부모클래스이다.”관계

 

Circle is a Shape. 

  • Circle클래스는 하나의 Shape클래스이다.(is a 포함관계)

 

Has a 상속관계

  • 한 클래스의 멤버변수로 다른 클래스타입의 참조변수를 선언함.

Circle has a Point.

  • private Point center = new Point();
    • 객체를 필드로써 선언
    • Circle클래스는 Point클래스를 가지고 있다
    • association 연관관계 필드로 다른 객체를 참조

 

상속의 특징

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

Policeman p = new Policeman(“김채원”, 20, “취준”);

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 반환형 메소드명([자료형 매개변수]){}
      • 부모 메소드의 접근제어자 수정 가능
        • 단, 부모의 것보다 같거나 넓은 범위로만 변경 가능하다.
      • 부모 메소드의 예외처리 클래스 개수 수정 가능

 

    •  

오버라이딩 성립요건

  • 부모 클래스의 메소드와 자식 클래스의 메소드 비교
    • 이름이 동일해야 한다
    • 매개변수의 개수와 타입, 순서가 동일해야 한다
    • 리턴 타입이 동일해야 한다
    • 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)*

오버라이딩 vs 오버로딩

 

제어자 조합 유의사항

제어자 조합 유의사항

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

 

클래스와 메소드의 final 키워드*

  • final class – 상속 못하게 함 
    • 예시) public final class FinalClass{} //상속 불가 final method
  • 오버라이딩 못하게 함 
    • 예시) public final void method(){} //오버라이딩 불가