반응형
05-16 01:08
Today
Total
«   2024/05   »
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
관리 메뉴

개발하는 고라니

[Java] 추상화 본문

Languages/Java

[Java] 추상화

조용한고라니 2021. 4. 5. 11:42
반응형

추상화

캡슐의 사용되는 공통분모를 잘라내는 것 (공통 분모의 캡슐화). 객체에서 공통된 행위나 속성을 추출하는 것 이라고 말할 수 있다.

  • 상속 : 공통 부분을 뽑아 부모 클래스로 만드는 것
  • 인터페이스 : 상속에서 나아가 개념(기능)만 추출하는 것

추상화로 만들어진 클래스는 다음 2가지의 중요한 특징을 갖는다.

  1. 추상 클래스는 뼈대이므로 절대로 실체화(객체화)되어서는 안된다.
    1. 공통 분모이기 때문에 그것만 가지고 객체화 하려고 했던게 아니므로
  2. 추상 클래스는 뼈대이므로 절대로 사용해서는 안되는 메서드를 가질 수 있다.
    1. 자식 클래스가 실수로라도 부모의 메서드를 사용하지 않게 하고, 동시에 반드시 자신의 것으로 구현해서 사용하라는 강제성 부여 가능

추상화는 Is A 상속이랑 비슷하나, 위의 2가지 특징이 다르다.

추상 클래스

추상 클래스(abstract class)는 'abstract'로 선언한 클래스로서, 다음 두 가지 경우가 있다.

  • 추상 메서드를 최소 한 개 이상 가지고 abstract로 선언된 클래스
  • 추상 메서드가 없어도 abstract로 선언한 클래스

만약 추상 메서드를 갖고 있다면 반드시 추상 클래스로 선언되어야 한다.

abstract class Shape{

    public Shape() { ... }
    public void edit() { ... }
    
    astract public void draw(); //추상 메서드 선언
}

//추상 메서드가 없는 추상 클래스
abstract class JComp{
    
    String name;
    
    public void load(String name){
        this.name = name;
    }
}

 

※ 추상 메서드

추상 메서드(abstract method)란 abstract 키워드와 함께 원형만 선언되고, 코드는 작성되지 않은 메서드이다.

ex) abstract public String getName(); ( O )
     abstract public String getName() { return name; } ( X ) //오류

위에서 언급한 것처럼 추상 클래스는 인스턴스(객체, 실체)를 생성할 수 없다.

추상 클래스에는 실행 코드가 없는 미완성 상태인 추상 메서드가 있을 수 있기 때문이다. 추상 클래스를 객체화 하려고 하면 컴파일 오류가 발생한다.

Shape shape = new Shape(); //Compile Error

 

추상 클래스 상속과 구현

※ 추상 클래스의 상속

 

추상 메서드를 가진 추상 클래스를 상속 받는 자식 클래스는 자동으로 추상 클래스가 된다. 이는 추상 메서드를 상속받기 때문이다. 그러므로 자식 클래스에 abstract를 붙여 추상 클래스임을 명시해야 한다.

abstract class A{
    abstract public int add(int x, int y);
}

abstract class B extends A{ //추상 메서드 add()를 상속받았기 때문
    public void show() {System.out.println("B"); }
}

/* ------------------ */

A a = new A(); // (X) 추상 클래스의 객체 생성 불가
B b = new B(); // (X) 추상 클래스의 객체 생성 불가

※ 추상 클래스의 구현

 

추상 클래스의 구현이란 자식 클래스에서 부모 클래스의 모든 추상 메서드를 오버라이딩해 실행 가능한 코드로 구현하는 것이다.

class C extends A{

    @Override
    public int add(int x, int y) {
        return x + y;
    }
    
    public void draw() {
        System.out.println("C");
    }
}

/* -------------------------------- */
C c = new C(); // (O)

 

※ 추상 클래스의 목적

 

추상 클래스를 작성하는 목적은 객체를 생성하기 위한 것이 아니고, 상속을 위한 부모 클래스로 사용하기 위함이다. 추상 클래스는 추상 메서드를 통해 자식 클래스가 구현할 메서드의 원형을 알려주는 인터페이스 역할을 하고, 자식 클래스의 다형성을 실현한다.

 

코드의 공통적인 부분을 제시하고 표준화 하기 위해 사용된다.


인터페이스

인터페이스라는 단어는 많이 접해보았을 것이다. 소프트웨어에서의 인터페이스는 소프트웨어를 '규격화'된 모듈로 만들고 인터페이스가 맞는 모듈을 조립하듯 응용프로그램을 작성할 수 있다.

 

자바에서는 'interface'라는 키워드를 사용해 인터페이스를 작성할 수 있다. 작성 예시는 다음과 같다.

public interface Phone{

    public static final int abc = 100; //public static final 생략 O

    public abstract void sendCall();
    public abstract void receive();
    void sendMessage(); //public abstract 생략 O
    
    public default showNum() {
        System.out.println("010-2222-3333");
    }
}

인터페이스의 구성

인터페이스는 5개의 멤버(상수, 추상 메서드, default 메서드, private 메서드, static 메서드)로 구성되고 필드(멤버 변수)를 만들 수 없다.

  • 상수는 public static final 속성이고, 생략 가능
  • 추상 메서드는 public abstract 속성이고, 생략 가능
  • default 메서드의 접근 지정은 public으로 고정
  • private 메서드는 인터페이스 내의 다른 메서드에서만 호출 가능
  • static 메서드의 경우 접근 지정이 생략되면 public이고, private으로 지정 가능
  • static, private, default 메서드는 코드가 작성되어 있어야 함.

 

 

[not yet]

///////////////////////////////////////////////

# 탑 -> 다운

비행기

전투기, 적 전투기

 

# 바텀 -> 업

전투기, 적 전투기

비행기

(고도화 / 리팩토링 작업)

반응형

'Languages > Java' 카테고리의 다른 글

[Java] 하나의 객체로 Singleton 패턴 적용  (0) 2021.08.06
[Java] 파일 입력과 EOF  (0) 2021.03.10
[Java] Shuffle 메서드  (0) 2021.03.10
[Java] 상속  (0) 2021.03.08
[Java] 클래스와 객체  (0) 2021.03.01
Comments