[TIL] Java - 상속

KwonSC·2021년 11월 8일
0

TIL - Java

목록 보기
2/5
post-thumbnail

객체지향 프로그래밍(Object-Oriented Programming, OOP)

  • 로직을 상태(state)와 행위(behave)로 이루어진 객체로 만드는 것이다.
  • 객체지향 언어의 4대 특징
    1. 추상화(Abstraction) : 구현하는 객체들이 가진 공통적인 데이터와 기능을 도출해 내는 것
    2. 다형성(Polymorphism) : 부모의 타입으로 다양한 형태의 자식 객체를 생성, 참조 할 수 있는것
    3. 상속(Inheritance) : 상위 개념의 특징을 하위 개념이 물려받는 것을 말한다.
    4. 캡슐화(Encapsulation) : 데이터 구조와 데이터를 다루는 방법을 결합시켜 묶는 것

상속

  • 상속은 상위 개념의 특징을 하위 개념이 물려 받는 것이다.
  • 클래스 상속의 이유 : 각 클래스에 공통적으로 반복되는 부분을 묶어서 독립된 클래스로 만든다. 그리고 각 클래스는 그 클래스를 상속 받도록 한다.

IS-A 관계

  • 프로그래밍에서는 is-a 관계가 성립할 때에만 상속 관계를 맺어주라고 한다.
    • is-a 관계 : "하위 클래스 is a 상위 클래스"가 True인 경우

상속의 표현

  • 코드에서 상속을 표현하는 방법
    • 부모 클래스는 일반 클래스 만드는 방법으로 작성한다.
    • 자식 클래스 선언 시, extends 키워드를 이용하여 부모 클래스를 상속 받는다.
    • 자식 클래스에서 부모 클래스의 것까지 확장하여 사용할 수 있다는 의미이다.
public class 자식클래스명 extends 부모클래스명 {}
  • 자식 클래스의 이름으로 객체를 생성하면, 부모 객체가 먼저 생성되고 자식 객체가 생성
  • 따로 부모 클래스 객체를 생성하지 않아도 부모의 멤버를 사용할 수 있음

HAS-A 관계

  • is-a 관계 이외에 has-a 관계도 상속으로 표현 가능하다.
    • has-a 관계 : "하위 클래스 has a 상위 클래스"가 True인 경우
  • 그러나 has-a 관계는 상속보다 포함관계를 유지하는 것이 보다 일반적이다.

상속에서의 생성자

  • 생성자는 객체 생성 시, 자신의 클래스에 대한 객체만 생성함

  • 자식 클래스에서는 부모의 필드나 멤버 메소드를 사용해야 하기 때문에 부모의 생성자를 호출하여 부모의 객체를 만들어 주어야 함

    • 자식 클래스 생성자의 첫 번째 중에 super 키워드를 이용하여 부모의 생성자를 호출
    • 명시적으로 부모의 생성자를 호출하지 않는 경우, 자동으로 super(); 추가
  • super 키워드를 이용하여 생성자를 명시적으로 호출하는 경우, 반드시 생성자의 첫 번째 줄에 기술되어야한다. 또한 super()this()를 같이 호출하지 못한다.

  • 자식 클래스의 생성자에서 명시적으로 부모의 생성자를 호출하지 않는 경우, 자동으로 super();를 추가한다. 이 때, 부모 클래스에 기본 생성자가 없으면 에러가 발생한다.


오버라이딩

부모로부터 상속 받은 메소드의 내용을 다시 정의하는 것이다.

  • 메소드 오버라이딩의 조건
    • 메소드 이름이 같아야 한다.
    • 메소드 파라미터의 개수와 데이터 타입이 같아야 한다.
    • 메소드의 리턴 타입이 같아야 한다.
    • 접근제어자는 부모의 것과 같거나 더 넓은 범위여야 한다.
  • 메소드 오버라이딩을 할 수 없는 경우
    • 부모 클래스 메소드의 접근 제어자가 private으로 선언되어 있는 경우
    • 부모 클래스의 메소드가 final 키워드로 선언되어 있는경우

final

  • final 클래스 : 자식 클래스를 만들 수 없음.
  • final 메소드 : 자식 클래스에서 오버라이딩 할 수 없음.
  • final 변수 : 값을 변경할 수 없음. 상수.

Object Class

  • 모든 클래스의 부모 클래스
  • 최상위 클래스
  • extends 키워드를 사용하지 않는 클래스는 자동으로 extends Object 를 추가

Abstract Class

  • 추상(Abstract) 클래스란?

    • body가 없는 메소드를 포함한 클래스를 추상클래스라고 함
    • Abstract 클래스일 경우 클래스의 선언부에 abstract 키워드를 사용
public abstract class Example {}
  • 추상(Abstract) 메소드란?

    • 메소드의 몸체({})가 없는 메소드를 추상메소드로 지칭
    • 몸체 없는 메소드의 선언부에 abstract 키워드를 사용
public abstract void example();
  • Abstract Class

    • 미완성 클래스(abstract 키워드 사용)
    • abstract 메소드가 포함 된 클래스 -> 반드시 abstract 클래스
    • 자체적으로 객체 생성 불가 -> 반드시 상속 통하여 객체 생성
    • 일반적인(Concrete) 메소드, 변수도 포함할 수 있다.
    • abstract 메소드가 없어도, abstract 클래스 선언 가능
    • 객체 생성은 안되나, 참조 변수 타입으로는 가능하다.
Appliance app = new Radio(); // (Appliance는 abstract class)
  • 추상 클래스의 장점

    • 일관된 인터페이스 제공
    • 꼭 필요한 기능 강제함(공통적이긴 하나, 자식클래스에서 특수화 되는 기능)

0개의 댓글