TIL(6) - 객체 지향 프로그래밍의 기둥 중 하나인 추상화 개념에 대해 알아보자!
여러 객체에 공통적으로 사용되는 핵심적인 정보만 나타내는 것으로 공통의 속성이나 기능을 묶어 이름을 붙인다.
예를들어 [키를 꽂는다
- 자동차 문을 연다
- 자리에 앉는다
- 키를 꽂는다
- 시동을 건다
- 엑셀을 밞는다
] 이 일련의 행위는 자동차 운전을 한다
라는 핵심 행위로 표현할 수 있다.
이처럼 핵심 행위로 표현하는 것을 추상화라고 하는데, 추상화를 잘 해야 수명주기가 긴 효율적인 코드를 짤 수가 있다. 특히 큰 프로젝트일수록 추상화를 잘 못하면 비효율성이 커지게 된다.
추상클래스를 만들기 위해서는 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
빠랑빠랑!
추상클래스(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
빠랑빠랑!
주행한다
추상클래스 | 인터페이스 |
---|---|
확장 키워드 - extends | 구현 키워드 - implements |
생성자 정의 가능 | 생성자 정의 불가능 |
추상메서드에 private 키워드 사용 불가 | - |
- | default로 추상메서드 내용 정의 가능 |
- | 변수는 모두 public static final로 선언(생략 가능) |
- | (public) defaul, (public) static 메서드 외 모두 public abstract 메서드 |
▶ 추상클래스 / 인터페이스 - 확장/구현하는 클래스는 반드시 추상메서드를 오버라이드
해 내용 정의
▶ 추상클래스 / 인터페이스 - 단독으로 인스턴스 생성 불가능(상속으로만 가능)