-
(JAVA) 추상화와 추상클래스JAVA 2021. 7. 19. 14:18
1. 추상화란?
- 우리는 보통 알고는 있지만 정확하게 표현하기 힘든 것들을 중요한 부분이나 특징점을 잡아 설명하고는 한다.
이것을 '추상적으로 표현한다' 즉 '추상화한다' 라고 하는데 객체지향의 개념에서 추상화는 중요한 개념 중에 하나이다.
- 컴퓨터 과학에서의 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.
- 객체 지향 관점에서의 추상화는 클래스를 정의할 때, 불필요한 부분들을 생략하고 객체의 속성 중 중요한 것에만 중점을 두어 개략화 하는 것, 즉 클래스들의 중요하고 공통된 성질들을 추출하여 슈퍼 클래스를 선정하는 개념이다.
2. 추상화를 왜 하는가?
- 추상화를 통해 잘 설계했다면 여러개의 클래스를 정의했을 때, 중복 코드가 현저히 줄어들 것 이다.
-> 코드가 간결해지기 때문에 생산성 증가, 가독성 증가, 에러 감소, 유지 보수시 시간 단축 등의 효과!
-> 잘 만들어진 슈퍼 클래스 덕분에 코드의 재사용성이 증가한다.
추상화가 잘 되어 있는 코드는 내부 코드를 전부 이해하지 않아도 가져다가 사용할 수 있다는 장점이 있지만 반대로 그렇기 때문에 내부를 파악하거나 수정하는 것이 어려울 수 있다!
3. 추상클래스 vs 인터페이스
- 추상화를 구현하기 위해서 자바에서는 추상클래스와 인터페이스 두가지 기능이 존재합니다.
- 추상클래스의 키워드는 abstract, 인터페이스의 키워드는 interface
- 추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함할 수 있지만 인터페이스는 오로지 추상 메소드와 상수만을 포함할 수 있다.
- 그럼 추상클래스만 쓰지 인터페이스를 왜 써? 왜? why? -> 자바는 클래스를 통한 다중 상속은 지원하지 않지만 클래스와 인터페이스를 통한 다중 상속은 지원하기 때문!
- 추상클래스나 인터페이스에 구현한 추상메소드들은 상속받는 클래스들에게 강제성을 부여! -> 꼭 오버라이딩 해서 사용해야만 함.
4. 추상클래스 예제
12345678910111213141516171819202122232425262728293031323334353637383940package blog;// 고양이class Cat{String name;int age;Cat(String name, int age){this.name = name;this.age = age;}void howl() {System.out.println("야옹! 내 이름은 " + this.name +", " + age+ "살 "+ "이다옹!");}}// 개class Dog{String name;int age;Dog(String name, int age){this.name = name;this.age = age;}void howl() {System.out.println("멍멍! 내 이름은 " + this.name +", " + age+ "살 "+ "이다멍!");}}public class Test1 {public static void main(String[] args) {Cat a = new Cat("나비", 5);Dog b = new Dog("귀리", 3);a.howl();b.howl();}}cs - 강아지와 고양이의 클래스를 만든 간단한 예제이다. 강아지와 고양이 클래스를 보면 중복된 코드가 많은 것을 볼 수 있다. 이것을 추상화 해서 좀 더 상위 개념인 '동물' 클래스를 만들어서 상속해서 사용한다면 좀 더 코드가 간결해지지 않을까?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758package blog;abstract class Animal{String name;int age;// 울음 소리는 하위 클래스에서 정의!String howling;Animal(String name, int age){this.name = name;this.age = age;}void howl() {System.out.println(this.howling + " 내 이름은 " + this.name +", " + age+ "살 "+ "이다옹!");}// 추상 메소드! 상속받는 클래스는 무조건 오버라이딩 해야 함! -> 강제성 부여abstract void charming();}// 고양이class Cat extends Animal{Cat(String name, int age){super(name, age);this.howling = "야옹!";}// 메소드 오버라이딩void charming() {System.out.println("부비부비!");}}// 개class Dog extends Animal{Dog(String name, int age){super(name, age);this.howling = "멍멍!";}void charming() {System.out.println("배 까고 드러눕기!");}}public class Test1 {public static void main(String[] args) {Cat a = new Cat("나비", 5);Dog b = new Dog("귀리", 3);a.howl();b.howl();a.charming();b.charming();}}cs - '동물'은 객체로 만들 필요가 없기 때문에 추상 클래스로 구현한 후 고양이와 강아지 클래스에 상속 시킨 코드이다.
공통된 속성들(이름, 나이)와 공통된 기능(울부짖기) 를 상위클래스에 정의함으로서 하위 클래스인 강아지와 고양이 클래스에 중복코드를 간소화 시킬 수 있다.
'JAVA' 카테고리의 다른 글
(JAVA) Stack 과 Queue 자료구조 (0) 2021.07.19 (JAVA) 다형성과 동적 바인딩 (0) 2021.07.19 (JAVA) 객체 지향 언어의 특징 (0) 2021.07.18 (JAVA) 메소드 오버로딩 vs 메소드 오버라이딩 (0) 2021.07.07 (JAVA) 미니 프로젝트 - 자판기 구현하기 (0) 2021.07.02