산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

자바 추상화: 코드 단순화와 가독성 향상

사전적 의미로 추상화(abstraction)는 사건보다는 아이디어를 다루는 성질입니다. 예를 들어 이메일을 보낼 때, 이메일을 보내는 순간 무슨 일이 일어나는지, 이메일 서버가 어떤 프로토콜을 사용하는지 같은 복잡한 세부사항은 사용자에게 숨겨져 있습니다. 따라서 이메일을 보내려면 내용만 적고 수신자 주소를 적은 뒤 보내기만 누르면 됩니다.

마찬가지로 객체지향 프로그래밍에서 추상화는 구현 세부사항을 사용자로부터 숨기고 기능만 제공하는 과정입니다. 즉, 사용자는 객체가 무엇을 하는지 알지만 어떻게 하는지는 모릅니다.

자바에서는 추상 클래스와 인터페이스를 사용하여 추상화를 달성합니다.

추상 클래스(Abstract Class)

선언에 abstract 키워드가 포함된 클래스를 추상 클래스라고 합니다.

예제: 추상 클래스

추상 클래스를 만들려면 클래스 선언에서 abstract 키워드를 class 키워드 앞에 붙이면 됩니다.


/* File name: Employee.java */
public abstract class Employee {
    private String name;
    private String address;
    private int number;

    public Employee(String name, String address, int number) {
        System.out.println("Constructing an Employee");
        this.name = name;
        this.address = address;
        this.number = number;
    }

    public double computePay() {
        System.out.println("Inside Employee computePay");
        return 0.0;
    }

    public void mailCheck() {
        System.out.println("Mailing a check to " + this.name + " " + this.address);
    }

    public String toString() {
        return name + " " + address + " " + number;
    }

    public String getName() { return name; }
    public String getAddress() { return address; }
    public void setAddress(String newAddress) { address = newAddress; }
    public int getNumber() { return number; }
}

추상 메서드를 제외하면 Employee 클래스는 자바의 일반 클래스와 같습니다. 클래스는 이제 추상적이지만 여전히 세 필드, 일곱 메서드, 한 생성자를 가집니다.

이제 다음과 같이 Employee 클래스를 인스턴스화해 보세요.


/* File name: AbstractDemo.java */
public class AbstractDemo {
    public static void main(String[] args) {
        /* 다음은 허용되지 않으며 에러 발생 */
        Employee e = new Employee("George W.", "Houston, TX", 43);
        System.out.println("\n Call mailCheck using Employee reference--");
        e.mailCheck();
    }
}

위 클래스를 컴파일하면 다음 에러가 발생합니다.


Employee.java:46: Employee is abstract; cannot be instantiated
Employee e = new Employee("George W.", "Houston, TX", 43);
^
1 error

추상 클래스 상속받기

Employee 클래스의 속성을 일반 클래스처럼 상속받을 수 있습니다.

예제


/* File name: Salary.java */
public class Salary extends Employee {
    private double salary;  // 연봉

    public Salary(String name, String address, int number, double salary) {
        super(name, address, number);
        setSalary(salary);
    }

    public void mailCheck() {
        System.out.println("Within mailCheck of Salary class ");
        System.out.println("Mailing check to " + getName() + " with salary " + salary);
    }

    public double getSalary() { return salary; }
    public void setSalary(double newSalary) {
        if (newSalary >= 0.0) {
            salary = newSalary;
        }
    }

    public double computePay() {
        System.out.println("Computing salary pay for " + getName());
        return salary / 52;
    }
}

여기서 Employee 클래스는 인스턴스화할 수 없지만 Salary 클래스는 인스턴스화할 수 있으며, 이 인스턴스를 통해 Employee 클래스의 세 필드와 일곱 메서드 모두에 접근할 수 있습니다.


/* File name: AbstractDemo.java */
public class AbstractDemo {
    public static void main(String[] args) {
        Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
        Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);

        System.out.println("Call mailCheck using Salary reference --");
        s.mailCheck();

        System.out.println("\n Call mailCheck using Employee reference--");
        e.mailCheck();
    }
}

다음 결과가 나옵니다.

출력


Constructing an Employee
Constructing an Employee
Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0

Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.0

추상 메서드(Abstract Methods)

어떤 클래스에 특정 메서드를 포함시키고 싶지만 그 메서드의 실제 구현을 자식 클래스가 결정하게 하고 싶다면, 부모 클래스에서 그 메서드를 추상으로 선언하면 됩니다.

예제: 추상 메서드


public abstract class Employee {
    private String name;
    private String address;
    private int number;

    public abstract double computePay();
    // 클래스 정의 나머지
}

메서드를 추상으로 선언하면 두 가지 결과가 따릅니다.

참고 - 결국 어떤 자손 클래스는 추상 메서드를 구현해야 합니다. 그렇지 않으면 인스턴스화할 수 없는 추상 클래스 계층만 남게 됩니다.

Salary 클래스가 Employee 클래스를 상속받는다면 computePay() 메서드를 다음과 같이 구현해야 합니다.


/* File name: Salary.java */
public class Salary extends Employee {
    private double salary;  // 연봉

    public double computePay() {
        System.out.println("Computing salary pay for " + getName());
        return salary / 52;
    }
    // 클래스 정의 나머지
}

java

  1. Java final 키워드 마스터: 변수, 메서드, 클래스에서의 활용
  2. Java instanceof 연산자 완벽 가이드: 기본 사용법부터 상속, 인터페이스까지
  3. Java 추상 클래스와 메서드 완벽 가이드
  4. Java 정적 중첩 클래스 이해: 용법, 내부 클래스와의 차이, 예제
  5. Java 익명 내부 클래스 마스터: 정의, 문법, 실전 예제
  6. Java 싱글톤 패턴 완벽 가이드: 안전하게 구현하고 사용하기
  7. Java 리플렉션 마스터: 런타임에 클래스, 메서드, 필드 검사 및 조작
  8. Java ObjectOutputStream 마스터하기: 직렬화, 메서드, 실전 예제
  9. Java 제네릭 마스터하기: 재사용 가능하고 타입 안전한 코드 작성
  10. java.io로 Java 파일 작업 마스터하기 – 생성, 읽기, 쓰기 및 삭제