-
추상화(Abstract)TIL(Today I Learned) 2022. 9. 28. 18:23
추상화란?
추상화(Abstract)란 클래스들의 중요하고 공통된 성질들을 추출하여 슈퍼클래스로 만든 것입니다.추상화의 원칙
추상화 방식으로 메서드를 만들 땐 메서드의 기능을 쉽고 분명하게 이해할 수 있는 메서드명을 짓습니다.
하나의 메서드는 완전한 하나의 기능만을 갖습니다.
메서드의 코드 길이를 최대한 짧고 간결하게 작성합니다.추상화 사용 이유
추상화를 사용했을 시 다음과 같은 장점이 있습니다.
- 코드의 가독성, 간결성, 유지보수성(코드를 짧고 간결하게 작성하고, 추상화 클래스로 메서드를 관리하기 때문)
- 코드의 재사용성(같은 기능을 하는 메소드를 여러 클래스에서 사용할 수 있기 때문)
- 중복코드 감소(여러 클래스에서 공통으로 사용되는 메서드를 슈퍼클래스에 작성하고 하위 클래스에선 가져와 사용만 하면 되기 때문)추상화 예제 코드
package abstractEx; public class Main { public static void main(String[] args) { Animal animal = new Animal(new Cat()); animal.input("콩순이다",26); } } package abstractEx; public class Animal { AnimalType animalType; public Animal(AnimalType animalType) { this.animalType = animalType; } public void input(String name, int age) { animalType.input(name, age); } } package abstractEx; public abstract class AnimalType { //추상 필드 String name; int age; public AnimalType() {} // 기본 생성자 public void input(String name, int age) { this.age = age; this.name = name; this.howl(); } public void howl() { System.out.println( "내 이름은 " + name + "내 나이는 " + age); } // 추상메서드 // 하위클래스에서 무조건 구현을 해야함 abstract void force(); } package abstractEx; public class Cat extends AnimalType{ String name; int age; public void input(String name, int age) { this.age = age; this.name = name; this.howl(); } public void howl() { System.out.print("\""+ "니아옹~" + "\"" + " 내 이름은 " + name + " 내 나이는 " + age + "이다 냐옹~"); } public void force() { System.out.println("강제로 구현해야하는 메소드"); } package abstractEx; public class Dog extends AnimalType{ String name; int age; public void input(String name, int age) { this.age = age; this.name = name; this.howl(); } public void howl() { System.out.print("\""+ "왈왈!" + "\"" + " 내 이름은 " + name + " 내 나이는 " + age + "이다 멍!"); } public void force() { System.out.println("강제로 구현해야하는 메소드"); }
추상화와 다형성의 차이
추상화는 abstract 다형성은 interface입니다.
추상화는 필드, 생성자, 상수, 메서드 등을 포함할 수 있습니다.
다형성은 메서드와, default method만을 포함할 수 있습니다.추상화과 다형성의 공통점
하위클래스의 메서드 구현을 강제합니다.
다형성을 사용하는 이유
추상화가 확실히 다형성보다 많은 기능을 제공하는 것처럼 보입니다. 그렇다면 다형성을 사용해야할 이유가 있을까요?
다형성은 추상화보다 더 추상화된 개념입니다. 클래스로 치지도 않습니다. 이러한 특성이 다중 상속을 가능하게 만듭니다.
(다중 상속이란 하위 클래스들은 하나의 부모 클래스만 가질 수 있는 원칙에 반하는 상속입니다. 즉, 여러 부모 클래스를 가질 수 있게 된다는 의미입니다.)default method란
인터페이스 내에서 메서드를 구현할 수 있습니다.(원래는 추상 메서드만 존재해야합니다.)
만약 default method가 있는 인터페이스를 다중 상속하려 할 때 오버라이딩을 해주지 않는다면 에러가 발생합니다. 오버라이딩을 사용해야 합니다.
default method의 사용 이유
인터페이스의 하위 클래스에 구현을 강제하는 특성이 가져오는 불편함 때문입니다. 예를 들어 인터페이스를 수정해야 하는 상황이 왔을 때 새로운 추상 메서드를 추가한다면
하위 클래스 모두가 수정해야 하는 불상사가 발생합니다. 하지만 default method를 추가해주면 불상사를 방지할 수 있습니다.예제 코드
interface MyInterface{ //default 메서드 생성 default void printHello(){ System.out.println("Hello World!"); } } public class MyClass implements MyInterface {} public class Main{ public static void main(String[] args){ MyClass myClass = new MyClass(); myClass.printHello(); } }
output
Hello World!
'TIL(Today I Learned)' 카테고리의 다른 글
try/catch/finally (0) 2022.10.02 HTTP Method (0) 2022.09.30 모듈/모듈화 (0) 2022.09.27 자바 컴파일 흐름 (0) 2022.09.26 오버로딩/오버라이딩 (0) 2022.09.26