관리 메뉴

제뉴어리의 모든것

[Section1][Java] 객체지향 프로그래밍 심화 - 추상화에 대하여 본문

코드스테이츠/정리 블로깅

[Section1][Java] 객체지향 프로그래밍 심화 - 추상화에 대하여

제뉴어리맨 2022. 7. 13. 12:06

추상화란

어떠한 물체, 물질에 대하여 본질을 파악하여 특성, 특징을 추출해 내는것

 

+ "추상적이다"의 의미 : 충분히 구체적이지 않다. 특징만을 알고 있는것.

 

CS적 추상화란

추출한것을 한가지 사물로 객체화(모델링) 하는것

 

즉, 이러한 CS 관점에서 추상화를 인지하여 각 분야에 접목해보면다면

DB에서의 추상화란,

관리해야하는 한 정보에 대해서 필수적인 필드들을 추출하여 한 Table, 혹은 DB를 생성하는것일테고

프로그래밍 개발에 있어서는 클래스를 생성하는것이다.

 

JAVA에서 추상화란

클래스들의 공통된 특성(속성, 기능)을 추출하여 상위계층에 또 하나의 클래스를 정의하는것.

 

쉽게 말해 여러 클래스가 난자해 있었는데, 

이 클래스들을 효율적으로 관리하고 싶어서 각 공통된 특성들을 뽑아서 상위 클래스 하나를 만들어 하나의 참조 변수로 하위 클래스들을 관리하는것

 

abstract 키워드

메소드나 클래스에 해당 키워드를 붙이면 추상메소드, 추상클래스가 된다.

 

+abstract키워드를 붙이면 명시적으로 선언이지만, 추상메서드가 포함되어 있는 클래스는 명시적 선언을 하지 않아도 자동으로 추상클래스가 됨.

 

추상클래스

추상메소드가 포함 된 클래스 ("미완성 설계도" 라고 표현할 수 있다)

 

+ 추상 클래스와 일반 클래스의 차이점 :

추상 메소드가 하나라도 포함 되어 있으면 추상클래스가 된다.

그리고 추상클래스는 그 자체로는 객체를 생성하지 못한다.

이 추상 클래스를 상속하는 하위클래스가 존재하여야지 부모클래스 객체로써 생성이 가능하다.

즉,

 

1. 추상메소드 유무

2. 자기 자신 자체를 객체로 만들 수 있다없다 

 

추상클래스 사용 이유

  • 개발의 유연성 향상
    만약 1개의 상위 클래스가 존재하고 그 상위 클래스를 상속받는 100가지의 하위 클래스가 있다고 생각해보자.
    그런데 하위클래스들에게 public void optionalFunc(int value) 라는 메소드를 공통적으로 추가해줘야한다면, 우선 상위클래스에서도 해당 내용을 구현하여주어야 하고, 하위클래스에도 100개의 클래스마다 구현을 해줘야하며, 반환타입 매개변수 뭐하나 틀리지않고 다 추가해줘야한다.
    그러나 상위클래스에 추상메서드를 선언을하여 추상클래스로써 사용한다면, 그냥 상위클래스에  public void optionalFunc(int value) 만 추가해주면,
    알아서 추가된 메소드를 추가하라는 에러로 알려주고 각 하위 클래스들은 구현만 해주면 된다.

  • 추상화를 구현하는데 핵심
    상위클래스를 추상클래스로 선언하고
    메소드들은 추상메소드로 선언 하였다면,
    해당 상위클래스를 확장한 하위클래스들은 상속받은 추상메소드를 자유롭게 오버라이딩 하여 사용 할 수 있다.

 

final 키워드

클래스, 변수, 메서드에 붙일 수 있는 키워드로써
class에 붙이면, 변경불가한 클래스. 즉, 상속불가한 클래스가 된다.
변수에 붙이면, 변경불가한 값. 즉 상수가 된다.
메소드에 붙이면, 변경불가한 메소드. 즉, 오버라이딩 불가한 메소드가 된다.

 


인터페이스

밑그림.
미완성 설계도인 추상클래스보다 더 추상적임.

 

인터페이스와 추상클래스의 차이

클래스 중 추상메소드를 하나만 가지고 있어도 해당 클래스는 추상클래스로 여겨진다. 즉, 추상메소드를 가지고 있다는점 이외에는 일반 클래스와 다른점이 없다.
그러나 인터페이스는 모든 메소드가 추상메소드로써 구성되고, 멤버변수도 모두 상수여야만 한다. 
추상클래스보다 인터페이스가 추상 정도가 높다는 말이다.

추상클래스 -> 미완성 설계도
인터페이스 ->미완성 밑그림

 

+자바 8이후 default, static 메소드를 인터페이스에 추가할 수 있음

 

인터페이스의 기본 구조 (생략가능, 컴파일러 자동 추가)

선언된 멤버변수는 모두 public static final.
선언된 멤버메소드는 모두 public abstract.

 

인터페이스란 자체가 그 인터페이스를 객체화 하여 쓰는 용도가 아니라, 추상화로 인해 공통적인 부분들만 뽑아 놓았고, 해당 인터페이스를 구현하는 클래스는 이런식으로 구현을 하여라 라는 의도이므로 자연스럽게 멤버메소드는 public abstrac이고, 멤버변수는 어차피 구현한 클래스에서 필요한 변수들을 사용할것이기 때문에 정말 필수적이고 불변의 변수만을 정의 하였을것이므로 public static final이다 라고 생각하자.

 

인터페이스 구현 

EX :

class 클래스명 implements 인터페이스명 {}

구현하는 클래스는 인터페이스내의 메소드를 강제적으로 모두 구현하여야 한다.

 

인터페이스의 다중 구현

클래스는 단일상속밖에 안되는 반면에 인터페이스는 다중 상속(구현)이 가능하다

 

EX :

class ExampleClass implements Interface1, Interface2, Interface3 { 
... 생략 ...
}

 

그리고 클래스의 최고조상이 Object인것과 같은 개념이 Interface에는 존재하지 않는다.

 

+ 다중 상속 가능 이유
클래스의 다중 상속을 막아놓은 이유는
다중 상속을 했을 경우 여러 부모클래스의 멤버명이 충돌하는 경우는 미연에 방지하기 위해서이다.
그러나, 인터페이스는 애초에 미완성이기에 가능하게 허용.