자바-추상화
사전에 따라 abstraction사건보다는 아이디어를 다루는 품질입니다. 예를 들어, 전자 메일의 경우를 고려할 때 전자 메일을 보내 자마자 일어나는 일과 같은 복잡한 세부 정보는 전자 메일 서버에서 사용하는 프로토콜이 사용자에게 표시되지 않습니다. 따라서 이메일을 보내려면 내용을 입력하고 수신자 주소를 언급 한 다음 보내기를 클릭하면됩니다.
객체 지향 프로그래밍과 마찬가지로 추상화는 구현 세부 사항을 사용자에게 숨기는 프로세스이며 기능 만 사용자에게 제공됩니다. 즉, 사용자는 객체가 수행하는 방식 대신 객체가 수행하는 작업에 대한 정보를 갖게됩니다.
Java에서는 추상 클래스와 인터페이스를 사용하여 추상화를 수행합니다.
추상 클래스
포함하는 클래스 abstract 선언의 키워드를 추상 클래스라고합니다.
추상 클래스는 추상 메서드를 포함하거나 포함하지 않을 수 있습니다 . 즉, 본문이없는 메서드 (public void get ();)
그러나 클래스에 하나 이상의 추상 메서드가있는 경우 클래스는 must 초록으로 선언되어야합니다.
클래스가 abstract로 선언되면 인스턴스화 할 수 없습니다.
추상 클래스를 사용하려면 다른 클래스에서 상속하고 그 안에있는 추상 메서드에 대한 구현을 제공해야합니다.
추상 클래스를 상속하는 경우 모든 추상 메서드에 대한 구현을 제공해야합니다.
예
이 섹션에서는 추상 클래스의 예를 제공합니다. 추상 클래스를 만들려면abstract 클래스 선언에서 클래스 키워드 앞의 키워드.
/* 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 클래스는 Java의 일반 클래스와 동일하다는 것을 알 수 있습니다. 클래스는 이제 추상이지만 여전히 3 개의 필드, 7 개의 메서드 및 1 개의 생성자가 있습니다.
이제 다음과 같은 방법으로 Employee 클래스를 인스턴스화 할 수 있습니다.
/* File name : AbstractDemo.java */
public class AbstractDemo {
public static void main(String [] args) {
/* Following is not allowed and would raise error */
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; // Annual 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 키워드는 메서드를 추상으로 선언하는 데 사용됩니다.
당신은 배치해야 abstract 메서드 선언에서 메서드 이름 앞에 키워드.
추상 메서드에는 메서드 서명이 포함되어 있지만 메서드 본문은 없습니다.
중괄호 대신 추상 메서드는 끝에 세모이 콜론 (;)이 있습니다.
다음은 추상 방법의 예입니다.
예
public abstract class Employee {
private String name;
private String address;
private int number;
public abstract double computePay();
// Remainder of class definition
}
메서드를 추상으로 선언하면 두 가지 결과가 있습니다.
그것을 포함하는 클래스는 추상으로 선언되어야합니다.
현재 클래스를 상속하는 모든 클래스는 추상 메서드를 재정의하거나 자신을 추상으로 선언해야합니다.
Note-결국, 자손 클래스는 추상 메소드를 구현해야합니다. 그렇지 않으면 인스턴스화 할 수없는 추상 클래스 계층 구조를 갖게됩니다.
Salary 클래스가 Employee 클래스를 상속한다고 가정하면 다음을 구현해야합니다. computePay() 아래와 같이 방법-
/* File name : Salary.java */
public class Salary extends Employee {
private double salary; // Annual salary
public double computePay() {
System.out.println("Computing salary pay for " + getName());
return salary/52;
}
// Remainder of class definition
}