TIL | [Java] 추상화(추상클래스/인터페이스)

hyemin·2022년 1월 24일
0

Java

목록 보기
5/10
post-thumbnail
post-custom-banner

TIL(6) - 객체 지향 프로그래밍의 기둥 중 하나인 추상화 개념에 대해 알아보자!

추상화

여러 객체에 공통적으로 사용되는 핵심적인 정보만 나타내는 것으로 공통의 속성이나 기능을 묶어 이름을 붙인다.

예를들어 [키를 꽂는다 - 자동차 문을 연다 - 자리에 앉는다 - 키를 꽂는다 - 시동을 건다 - 엑셀을 밞는다] 이 일련의 행위는 자동차 운전을 한다라는 핵심 행위로 표현할 수 있다.

이처럼 핵심 행위로 표현하는 것을 추상화라고 하는데, 추상화를 잘 해야 수명주기가 긴 효율적인 코드를 짤 수가 있다. 특히 큰 프로젝트일수록 추상화를 잘 못하면 비효율성이 커지게 된다.

1. 추상클래스

추상클래스를 만들기 위해서는 class 앞에 abstract 키워드를 넣어 추상클래스임을 명시해야 한다.

abstract class 클래스명

추상메서드

추상클래스는 추상화를 위한 추상메서드가 포함돼야 한다.

추상클래스에서는 추상메서드의 이름과 반환형, 매개변수만 선언하고 내용에 대한 정의는 추상클래스를 extends하는 자식 클래스에서 이뤄진다. 따라서 추상메서드는 반드시 오버라이드되어야하는 메서드이다.

<예시>

Car.java

package abstract.car;

public abstract class Car {
    protected int number;

    public Car(int number) {
        this.number = number;
    }

    public abstract void color();

    public abstract void horn();
}

Truck.java

package abstract.car;

public class Truck extends Car {

    public Truck(int number) {
        super(number);
    }

    public void color() {
        System.out.println("Blue");
    }

    public void horn() {
        System.out.println("빵빵!!");
    }
}

Sportscar.java

package abstract.car;

public class Sportscar extends Car {

    public Sportscar(int number) {
        super(number);
    }

    public void color() {
        System.out.println("Yellow");
    }

    public void horn() {
        System.out.println("빠랑빠랑!");
    }
}

Main.java

package abstract.car;

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

        Car car1 = new Truck(4885);
        car1.color();
        car1.horn();
        
        System.out.pringln("");
        
        Car car2 = new Sportscar(2489);
        car2.color();
        car2.horn();
    }
}

출력

Blue
빵빵!!

Yellow
빠랑빠랑!

2. 인터페이스

추상클래스(abstract 클래스)처럼 추상화를 구조적으로 도와주는 도구 중 하나이나 사용빈도가 더 높은 편이다.

추상클래스처럼 인터페이스도 interface 키워드를 통해 인터페이스를 명시해줘야 한다.

interface 인터페이스명

추상메서드

추상클래스와 같이 추상메서드를 제공하며 내용에 대한 정의는 implements하는 클래스에서 내려진다. 다만, default 키워드를 사용하여 인터페이스에서 정의를 내릴 수도 있다.

public default void 메서드명() {
	System.out.println("추상메서드 내용")'
}

그리고 default 메서드나 static 메서드도 아니면 모두 public abstract 메서드로 선언된다.

변수

인터페이스에서 선언된 변수는 모두 public static final이며, 생략하더라도 자동으로 public static fianl이 선언된다.

<예시>

Car.java

package interface.car;

public abstract class Car {
    // 생성자 선언 불가
    public statia final String driverSeat = "Left";
    
    // 추상클래스 예시 - 생성자 선언 가능
    // protected int number;

    // public Car(int number) {
    //     this.number = number;
    // }

    public abstract void color();

    public abstract void horn();
    
    // default 키워드로 내용 정의 가능
    public default void drive() {
        System.out.println("주행한다");
    }
}

Truck.java

package interface.car;

public class Truck implements Car {
	// implements한 클래스에서 생성자 선언
    protected int number;

    public Truck(int number) {
        this.number = number;
    }

    public void color() {
        System.out.println("Blue");
    }

    public void horn() {
        System.out.println("빵빵!!");
    }
}

Sportscar.java

package interface.car;

public class Sportscar implements Car {
    // implements한 클래스에서 생성자 선언
    protected int number;

    public Truck(int number) {
        this.number = number;
    }

    public void color() {
        System.out.println("Yellow");
    }

    public void horn() {
        System.out.println("빠랑빠랑!");
    }
}

Main.java

package interface.car;

public class Main {
    public static void main(String[] args) {
    	
        System.out.println(Dog.driverSeat);

        Car car2 = new Truck("4885");
        car1.color();
        car1.horn();
        car1.drive();
        
        System.out.pringln("");
        
        Car car3 = new Sportscar("2489");
        car2.color();
        car2.horn();
        car2.drive();

    }
}

출력

Left

Blue
빵빵!!
주행한다

Yellow
빠랑빠랑!
주행한다

추상클래스 vs 인터페이스

추상클래스인터페이스
확장 키워드 - extends구현 키워드 - implements
생성자 정의 가능생성자 정의 불가능
추상메서드에 private 키워드 사용 불가-
-default로 추상메서드 내용 정의 가능
-변수는 모두 public static final로 선언(생략 가능)
-(public) defaul, (public) static 메서드 외 모두 public abstract 메서드

추상클래스 / 인터페이스 - 확장/구현하는 클래스는 반드시 추상메서드를 오버라이드해 내용 정의

추상클래스 / 인터페이스 - 단독으로 인스턴스 생성 불가능(상속으로만 가능)

post-custom-banner

0개의 댓글