Puter의 잡동사니

추상 클래스_abstract class

추상화 - 클래스 간의 공통점을 찾아내서 공통의 조상을 만드는 작업

추상 클래스 - 미완성 설계도
  • 추상 메서드를 포함하는 클래스
  • 추상 클래스로 인스턴스는 생성 불가능
  • 상속을 통해 자손 클래스에 의해서만 완성 
  • 여러 클래스에 공통적으로 사용될 수 있는 추상 클래스를 바로 작성하거나 기존 클래스의 공통 부분을 뽑아서 작성
  • 다른 클래스를 작성하는 데 도움을 줄 목적
  • 생성자, 멤버변수, 메서드를 가질 수 있음
  • 추상 메서드를 구현하기 위해 있는 클래스이므로 final을 사용하면 안 됨

abstract class [클래스이름] {
    abstract [리턴타입] [메서드이름]();
}

추상 메서드 - 선언부만 작성하고 실제 내용은 상속받는 클래스에서 구현하도록 비워둔 것
  • 몸체는 없고 선언부만 존재
  • 상황에 맞게 적절히 구현 (자손마다 다르게 구현될 것으로 예상)
  • 추상 메서드가 하나 이상 있으면 반드시 추상 클래스로 선언

추상 클래스를 사용하는 이유
  • 강제성 - 자손 클래스에서 추상 메서드를 반드시 구현하도록 강요

틀만 있는 계산서 발행 (추상 클래스)

실제 클래스의 공통된 필드와 메서드의 이름을 통일하기 위해
  • 유지 보수

실제 클래스를 작성하는 시간을 절약하기 위해
  • 중복 제거


Ch07Abstract.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.test.hello;
//abstract - 추상의, 미완성의
public abstract class Ch07Abstract {
    public int point = 1000;
    public final int ALL_POINT = 20000// 상수
    
    // 추상 메서드는 바디부가 없다
    // 추상 메서드는 일반 클래스에 사용할 수 없다
    // 틀을 제공 -> 코드의 효율적 관리 가능
    public abstract void myPrint();
    
    public boolean userCheck(int ssn) {
        //10000 line...
        return true;
    }
    
    public static void main(String[] args) {
    
    }
}
cs


Ch07AbstractChild.java
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
//추상 부모 클래스를 추상 자식 클래스가 상속하는 이유
//메서드 세분화
public abstract class Ch07AbstractChild extends Ch07Abstract {
    int point = 1010;
    
    public Ch07AbstractChild() {
        //추상클래스는 생성자를 제공한다.
        super();
        //new Ch07Abstract(); //error
    }
    
    //추상 메서드
    public abstract void childAbsFunc();
    
    //추상 클래스를 상속받은 클래스는 추상 메서드를 반드시 구현해야 함
    //강제성
    //자식 클래스도 추상 클래스면 강제성이 사라짐
    public void myPrint() {
        System.out.println("추상 메서드 오버라이딩");
        System.out.println(super.point); // 1000
        System.out.println(point);
    }
    
    public static void main(String[] args) {
        // 추상클래스는 인스턴스화(new) 못함
        // Ch07Abstract ab = new Ch07Abstract(); //error
    
        //Ch07AbstractChild cac = new Ch07AbstractChild();
        //cac.myPrint();
    }
}
cs


인터페이스_interface

일종의 추상 클래스
그 자체만으로 사용되기 보다는 다른 클래스를 작성하는데 도움 줄 목적

인터페이스의 메서드는 무조건 바디부가 없음.
  • 나중에 구현할 목적

기능 단위로 세분화

  • 대표적 규제

  • 기본 설계도
  • 파라미터가 몇 개 인지, 어떤 메소드를 어떤 타입으로 할지 미리 약속

  • 다중 상속

구현_implements

1
2
3
4
public Interface [인터페이스이름] {
    (public static final) [타입] [상수이름] = [값];
    (public abstract) [메서드이름]([파라미터]);
}
cs


  • 클래스를 사용하는 쪽(User)과 클래스를 제공하는 쪽(Provider)이 있다
  • 메서드를 사용(호출)하는 쪽(User)에서는 사용하려는 메서드(Provider)의 선언부만 알면 된다.
  • 내용(바디부)은 몰라도 됨


<장점>
  • 개발 시간 단축
  • 메서드의 내용에 관계없이 선언부만 알면 되기 때문

  • 표준화 가능
  • 기본 틀을 언터페이스로 작성 → 인터페이스 구현

  • 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다
  • 상속관계 또는 같은 조상클래스를 보유하지 않은 클래스들에게 인터페이스를 공통적으로 구현하도록 하여 관계를 맺어 줄 수 있다

  • 독립적인 프로그래밍 가능
  • 클래스의 선언과 구현을 분리시킬 수 있어서 실제구현에 독립적으로 작성 가능


Ch07Inter.java
1
2
3
4
5
6
7
public interface Ch07Inter extends Ch07InterParent1{
    int NUM = 20//인터페이스에서 변수 이름 무조건 대문자
                  //public static final이 자동으로 붙으니까
    
    void interMethod(int a); //무조건 public abstract가 생략되어 앞에 붙음
    // void myPrint2(){}; // error
}
cs


Ch07Face.java
1
2
3
4
5
6
7
8
9
10
public class Ch07Face extends Ch07InterClass implements Ch07Inter{
    @Override
    public void parent1Method() {
    }
    
    @Override
    public void interMethod(int a) {
        System.out.println(a);
    }
}
cs


Ch07InterClass.java
1
2
3
4
5
public class Ch07InterClass {
    public void myClassPrint(int a) {
        System.out.println(a+"bc");
    }
}
cs


Ch07InterParent1.java
1
2
3
public interface Ch07InterParent1 {
    void parent1Method();
}
cs


Ch07InterParent2.java
1
2
3
public interface Ch07InterParent2 {
    void parent2Method();
}
cs




댓글 로드 중…

블로그 정보

잡다한 것이 한데 뒤섞인 곳

최근에 게시된 글