Home 다형성과 추상화
Post
Cancel

다형성과 추상화

기존 게시글에서 “객체”란 “어떤 기능을 제공하는가” 로 정의했다. 그렇다면 객체지향에서 다형성이란 무엇일까?

다형성 이란?

: 한 객체가 여러 타입(객체의 기능)을 갖는 것을 말하며 하나의 객체가 여러 객체의 모습을 갖는 걸 의미한다.(말 그대로 다형)

주로 상속을 통해 구현한다.


추상화 란?

: 데이터나 프로세스 등을 의미가 비슷하거나 의미있는 것들을 따로 정의한 것을 의미한다.

1) 특정한 성질을 뽑아내 추상화한다. 2) 공통성질(일반화)을 뽑아내 추상화한다.

다형성은 공통성질을 뽑아내서 추상화는 방식과 관련이 있다.

서로 다른 구현기능들에서 공통성질을 찾아내 추상화한다.

  • 타입 추상화: 여러가지 구현 클래스들을 추상화하는 것, 주로 interface로 추상화클래스를 만든다.

추상화 클래스(interface)를 상속받아서 구현클래스를 만든다. 추상화 타입은 공통된 특징을 표현한다. -> 추상화 클래스(interface)에 기능을 선언, 정의하고 구현 클래스(콘크리트concrete 클래스)를 만들어서 상속받아서 구현한다.

왜 굳이 이렇게 사용할까?

  • 기능을 유연하게 추가할수있다. -> 변경에 유연하다.
  • 추상화를 하게되면, 추상화되는 코드만 변경하면 그걸 상속하는 구현클래스의 메소드들은 변경하지 않아도 된다.
  • 추상화 하지 않으면 -> 코드의 가독성이 떨어짐 -> 실수 많아짐, 분석속도 늘어남, 메소드가 여기저기 흩뿌려짐
  • 추상화는 실제 기능이 생겨날때, 그때 생성하는게 좋다. 미리 구현하면 오히려 복잡해진다.

추상화를 하게 되면,

  • 다양한 기능들을 하나로 묶고 추상화할 수 있어야 하기때문에 기능에 대한 이해도가 높아야 한다.
  • 나(추상화대상)를 바꾸지 않고 내가 사용하는 대상(구현대상)을 바꿀수있는 유연함이 있음
  • 추상화를 하다보면 비슷한 기능들이 하나로 묶인다.
  • OCP: Open Closed Principle : 수정에는 닫혀있고 확장에는 열려있음
  • 기능을 변경, 확장이 가능하나 그 기능을 사용(구현)하는 코드는 수정하지 않아도 된다.
  • 실제 사용되는 코드를 수정하지 않으면서도 기존의 기능을 변경, 확장이 가능하다.

출처: 최범균, “객체 지향 프로그래밍 입문”, 인프런


강의 후, 조각 지식

상속의 종류

  • extends(상속)
    • 일반 class와 abstract class 대상
    • 부모클래스에서 메소드를 선언하고 구현한다. 자식 클래스는 그 메소드 그대로 사용 가능하다.
  • implements(상속)
    • interface 대상
    • 부모는 메소드를 선언만 하고 자식이 오버라이드(@Override)해서 메소드를 재정의해서 사용하다.
    • 다중상속이 가능하다.

상속 당할 수 있는 유형

  • abstract
    • 일반 클래스처럼 private, 생성자, 객체변수를 가질 수 있다.
  • interface
    • 구현을 해야하기때문에 public만 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
// interface와 implements를 이용한 예시

public inteface MemberRepositoryCustom{
	Member findMemberByName(String name)
}

public class MemberRepositoryCustomImpl implements MemberRepositoryCustom {
	@Override
	public Member findMemberByName(String name) {
		//name으로 member 찾는 쿼리
	}
}

캡슐화와 추상화의 차이는? -> 서로 아예 다른 개념.

  • 캡슐화: 코드와 데이터를 하나의 unit으로 바라보며 하나의 class 에서 정의한다.
  • 추상화: 내부의 세부정보는 숨기고 기능만 표시한다. 객체가 무엇을 하는지에 초점을 맞춘다. 추상화의 방식으로는 abstract class, interface가 있고 이 class들을 extends, implements를 통해 구현한다.
This post is licensed under CC BY 4.0 by the author.

두 개의 객체를 반환하기

Exception