what is abstraction java learn with examples
이 튜토리얼에서는 프로그래밍 예제와 함께 Java의 추상화가 무엇인지 설명합니다. 또한 추상 클래스가 무엇이며 왜 사용되는지를 배웁니다.
이 JAVA 시리즈에서는 추상화, 캡슐화, 상속 및 다형성과 같은 네 가지 기둥으로도 알려진 객체 지향 프로그래밍 (OOP)의 중요한 기능에 대해 설명합니다.
OOP의 첫 번째 기둥은 '추상화'입니다. '추상화는 사용자에게 관련 정보 만 표시하기 위해 데이터를 선택하는 프로세스입니다.'
=> 여기에서 Java Beginners Guide를 살펴보십시오.
학습 내용 :
OOP의 추상화
간단히 말해서 추상화는 객체의 관련 속성 만 '표시'하고 불필요한 세부 정보는 '숨 깁니다'.
예를 들면 우리가 자동차를 운전할 때 우리는 자동차의 시동 / 정지, 가속 / 브레이크 등과 같은 자동차 운전에만 관심이 있습니다. 실제 시작 / 정지 메커니즘이나 가속 / 제동 프로세스가 내부적으로 어떻게 작동하는지에 대해서는 관심이 없습니다. 우리는 그러한 세부 사항에 관심이 없습니다.
우리가 염려하는 것은 자동차를 앞으로 나아가고 목적지에 도달하는 데 도움이되는 이러한 작업에 대한 '추상적 인'보기입니다. 이것은 추상화의 간단한 예입니다.
따라서 자동차는 모든 메커니즘과 프로세스를 갖추고 있지만 최종 사용자의 관점, 즉 자동차 운전자의 관점에서는 이러한 프로세스의 추상적 인 관점에만 관심이 있습니다.
추상화는 프로그래밍 노력과 복잡성을 줄여줍니다. 애플리케이션을 사용하는 최종 사용자는 특정 기능이 구현되는 방식에 대해 걱정할 필요가 없습니다. 필요에 따라 기능을 사용할 수 있습니다.
따라서 추상화에서 우리는 사건이 아닌 아이디어를 다룹니다. 즉, 사용자에게 구현 세부 정보를 숨기고 최종 사용자에게 기능 만 노출합니다. 따라서 사용자는 '어떻게 하는가'보다는 '그것이하는 일'만 알 수 있습니다.
OOP의 추상화는 두 가지 유형이 있습니다.
# 1) 데이터 추상화
데이터 추상화에서 우리는 대부분 복잡한 데이터 유형을 만들고 구현을 숨 깁니다. 구현의 세부 사항으로 이동하지 않고 이러한 데이터 유형을 조작하는 작업 만 노출합니다.
이 접근 방식의 한 가지 장점은 사용자에게 노출되는 동작을 변경하지 않고 언제든지 구현을 변경할 수 있다는 것입니다.
# 2) 제어 추상화
제어 추상화는 애플리케이션의 일부인 모든 제어문을 수집하고이를 하나의 단위로 노출합니다. 이 기능은이 제어 장치를 사용하여 작업 기능을 수행해야 할 때 사용됩니다.
제어 추상화는 구조화 된 프로그래밍의 기본 단위를 형성하며 제어 추상화를 사용하여 복잡한 프레임 워크에 간단한 기능을 정의 할 수 있습니다.
Java에서 추상화 란?
Java는 OOP 언어이므로 추상화는 Java 언어의 중요한 기능 및 구성 요소 중 하나로 볼 수 있습니다. Java에서 추상화는 추상 클래스와 인터페이스를 사용하여 구현됩니다.
그렇다면 Java에서 추상화를 어떻게 구현할까요? Java는 추상화 구현을위한 비 액세스 수정 자 '추상'을 제공합니다. 이 추상 수정자는 클래스 및 메서드와 함께 사용할 수 있지만 변수에는 사용할 수 없습니다.
인터페이스는 완전한 추상화를 제공합니다. 즉, 구현이 아닌 메서드 프로토 타입 만 제공합니다. 추상 클래스는 적어도 하나의 메서드가 구현되어서는 안되는 부분 추상화를 제공합니다.
이 튜토리얼에서는 추상 클래스를 사용한 추상화에 대해 자세히 설명합니다. 이후 튜토리얼에서 인터페이스를 자세히 살펴볼 것입니다.
자바 추상화 예
아래 예를 살펴 보겠습니다.
//abstract class abstract class Car{ abstract void accelerate(); } //concrete class class Suzuki extends Car{ void accelerate(){ System.out.println('Suzuki::accelerate'); } } class Main{ public static void main(String args()){ Car obj = new Suzuki(); //Car object =>contents of Suzuki obj.accelerate(); //call the method } }
산출:
osi 모델의 어떤 레이어가 프레임과 함께 작동합니까?
위에 주어진 간단한 추상화 예제에는 Car 클래스가 있습니다. 이 클래스 Car에는 ()를 가속하는 추상적 인 방법이 있습니다. 그런 다음이 클래스를 Suzuki 클래스에서 상속합니다. Suzuki 클래스 내에서 가속 메서드를 구현합니다.
위의 예제는 단순히 추상 클래스가 정의되고 상속 된 다음 프로그램에서 사용되는 방식을 보여줍니다.
Java 추상 클래스 란?
Java가 추상 클래스와 인터페이스를 사용하여 추상화를 구현한다고 이미 언급했습니다. 먼저 추상 클래스에 대한 모든 것을 살펴 보겠습니다.
추상 클래스는 'abstract'키워드로 선언 된 클래스로 정의 할 수 있으며 인스턴스화 할 수 없다는 제한이 있습니다.
추상 클래스에는 추상 메서드 (구현이없는 메서드)가있을 수도 있고 없을 수도 있습니다. JVM에 관한 한 추상 클래스는 완전한 동작이없는 불완전한 클래스입니다.
추상 클래스의 일반적인 구문은 다음과 같습니다.
abstract class { public abstract void abstractMethod(); public void normalMethod() { //method body } }
위의 추상 클래스의 구문에서 볼 수 있듯이 추상 클래스에서 추상 및 비추 상 메서드를 가질 수 있습니다. 키워드‘abstract’는 클래스 선언 앞에옵니다.
간단히 말해서 추상 클래스는 아래와 같이 설명 할 수 있습니다.
자바의 추상 메서드
추상 메서드는 구현없이 'abstract'키워드가 앞에 오는 메서드입니다. 추상 메서드는 추상 클래스 내부에서 선언됩니다.
추상 메서드는 구현이 없기 때문에 클래스를 불완전하게 만드는 메서드입니다. 따라서 클래스에 추상 메서드를 포함 시키면 자연스럽게 클래스가 불완전 해집니다.
추상 메서드를 하위 클래스에서 구현하여 사용할 수 있습니다. 즉, 클래스가 추상 클래스를 상속 한 다음이를 재정 의하여 추상 클래스에 선언 된 모든 추상 메서드에 대한 코드를 구현하거나 제공합니다.
따라서 하위 클래스에서 추상 메서드를 재정의해야합니다. 추상 메서드가 하위 클래스에서도 구현되지 않으면 하위 클래스도 '추상'으로 선언해야합니다.
추상 메서드의 일반적인 선언은 다음과 같습니다.
내 인터넷 보안 키는 무엇입니까
요약 빈 methodName (parameter_list);
추상 메서드를 작성하는 동안 다음 규칙을 기억해야합니다.
- 하나 이상의 추상 메서드를 포함하는 클래스는 추상 클래스입니다.
- 다른 특정 키워드는 abstract 키워드와 함께 사용할 수 없습니다.
따라서 다음 조합은 Java에서 불법입니다.
- 결정적인
- 추상 네이티브
- 추상 정적
- 추상 개인
- 추상 동기화
- 추상 strictfp
추상 클래스와 추상 메서드의 예를 구현해 보겠습니다.
//abstract class abstract class Bank{ abstract int getInterestRate(); } //concrete class class Citi extends Bank{ int getInterestRate(){return 7;} } //concrete class class HSBC extends Bank{ int getInterestRate(){return 6;} } class Main{ public static void main(String args()){ Bank b; b = new Citi (); // concrete class object System.out.println('Citi Rate of Interest is: '+b.getInterestRate()+'%'); b = new HSBC (); // concrete class object System.out.println('HSBC Rate of Interest is: '+b.getInterestRate()+'%'); } }
산출:
위의 예에는 Bank 클래스가 있습니다. 이 클래스에는 추상 메소드 인 getInterestRate ()가 있습니다. 그런 다음 Bank 클래스에서 상속하는 ICICI 및 BOI의 두 클래스를 선언합니다. 이 두 클래스는 각각의 이자율을 반환하여 getInterestRate () 메서드를 구현합니다.
그런 다음 주요 방법에서 은행 객체를 만듭니다. 먼저 은행 객체는 ICICI 클래스의 객체를 포함하고 이자율을 표시합니다. 다음으로 BOI 개체가 생성되고 이자율이 표시됩니다.
따라서 우리는 Bank 클래스가 이자율을 얻을 수있는 일종의 스케치 또는 구조라고 가정 할 수 있습니다. 이 구조에서 원하는만큼 구체적인 클래스를 생성 할 수 있으며 각 은행 객체에 대한 각각의 이자율을 얻을 수 있습니다 (이는 주요 방법에 표시됨).
Java에서 추상 클래스의 사용은 무엇입니까
실제로 자체 구현이 없는데 추상 클래스를 사용하는 이유는 무엇입니까?
위의 질문에 대한 답과 함께 다음 예제에서 추상 클래스를 사용하는 방법도 설명합니다.
차량의 예를 살펴 보겠습니다. 차량은 다양한 유형이 될 수 있습니다. 우리는 자동차, 스쿠터, 자전거, 모 페드, 버스 등을 가질 수 있습니다. 많은 유형의 차량이 있지만 유형에 관계없이 모든 차량에 공통적 인 속성 또는 속성이 있습니다.
예를 들면 각 차량에는 모델, 섀시 번호, 색상 등이 있습니다. 각 차량에는 시작, 정지, 가속, 브레이크 등과 같은 기능이 있습니다. 이제 각 차량은 다른 차량에도 공통되는 위의 속성과 방법을 갖게됩니다. 차량 사용자와 동시에 우리는 일부 측면에 관심이 없을 수 있습니다.
예를 들면 사람이 차를 운전하고 있다면 그 / 그녀가 관심을 갖는 것은 차량을 시동 및 정지하거나 차량을 가속 또는 제동하는 것입니다. 그 / 그녀는 차량이 어떻게 시작하거나 멈추는 지 아는 데 관심이 없을 것입니다. 우리는 함수의 추상적 인 작동에만 관심이 있고 세부 사항에는 관심이 없습니다.
이제 위의 예제 시스템을 소프트웨어 애플리케이션으로 표현하려면 어떻게 설계해야합니까? 우선, 우리는 추상화를 구현할 것입니다. 이제 일부 기능은 공통적이지만 각 모델에 따라 이러한 기능의 구현이 다릅니다.
우선, 추상 클래스 'Vehicle'을 선언합니다.
이 시스템은 다음과 같습니다.
그래서 우리는 추상 클래스 Vehicle을 가질 것이고, 차량의 각 모델을 나타내는 구체적인 클래스가있을 것입니다. 설명을 위해 자동차, 자전거, 스쿠터의 세 가지 모델 만 사용했습니다.
아래는 위 시스템의 클래스 계층 구조입니다.
abstract class Vehicle{ abstract void start () ; abstract void stop (); abstract void accelerate (); abstract void brake (); } class Car extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} } class Bike extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} } class Scooter extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} }
따라서 Vehicle 추상 클래스와 Car, Bike 및 Scooter의 세 가지 클래스가 있습니다. 이러한 각 클래스는 Vehicle 클래스를 확장하고 각 추상 메서드를 재정의합니다.
따라서 일반적으로 표현할 일반적인 방법이나 작업이있는 이러한 시스템을 표현해야 할 때마다 사용자에게 외부 관점 만 제공하려면 추상화를 수행합니다. 결과적으로 우리는 공통 메서드를 꺼내 추상 메서드로 표현하고 이러한 추상 메서드를 공통 추상 클래스에 수집합니다.
시스템의 개요를 추상 클래스로 표현하고 연산을 추상 메서드로 표현하면 주어진 추상 클래스에서 원하는 수의 클래스를 파생하고 각 클래스에 대해 이러한 작업을 구현하기 위해 추상 메서드를 재정의 할 수 있습니다.
이렇게하면 시스템을 설계하는 데 유용합니다.
추상 클래스 및 인터페이스
위의 추상 클래스를 보았습니다. 인터페이스는 추상화를 구현하는 또 다른 빌딩 블록입니다. 인터페이스는 계약이며 인터페이스를 구현하는 클래스는 이러한 계약을 준수해야합니다.
인터페이스의 계약은 구현되지 않은 메서드 일뿐입니다. 인터페이스 내부에는 메서드 프로토 타입 만 있습니다. 인터페이스 내부에는 단일 메소드 구현이 없습니다.
다음과 같은 인터페이스 선언이있는 경우 :
public interface interfaceA{ void myInterfaceMethod (); }
그런 다음 interfaceA를 구현하는 모든 클래스는 'myInterfaceMethod'를 재정의해야합니다.
클래스의 메서드를 재정의하지 않으면 해당 클래스가 추상으로 표시됩니다.
abstract class TestClass implements interfaceA{ // not a compulsion to override myInterfaceMethod. }
나중에 인터페이스에 대한 별도의 자습서가 있습니다.
다음으로 Java에서 Abstract 클래스와 인터페이스의 차이점에 대해 설명하겠습니다.
추상 클래스와 인터페이스의 차이점
추상 클래스 | 상호 작용 |
---|---|
추상 클래스는 공용 멤버와 별도로 개인 또는 보호 데이터 멤버를 가질 수 있습니다. | 인터페이스 멤버는 기본적으로 공용입니다. |
추상 클래스는 추상 및 / 또는 비추 상 메서드를 가질 수 있습니다. | 인터페이스에는 추상 메서드 만있을 수 있습니다. |
초록은 최종 변수를 포함하거나 포함하지 않을 수 있습니다. | 인터페이스는 최종 변수를 기본 변수로 사용할 수 있습니다. |
추상 클래스는 최종, 정적 또는 비 정적 또는 비 최종 변수를 가질 수 있습니다. | 인터페이스는 최종 및 정적 변수 만 가질 수 있습니다. |
추상 클래스는 인터페이스 구현을 제공 할 수 있습니다. | 인터페이스는 추상 클래스를 구현할 수 없습니다. |
추상 클래스는 'extends'키워드를 사용하여 상속됩니다. | 인터페이스는 'implements'키워드를 사용하여 구현됩니다. |
추상 클래스는 다른 클래스를 확장하거나 여러 인터페이스를 구현할 수 있습니다. | 인터페이스는 다른 인터페이스 만 구현할 수 있습니다. |
Java에서 추상 클래스 및 인터페이스를 사용하는 경우
추상 클래스를 사용할시기와 Java 애플리케이션에서 인터페이스를 사용할시기에 대한 결정은 당면한 문제를 철저히 이해 한 후 지능적으로 이루어져야합니다. 다음과 같이 고려해야 할 두 가지 측면이 있습니다.
부분 동작이있는 추상 클래스
우리는 추상 클래스가 완전히 덜 구현되지 않을 수 있다는 것을 알고 있습니다. 부분적인 동작을 할 수 있습니다. 반면에 인터페이스에는 구현이 없습니다. 따라서 추상 클래스와 구현 중에서 선택해야 할 때 응용 프로그램의 이러한 측면을 고려해야합니다.
이것은 우리가 디자인하고있는 애플리케이션이 추상 클래스에서 분리 할 수있는 공통 부분 구현을 가지고 있는지 먼저 결정해야 함을 의미합니다.
예를 들면 우리가 웹 애플리케이션을 설계하고 있다고 생각하십시오. 이를 위해 서블릿, REST API 등과 같은 웹 기술을 사용해야합니다. 이제 이러한 각 웹 기술에는 개발중인 응용 프로그램에 관계없이 구현할 기술이나 단계가 있습니다. 그런 다음 맞춤형 애플리케이션을 구축합니다.
따라서이 경우 웹 기술이 실행해야하는 명확한 코드를 추상 클래스에 넣을 수 있습니다. 이것에 대한 인터페이스를 가질 수 있습니까? 아니오. 이는 인터페이스가 구현을 가질 수 없기 때문입니다.
계약 전용 인터페이스
우리는 인터페이스에 그것의 일부인 계약이나 메서드가 있다는 것을 알고 있습니다. 이 메서드는 프로토 타입 일뿐입니다. 이러한 인터페이스를 클래스에서 구현 한 다음 메서드를 재정의해야합니다.