ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (JAVA) 추상화와 추상클래스
    JAVA 2021. 7. 19. 14:18

    1. 추상화란?

    - 우리는 보통 알고는 있지만 정확하게 표현하기 힘든 것들을 중요한 부분이나 특징점을 잡아 설명하고는 한다.

    이것을 '추상적으로 표현한다' 즉 '추상화한다' 라고 하는데 객체지향의 개념에서 추상화는 중요한 개념 중에 하나이다.

     

    - 컴퓨터 과학에서의 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다. 

    - 객체 지향 관점에서의 추상화는 클래스를 정의할 때, 불필요한 부분들을 생략하고 객체의 속성 중 중요한 것에만 중점을 두어 개략화 하는 것, 즉 클래스들의 중요하고 공통된 성질들을 추출하여 슈퍼 클래스를 선정하는 개념이다.

     

    2. 추상화를 왜 하는가?

    - 추상화를 통해 잘 설계했다면 여러개의 클래스를 정의했을 때, 중복 코드가 현저히 줄어들 것 이다.

    -> 코드가 간결해지기 때문에 생산성 증가, 가독성 증가, 에러 감소, 유지 보수시 시간 단축 등의 효과!

    -> 잘 만들어진 슈퍼 클래스 덕분에 코드의 재사용성이 증가한다. 

     

    추상화가 잘 되어 있는 코드는 내부 코드를 전부 이해하지 않아도 가져다가 사용할 수 있다는 장점이 있지만 반대로 그렇기 때문에 내부를 파악하거나 수정하는 것이 어려울 수 있다!

    3. 추상클래스 vs 인터페이스

    - 추상화를 구현하기 위해서 자바에서는 추상클래스와 인터페이스 두가지 기능이 존재합니다.

    - 추상클래스의 키워드는 abstract, 인터페이스의 키워드는 interface

    - 추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함할 수 있지만 인터페이스는 오로지 추상 메소드와 상수만을 포함할 수 있다.

    - 그럼 추상클래스만 쓰지 인터페이스를 왜 써? 왜? why? -> 자바는 클래스를 통한 다중 상속은 지원하지 않지만 클래스와 인터페이스를 통한 다중 상속은 지원하기 때문!

    - 추상클래스나 인터페이스에 구현한 추상메소드들은 상속받는 클래스들에게 강제성을 부여! -> 꼭 오버라이딩 해서 사용해야만 함.

     

    4. 추상클래스 예제

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    package 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

     

    실행 결과

     - 강아지와 고양이의 클래스를 만든 간단한 예제이다. 강아지와 고양이 클래스를 보면 중복된 코드가 많은 것을 볼 수 있다. 이것을 추상화 해서 좀 더 상위 개념인 '동물' 클래스를 만들어서 상속해서 사용한다면 좀 더 코드가 간결해지지 않을까?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package 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

     

    실행 결과

    - '동물'은 객체로 만들 필요가 없기 때문에 추상 클래스로 구현한 후 고양이와 강아지 클래스에 상속 시킨 코드이다.

    공통된 속성들(이름, 나이)와 공통된 기능(울부짖기) 를 상위클래스에 정의함으로서 하위 클래스인 강아지와 고양이 클래스에 중복코드를 간소화 시킬 수 있다.

     

Designed by Tistory.