[Java] 상속과 인터페이스

minhyeok·2023년 8월 20일
0

Java 개념 정리

목록 보기
4/8
post-thumbnail

상속

상속이란?

상속(inheritance)이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미한다.
이러한 상속은 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나이다.

상속을 이용하면 기존에 정의되어 있는 클래스의 모든 필드와 메소드를 물려받아, 새로운 클래스를 생성할 수 있다.

이때 기존에 정의되어 있던 클래스를 부모 클래스(parent class) 또는 상위 클래스(super class), 기초 클래스(base class)라고도 한다.

그리고 상속을 통해 새롭게 작성되는 클래스를 자식 클래스(child class) 또는 하위 클래스(sub class), 파생 클래스(derived class)라고도 한다.

클래스 간의 상속은 여러 개의 부모의 정보를 상속하는 다중 상속 방식을 제외하고는 모두 허용하고 있다.
주로 다단계 상속, 계층적 상속 두 가지 방식이다.
부모 클래스를 통해 자식, 손자까지 내려가는 방식을 다단계 상속,
하나의 부모가 여러 개의 자식을 가지는 것을 계층적 상속이라고 한다.

자바에서 다중상속이 안 되는 이유

예를 들어 만약, 상속받은 여러 개의 부모 클래스들에서 동일한 명칭의 필드나 메소드가 있으면?

  • 어떤 부모 클래스의 필드와 메소드를 상속받아야 하는가?
  • 어떤 부모 클래스에 어떻게 접근해야 하는가?

위와 같은 모호함이 발생한다.

자바 상속 방법

//부모 클래스 생성
class 부모{
	
}

//부모 클래스 상속
class 자식 extends 부모{

}

자바에서 상속은 extends라는 키워드를 통해 할 수 있다.
위와 같이 상속받을 자식 클래스 뒤에 extends 키워드를 사용하고 부모 클래스를 적어주면 된다.

자바 상속 예시

class People{
    //필드(Feild)
    String name; //이름
    int age; //나이
    
    //메소드(Method)
    public void printMyself(){
        System.out.println("이름 : " + name);
        System.out.println("나이 : " + age);
    }
}

class Student extends People{
    //필드(Field)
    int my_grade; //내 학년
    
    //생성자(Constrouct)
    Student(String name, int age, int my_grade){
        super.name = name; //부모 필드 
        super.age = age; //부모 필드
        this.my_grade = my_grade;
    }
    
    //메소드(Method)
    public void printGrade() {
        System.out.println("내 학년 : " + my_grade);
    }
}

public class Main {
    public static void main(String[] args) {
        Student student = new Student("송민혁", 26, 4);
        student.printMyself(); //부모 메소드 호출
        student.printGrade(); //자식 메소드 호출
    }
}

super 키워드

super 키워드는 자식 클래스에서 부모 클래스를 가리킬 때 사용하는 키워드이다.
주로 부모 클래스의 필드에 접근, 메소드를 호출할 때 사용한다.

부모 클래스에서 상속되지 않는 것

  • 부모 클래스의 private 접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없다.
  • 부모와 자식 클래스가 서로 다른 패키지에 있다면, 부모의 default 접근 제한을 갖는 필드 및 메소드도 자식이 물려받을 수 없다.

상속을 하더라도 자식 클래스가 부모의 모든 것들을 물려받는 것은 아니다.
필드나 메소드의 접근제어자가 public이거나 protected일 때만 상속이 가능하다.

인터페이스

인터페이스란?

자바에서 인터페이스는 클래스들이 필수로 구현해야 하는 추상 자료형이다.
쉽게 말하자면 객체의 사용방법을 가이드라인 하는 것이라고 생각하시면 이해가 쉽다.
자바의 인터페이스는 추상 메서드와 상수로만 이루어져 있다. 구현된 코드가 없기 때문에 당연히 인터페이스로 인스턴스도 사용할 수 없다.

인터페이스 특징

  • 다중 상속 가능
    인터페이스는 껍데기만 존재하여 클래스 상속 시 발생했던 모호함이 없다. 고로 다중 상속이 가능.

  • 추상 메서드와 상수만 사용 가능
    인터페이스에는 구현 소스를 생성할 수 없다. 고로 상수와 추상 메서드만 가질 수 있다.

  • 생성자 사용 불가
    인터페이스 객체가 아니므로 생성자를 사용하실 수 없다.

  • 메서드 오버라이딩 필수
    자식클래스는 부모 인터페이스의 추상 메서드를 모두 오버라이딩해야 한다.

인터페이스 사용 이유

  • 추상 클래스를 통해 객체들 간의 네이밍을 통일할 수 있고 이로 인해 소스의 가독성과 유지보수가 향상
  • 확장에는 열려있고 변경에는 닫혀있는 객체 간 결합도(코드 종속성)를 낮춘 유연한 방식의 개발이 가능

자바 인터페이스 사용법

자바에서 인터페이스를 선언할 때는 interface라는 키워드를 붙여서 만들면 된다.
단 이렇게 interface라는 키워드를 붙여 인터페이스로 만들게 되면 오직 implements라는 키워드를 통해 객체들을 구현하는 용도로만 사용이 가능하다.
또한 인터페이스에는 구체적인 대상을 생성할 수 없고 오로지 상수와 추상 메서드만 사용할 수 있다.
이 메서드는 추상 클래스에서 껍데기만 생성하고 상속하는 자식 클래스에서 오버라이딩하여 사용한다.

출처
https://coding-factory.tistory.com/865
https://coding-factory.tistory.com/867

0개의 댓글