자바(Java) 상속과 구성

유필선·2024년 3월 5일
0

자바(Java)

목록 보기
5/20
post-thumbnail

상속(Inheritance)

상속이란 ?

  1. 부모클래스(상위 클래스)와 자식클래스(하위 클래스)가 있으며, 자식 클래스는 부모클래스를 선택해서, 그 부모의 맴버를 상속받아 그대로 쓸 수 있게 하는 것.
  2. 상속받는 클래스를 자식클래스, 하위클래스 또는 서브 클래스라고 부른다.
  3. 상속을 해주는 클래스는 부모클래스, 상위클래스 또는 슈퍼클래스라고 부른다.
  4. 상속은 자식클래스가 부모클래스와 is-a관계일때 사용한다.

상속을 하는 이유

  • 이미 마련되어 있던 클래스를 재사용해서 만들 수 있다.
  • 효율적이고, 개발시간을 줄여준다.

상속의 특징

  • 다중 상속 불가능 -> 2개 이상의 클래스를 상속 불가
  • 부모의 생성자는 상속이 되지 않는다.
  • 부모 클래스가 가진 멤버변수와 메소드를 모두 상속 받는다
  • 부모 클래스 내에서 멤버변수 또는 메소드가 private 접근제한자를 사용하면
    멤버변수는 상속 받으나 바로 접근이 불가능하며, 메소드는 상속 되지 않는다.
  • statin 메서드 또는 변수도 상속이 된다.
  • 동일한 이름의 변수가 부모 클래스와 자식 클래스 둘 다 존재할 경우 부모 클래스의 변수는 가려진다.

클래스 상속

  1. 상속받고자 하는 자식 클래스명 옆에 extends 키워드를 붙히고, 상속할 부모 클래스명을 적는다.
Class Parent{ .... }; // 부모 클래스
Class Child extends parent { .... }; // 자식 클래스
  1. 자바는 다중 상속을 허용하지 않으므로, extends뒤에는 하나의 부모 클래스만 와야 한다.


    무기라는 클래스와 칼이라는 클래스가 있다. 여기에 칼이라는 클래스는 무기라는 클래스를 상속받아서
    void 공격의 출력문을 실행 할 수 있게된다.
    간단하게 부모의 필드와 메소드를 그대로 가져다 쓰는 것이라고 생각하는 것이 편하다.

※ 여기서 칼 클래스에 void 공격을 하지 않는 이유는 new 칼은 a무기로 객체를 만든 것이 아닌
무기 클래스로써 사용하는 것이기 때문에 칼 클래스에 void공격을 작성해도 실행되지 않는다.
하지만, 무기 클래스에 void 공격을 작성하면 칼 클래스에도 상속을 받기 때문에 오버라이딩은 가능하다.

  • 상위클래스에 메서드만 작성해 놓고 사용해도 출력은 정상적으로 된다.
  • 자식클래스는 상위클래스의 메서드를 상속받고 오버라이딩 하여 원하는 대로 변경이 가능하다.

부모 생성자의 호출: super(...);

부모 객체를 생성할 때, 부모 생성자를 선택해서 호출할 수 있다.

자식클래스(매개변수선언, ...){
	super(매개값,...); // 무조건 자식생성자의 첫줄에 위치해야함.
    ...
}
  • super(매개값, ...)은 매개값과 동일한 타입, 개수, 순서가 맞는 부모 생성자를 호출한다.
  • 만약 부모 생성자가 없다면 컴파일 오류가 발생한다.
  • 반드시 자식 생성자의 첫 줄에 위치해야한다.
  • 부모 클래스에 기본(매개변수 없는) 생성자가 없다면 필수적으로 작성해야 한다.

예제

구성(composition)

구성이란 ?

기존 클래스를 확장하는 대신에 새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조하게 된다. 기존 클래스가 새로운 클래스의 구성요소로 쓰인다는 뜻에서 이를 컴포지션(conposition)이라고 한다

A has a B (A는 B를 가지고 있다)
class A {
  B b = new B();
  b.B메서드();
}

구성은 has - a 관계

  • 다른 객체를 받아들여서 그 객체의 기능을 사용하는 것이다.
    ex) 사람이 핸드폰을 사서 그 핸드폰의 기능을 사용하는 것)
  • 받아들인 객체의 자원(메소드/변수)을 사용할 수 있다.
  • 어떤 클래스 A가 또 다른 클래스인 B가 가진 기능을 사용하고 싶을 때 B클래스를 포함하면 B클래스의 기능을 사용할 수 있다.

구성의 특징

  1. 코드 재사용성
  • 구성을 사용하면 다른 클래스의 객체를 통해서 코드를 재사용 할 수 있다.
  • 아래 예시코드를 보면
    (1). 차 클래스에 엔진 객체를 생성한 뒤,
    (2). 시동() 메서드에서 engine의 시동걸기()를 재사용하고,
    (3). engine이 가지고 있는 엔진 클래스에서
    (4). 시동걸기()를 진행한다.
  1. 유연성
  • 코딩에서 유연성은 소프트웨어 시스템이 변경에 대해 쉽게 대응할 수 있는 특징이다.
  1. 상호 의존성
  • 구성을 하게 되면 구성클래스가 다른 클래스의 객체를 포함하게 되므로, 한 클래스의 변경이 다른 클래스에 영향을 줄 수 있다.
  • 위에 예시코드에서 차 클래스에서 엔진 객체를 포함하고 있는데 이때 엔진의 메서드나 변수가 변하게 된다면 차 클래스에도 영향이 미치므로 결합도가 높아진다
    (※ 결합도는 낮아지고 의존성이 높은것이 제일 좋은 모듈이다)

상속과 구성의 차이점

상속

  • 부모 클래스의 코드를 자식 클래스에서 사용하는 것
  • 부모 클래스의 기능을 변경 또는 자식 클래스에서 추가하며 확장
  • is-a 관계이므로 하위 클래스가 상위 클래스에 포함된다

구성

  • 클래스 간의 협력을 통해 코드를 재사용하는 것
  • 구성요소를 동적으로 변경하면서 확장 (객체를 교환하면서 기능을 확장)
  • has-a 관계이므로 한 클래스를 다른 클래스가 포함하고 있다
profile
이해해버려라!

0개의 댓글