본문 바로가기
Spring/Java

[JAVA - OOP 심화4] 추상화

by jungha_k 2022. 9. 8.

✨추상화 :

상속과 반대개념이라 생각해도 무방,

기존 클래스들의 공통적인 요소를 뽑아서 상위 클래스를 만듬

→ 상위 클래스 or 하위 클래스를 만들어도 ㅇㅋ

 

 

✨장점 : 코드의 중복 줄일수 있고, 클래스 간 관계 설정 가능, 유지/보수 용이해짐

 

abstract 제어자 : (기타제어자 중 하나)

‘추상적인’ = ‘미완성’

 

메서드 앞에 붙은 경우 : 추상 메서드(메서드 시그니처만 有, 바디는 無)

클래스 앞에 붙은 경우 : 추상 클래스

→ 클래스에 추상 메서드 포함시 자동으로 추상 클래스!

 

 

✨추상 클래스 - 객체 생성 불가함 그런데 추상 클래스를 왜 만들까?

  1. 상속관계에 있어 새로운 클래스 작성에 유용함 : 상위 클래스에서는 선언부만,
    하위 클래스에서는 구체적 작성해서 유연한 대응 가능함 (오버라이딩 - 각각 상황에 맞는 메서드 구현이 가능)
  2. 추상화를 구현하는데 핵심적인 역할 수행

 

추상클래스에는 객체의 공통적인 속성, 기능 들어간 클래스 선언

상속계층도의 상층부에 위치할 수록 추상화의 정도가 높고

그 아래로 내려갈수록 구체화 = 상층부에 가까울수록 더 공통적인 속성과 기능들이 정의

 

 


final 키워드 : 더이상 변경 불가, 확장되지 않는 성질 

 

final + 클래스 = 변경 or 확장 불가능한 클래스, 상속불가

final + 메서드 = 오버라이딩 불가

final + 변수 = 값 변경이 불가능한 상수


 

추상 클래스 = 미완성 설계도 라면?

인터페이스 = 기초적인 밑그림

 

추상 클래스 = 추상 메서드를 하나 이상 포함한 클래스

인터페이스 = 추상 메서드와 상수만을 멤버로 가질 수 있음 (=추상 메서드의 집합)

 

 

✨인터페이스의 기본 구조

 

내부의 모든 필드가 public static final로 정의되고, 

static과 default메서드 이외의 모든 메서드가 public abstract로 정의됨

(but 컴파일러가 추가해줌 - 생략 가능)

public interface InterfaceEx {
    public static final int rock =  1; // 인터페이스 인스턴스 변수 정의
    final int scissors = 2; // public static 생략
    static int paper = 3; // public & final 생략

    public abstract String getPlayingNum();
		void call() //public abstract 생략
}

 

✨인터페이스의 구현

 

그 자체로 인스턴스 생성 못함,

메서드 바디 정의하는 클래스 작성 필요함

 

extends 대신 implements 키워드 사용("구현한다")

 

클래스가 특정 인터페이스를 구현한다는 것

= 클래스에게 인터페이스의 추상 메서드를 반드시 구현하도록 강제하는 것

= 인터페이스가 가진 모든 추상 메서드들을 해당 클래스 내에서 오버라이딩 하여 바디를 완성한다!

 

 

 

✨인터페이스의 다중 구현

 

자바 - 다중 상속 불가!

but 인터페이스 - 다중 구현 가능! : 미완성된 멤버로 구성되어, 충돌이 발생할 여지가 없음

  1. 인터페이스는 인터페이스로부터만 상속 가능
  2. object 클래스같은 최고 조상 존재 X

 

✨인터페이스의 장점

 

껍데기 + 알멩이 = 유연하지 않아 변경에 불리함

껍데기(interface) + 알멩이 = 유연하여 변경에 유리함

 

 

이미지 출처 : https://velog.io/@iseon_u/Java-Interface-Advantages

 

 

따라서 interface -

1. 역할과 구현을 분리시킴 (중간역할!)

2. 복잡한 구현의 내용, 변경과 상관없이 해당 기능을 사용 가능

3. 선언과 구현을 분리시켜 개발시간을 단축

4. 독립적인 프로그래밍을 통해 한 클래스의 변경이 다른 클래스에 미치는 영향을 최소화

 


'Spring > Java' 카테고리의 다른 글

[Java] String Builder  (0) 2022.09.26
[JAVA - OOP 심화3] 다형성  (0) 2022.09.08
[JAVA - OOP 심화2] 캡슐화  (0) 2022.09.08
[JAVA - OOP 심화1] 상속  (0) 2022.09.08
[Java - OOP 기초3] 생성자와 내부클래스  (0) 2022.09.07

댓글