Java - 상속/인터페이스/추상클래스

2022. 6. 21. 00:02Java

 상속/인터페이스/추상클래스 개념
상속
  • extends 키워드로 선언
  • 부모 클래스 = super class
  • 자식 클래스 = sub class
  • 슈퍼 클래스 객체와 서브 클래스의 객체는 별개
  • 서브 클래스 객체는 슈퍼 클래스 멤버 포함
class Animal{
    int age;
    String Species;
}

class dog extends Animal{ 
    String name;
}

//dog 클래스는 Animal 클래스를 상속 받았기 때문에 age, Species 멤버에 접근 가능

 

자바 상속의 특징
  • 클래스 다중 상속 불가능
  • 단 인터페이스의 경우 다중 상속 허용

 

슈퍼 클래스 멤버의 접근 지정자
슈퍼 클래스 멤버에 접근하는 클래스 종류 슈퍼 클래스 멤버의 접근 지정자
private default protected public
같은 패키지의 클래스 x o o o
다른 패키지의 클래스 x x x o
같은 패키지 서브 클래스 x o o o
다른 패키지 서브 클래스 x x o o

 

  • protected 멤버에 대한 접근은 같은 패키지의 모든 클래스 or 상속되는 서브 클래스에게 허용
  • 서브 클래스의 객체가 생성될 때, 슈퍼클래스 서브 클래스 생성자 둘다 실행 된다.
    • 이때 생성자의 목적은 객체 초기화 이므로 서브 클래스의 생성자는 서브 클래스의 멤버나 필요한 초기화를 수행하고, 슈퍼 클래스의 생성자는 슈퍼 클래스의 멤버나 필요한 초기화를 각각 수행한다.
    • 슈퍼클래스 생성자 -> 서브클래스 생성자 순으로 실행된다.
  • super()로 슈퍼 클래스의 생성자를 선택 호출할 수 있다.
    • 이 경우 반드시 서브 클래스 생성자 코드의 제일 첫 라인에 와야 함

 

추상 클래스
  • 추상 메소드 : abstract로 선언된 메소드, 메소드의 코드는 없고 원형만 선언함
abstract public String getName(); //추상 메소드

abstract public String fail() { return "good bye"; } //추상 메소드 X
  • 추상 클래스 상속
    • 추상 클래스를 상속받으면 추상 클래스가 됨
    • 서브 클래스도 abstract로 선언함
  • 추상 클래스 구현
    • 서브 클래스에서 슈퍼 클래스의 추상 메소드 구현(오버라이딩)
    • 추상 클래스를 구현한 서브 클래스는 추상 클래스 아님
  • 추상 클래스의 목적
    • 상속을 위한 슈퍼 클래스로 활용하는 것
    • 서브 클래스에서 추상 메소드 구현
    • 다형성 실현
abstract class Calculator{ //추상 클래스
    public abstract int add(int a, int b);
    public abstract int subtract(int a, int b);
    public abstract double average(int[] a);
}

class GoodCalc extends Calculator{

    @Override
    public int add(int a, int b) {
        return a+b;
    }

    @Override
    public double average(int[] a) {
        double sum=0;
        for(int i=0; i<a.length; i++){
            sum+=a[i];
        }
        return sum;
    }

    @Override
    public int subtract(int a, int b) {
        return a-b;
    }

}
public class prt1{
    public static void main(String[] args) {
        GoodCalc a = new GoodCalc();
        System.out.println(a.add(2,3));
        System.out.println(a.subtract(5, 2));
        System.out.println(a.average(new int []{2,5,6}));
    }
}

추상클래스를 활용한 예제

abstract class Vehicle{
    protected int speed;
    public void setSpeed(int s){
        speed = s;
        System.out.println("속도를 "+speed+"로 변경했습니다");
    }
    abstract void show();
}

class Car extends Vehicle{
    private int num;
    private double gas;

    public Car(int n, double g){
        num = n;
        gas = g;
        System.out.println("차량번호 "+num+", 연료양"+gas+"인 자동차가 만들어졌습니다");
    }

    public void show(){
        System.out.println("차량번호는 "+num+"입니다");
        System.out.println("연료양은 "+gas+"입니다");
        System.out.println("속도는 "+speed+"입니다");
    }
}

class Plane extends Vehicle{
    private int flight;
    public Plane(int f){
        flight = f;
        System.out.println("비행기 번호가 "+flight+"인 비행기가 만들어졌습니다");
    }
    
    public void show(){
        System.out.println("비행기 번호는"+flight+"입니다");
        System.out.println("속도는"+speed+"입니다");
    }
}

public class test{
    public static void main(String[] args) {

         Vehicle[] vc;
         vc = new Vehicle[2];

         vc[0] = new Car(1234,20.5);
         vc[0].setSpeed(60);
         vc[1] = new Plane(232);
         vc[2].setSpeed(2600);

         for(int i =0; i<vc.length;i++){
             vc[i].show();
         }

    }
}

자바의 인터페이스
  • 클래스가 구현해야 할 메소드들이 선언
  • 인터페이스 선언은 Interface 키워드로 선언
  • 인터페이스에는 필드(멤버 변수) 선언 불가
  • 인터페이스의 구성 요소들
    • 상수 public만 허용하며 public static final 생략
    • 추상 메소드 public abstract 생략 가능
    • default 메소드
      • 인터페이스에 코드가 작성된 메소드
      • 인터페이스를 구현하는 클래스에 자동 상속
      • public 접근 지정만 허용
    • private 메소드
      • 인터페이스 내에 메소드 코드가 작성 되어야 함
      • 인터페이스 내에 있는 다른 메소드에 의해서만 호출 가능
    • static 메소드
      • public private 모두 지정 가능, 생략하면 public
  • 인터페이스간에 상속 가능
    • 인터페이스를 상속하여 확장된 인터페이스 작성 가능
    • 다중 상속 허용
  • 인터페이스의 추상 메소드를 모두 구현한 클래스 작성
    • implements 키워드 사용
    • 여러개의 인터페이스 동시 구현 가능
interface PhoneInterface{ //인터페이스 선언
    final int TIMEOUT = 10000; //상수 필드 선언
    void sendCall();  //추상 메소드
    void receiveCall();  //추상 메소드
    default void printLogo(){ //default 메소드
        System.out.println("** Phone **");
    }
}

class SamsungPhone implements PhoneInterface{

    @Override
    public void receiveCall() {
        System.out.println("뽀잉 뽀잉");
    }

    @Override
    public void sendCall() {
        System.out.println("삼성폰 전화왔어요~");        
    }
    public void flash(){
        System.out.println("전화기에 불이 켜졌습니다");
    }
}

public class prt1{
    public static void main(String[] args) {
        SamsungPhone Galaxy = new SamsungPhone();
        Galaxy.printLogo();
        Galaxy.sendCall();
        Galaxy.receiveCall();
        Galaxy.flash();
        
    }
}

 

'Java' 카테고리의 다른 글

JAVA - Swing/AWT/GUI  (0) 2022.10.05
Java - 패키지와 모듈화 / Wrapper  (0) 2022.06.21
Java - 클래스와 객체  (0) 2022.06.20
Java - 컬렉션  (0) 2022.06.19
Java - 객체(2)  (1) 2022.04.25