JAVA기초

추상클래스, 추상메서드, 익명클래스 ,인터페이스,함수형인터페이스

LRWoo 2023. 6. 7. 19:13
728x90
반응형

2023.06.02 - [JAVA기초] - 스태틱 (static) 정적변수, 정적메서드 ,final

 

스태틱 (static) 정적변수, 정적메서드 ,final

static (값이 변하지 않는) 객체를 생성하지 않아도 접근할 수 있는 요소에 static을 붙힌다. ex) 책 : 사각형 (고정) , 사람 : (고정) 객체를 지정하지않아도 고정되어있는 값에 static을 붙힐 수 있다. ex

ji7290.tistory.com

 

이전 글에서는 static 에 대해서 다뤄보았다 .

 

이번 글에서는  추상클래스에 대해서 다뤄보자

 

 

추상클래스 : 추상 메서드를 포함할 수 있는클래스 , 일반 메서드도 포함할 수 있다.
추상 메서드 : 함수의 형식은 정해져 있으나, 구체적 내용은 정해지지 않은 함수
* (오버라이딩 : 물려받은클래스의 함수를 덮어쓰는것)을 강제하기 위해서 

 

 

ex) 
a:동물을 그려주세요
b: 무슨 동물을 그릴까요? 코끼리? 뱀? 사자? 
a: 아니요 그냥 동물을 그려주세요
b: ^^;;;;;;
구체적으로 명시할 수 없는 것 즉, 추상적인 것은 객체화 할 수 없다. 

 

추상 메서드는 바디(함수내용)을 지정할 수 없다.
에러메시지 : Abstract methods do not specify a body
즉, 중괄호를 펼칠 수  없다. 

 

 

 

추상 메서드는 반드시 추상클래스 안에서 선언되어야 한다. 
에러메시지 : The abstract method test3 in type Abstract can only be defined by an abstract class

 

 

추상메서드는 객체화 할 수 없다.
Cannot instantiate the type Abstract

 

 

 

 

 

 

The type Sub must implement the inherited abstract method Abstract.test3()
자료형 sub는 상속받은 추상 메서드 test3()를 반드시 구현(구체화) 해야 합니다.

 

클래스 sub가 추상클래스를 상속받았기 때문에 메서드도 추상메서드가 된다. 즉 반드시 오버라이딩 해야한다.

 

 

 

 

오버라이딩을 통해 함수를 구체화하였으므로 객체를 생성할 수 있다.

 

 

출력결과

 

 

test3 내용만 구체화 하여 결정한다면 객체를 생성할 수 있다.
ob5는 Abstract의 내용을 상속받은 후 test()의 내용을 구현한 이름없는 클래스 
미구현 메서드의 내용을 만들기 위햇 클래스를 새로 작성하는 것이 번거로울 수 있다. 
즉석 에서 클래스 상속 + 미구현 메서드 내용 구현을 수행하면서 객체를 생성하는 문법
Anonymous Inner Type : 익명 내부 클래스 

 

 

익명클래스 : 추상클래스에서 상속받아서 미구현 메서드내용을 구체화 시키면서 즉석에서 객체를 생성하는 코드

 

 

 

 

 

이클립스에서 패키지를 윈도우 탐색기로 열어보자 

Ex01 클래스 내에서 $1.class로 익명클래스로 작성돼 있다.

 

 

 

 

 

 

 

추상클래스를 이용한 간단한 예제 
MyButton 추상클래스를 상속받는 TestButton, squareButton클래스 
익명내부클래스 정의 (MyButton)

 

MyButton은 오로지 상속을 위한 클래스 

 

 

 

TestButton클래스를 상속받는클래스들

=> 오버라이딩을 통해 함수 내용 구체화

 

TestButton

 

 

SquareButton : 5x5의 별을 그리는 사각형 클래스

 

 

익명내부클래스 MyButton  

click함수를오버라이딩해서 런타임 객체를 이용해서 네이버 지도 열기 

 

 

 

 

 

다형성에 의해서 각각의 서브클래스 btn1, btn2, btn3 객체들은   슈퍼클래스 MyButton로 받을 수 있다.

 

 

 

예를들어서 

MyButton 자료형 으로 ob1,ob2,ob3의 객체를 배열로 묶어서 (업캐스팅)

arr의 배열에 담아줘도 arr내부의 각 btn은 btn을 클릭했을때의 결과를 호출한다.  

 

(오버라이딩의 고유성 때문이다)

 

 

 

 

추상 클래스를 활용하여 객체를 구성하면
서로다른클래스를 작성하고,서로 다른 내용의 함수를 구성하면서도
일관된 방식으로 접근하여 처리할 수 있게 된다.

 

 

 

 

 


 

 

상속과 추상클래스를 쓰지않고  위의 코드를 작성해보자

 

 

 

추상클래스를 생성하지도 않았고 상속도 받지않는다.  따라서 오버라이딩을 쓰지 못하기 때문에 

오브젝트 클래스(최상위 클래스)에  onClick이라는 함수가 없기때문에 호출이 안된다.

 

자료형이 모두 다르지만 이름이 같은 변수들을 하나의 배열에 묶지못하는 것처럼. 

 

 

일반클래스는 개별 실행은 가능하지만 , 일괄처리는 불가능하다. 

즉 , 추상클래스는  서로다른 객체의 공통점만 뽑아서
각자의 고유기능을 업캐스팅을 통해서 코드를 효율적으로 작성 할 수 있다. 

 


 

interface

 

 

인터페이스는 추상클래스의 한 종류
인터페이스는 자료형으로 사용할 수 있다.
일반메서드보다 좀 더 추상화의 형태가 강제된 클래스

 

 

인터페이스는 추상클래스의 한 종류이다.
인터페이스는 자료형으로 사용할 수 있다.
인터페이스의 모든 필드는 public static final이다
인터페이스의 모든 메서드는 public abstract 이다
인터페이스는 extends 대신 implements 키워드로 상속(구현)처리한다
인터페이스는 일반적인 상속과는 달리, 다중 상속을 허용한다

 

 

인터페이스의 모든 필드는 public static final이다.
에러메시지 : Illegal modifier for the interface field Test1.n1; only public, static & final are permitted

 

 

인터페이스의 함수는 오로지 public, abstract, default, static만 허용된다.
에러메시지
Illegal modifier for the interface method show; only public, abstract, default, static and strictfp are permitted

 

 

 

인터페이스를 상속받을땐 implements이다. 

test1이 추상클래스니까 show메서드를 오버라이딩 

 

 

 

하나의 클래스가 여러개의 인터페이스를 상속받을 수 있다.

함수를 지정해줘야 되는 인터페이스가 있고,  함수를 별도로 지정하지 않아도 되는 인터페이스가 있다. 

 

 

 

main에서 인터페이스 함수의 호출( 예외처리 throws Exception을 해줬다 )

 

 

 

인터페이스는 어떤 클래스를 만들때 implements로 특성을 부여해줄 수가 있다. 
자료형을 묶으면서도 서로 다르게 반응하게 해줄 수 있다.  슈퍼클래스가 있든 없든 상속이된다.

 

마우스,키보드, 스피커를 PC객체 와 연결하는
USB 인터페이스 코드를 작성해보자.

 

 

 

main함수에서 스피커와 메모리스틱, 키보드의 객체를 각각 다르게 지정해줘도 

각각의클래스가 인터페이스 USB를 implements 하고 있기때문에.  PC객체 내부의 함수호출이 가능하다.

 

 

인터페이스의 추상 메서드가 오직 하나만 있으면 "함수형 인터페이스" 라고 한다.
함수형 인터페이스는 자바 8에서 추가된 람다식을 이용하여 객체를 생성할 수 있다 .
익명 클래스와 유사하지만, 훨씬 더 간결한 문법으로 처리할 수 있다.

 

 

728x90
반응형