2022/02/19 객체지향 프로그래밍

김석진·2022년 2월 19일
0

객체 지향 핵심

목록 보기
2/4

다형성과 다형성을 사용하는 이유

다형성(polymorphism)이란?

  • 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
  • 같은 코드에서 여런 다른 실행 결과가 나옴
  • 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나임
  • 다형성을 잘 활용하면 유연하고 확정성있고, 유지보수가 편리한 프로그램을 만들수 있음

다형성을 사용하는 이유

  • 상속과 메서드 재정의를 활용하여 확정성 있는 프로그램을 만들수 있음
  • 그렇지 않는 경우 많은 if-else if문이 구현되고 코드의 유지보수가 어려워짐
  • 상위클래스에서는 공통적인 부분을 제공하고, 하위클래스에는 각 클래스에 맞는 기능 구현
  • 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있다.

상속은 언제 사용할까?

IS-A 관계(is a relationship: inheritance)

  • 일반적인(general)개념과 구체적인(specific)개념과의 관계
  • 상위 클래스: 하위 클래스보다 일반적인 개념
  • 하위 클래스: 상위 클래스보다 구체적인 개념들이 더해짐
  • 상속은 클래스간의 결합도가 높은 설계
  • 상위 클래스의 수정이 많은 하위 클래스에 영향을 미칠 수 있음
  • 계층구조가 복잡하거 hierarchy가 높으면 좋지 않음

HAS-A관계(composition)

  • 클래스가 다른 클래스를 포함하는 관계
  • 코드 재사용의 가장 일반적인 방법
  • Library를 구현할 때 ArrayList를 생성하여서용
  • 상속하지 않음

다운캐스팅과 instanceOf

다운캐스팅(downcasting)

  • 업캐스팅된 클래스를 다시 원래 타입으로 형 변환
  • 하위 클래스로의 형 변환은 명시적으로 해야함

    Customer vc= new VIPCustomer(); //묵시적
    VIPCustomer vCustmoer=(VIPCustomer)vc; //명시적

instanceOf를 이용하여 인스턴스의 형 체크

  • 원래 인스턴스의 형이 맞는지 여부를 체크하는 키워드가 맞으면 true 아니면 false를 반환함

추상클래스의 의미와 구현하는 방법

추상클래스란?

  • 구현 코드 없이 메서드의 선언만 있는 추상 메서드(abstract method)를 포함한 클래스
  • 메서드 선언(declartion):반환 타입,메서드이름,매개변수로 구성
  • 메서드 정의(definition):메서드 구현(implementation)과 동일한 의미 구현부(body)를 가짐
  • abstract 예약어를 사용
  • 추상 클래스는 new(인스턴스화)할 수 없음
  • ex) int add(int x,int y); //선언
    int add(int x, int y){} //구현부가 있음, 추상 메서드가 아님

추상 클래스를 활용한 템플릿 메서드 패턴

템플릿 메서드

  • 추상 메서드나 구현 된 메서드를 활용하여 코드의 흐름(시나리오)를 정의하는 메서드
  • final로 선언하여 하위 클래스에서 재정의 할 수 없게함
  • 프레임워크에서 많이 사용되는 설계 패턴
  • 추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름을 정의하고 하위 클래스에서 다르게 구현되어야 하는 부분은 추상 메서드로 선언하여 하위 클래스에서 구현하도록 함

템플릿 메서드 예제

이태볼릭 체는 추상메서드

final 예약어

  • final 변수: 값이 변경될 수 없는 상수
  • final 메서드 : 하위 클래스에서 재정의 할 수 없는 메서드
  • final 클래스 : 상속할 수 없는 클래스

구현 코드가 없는 인터페이스

인터페이스(interface)

  • 모든 메서드가 추상 메서드로 선언됨 public abstract
  • 모든 변수는 상수로 선언됨 public static final
  • 인터페이스로 만들어진 코드를 클래스로 구현한다라고 생각하면됨

인터페이스 구현과 형 변환

  • 인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환 할 수 있음 ex) Calc calc=new CompleteCalc();
  • 상속에서의 형 변환과 동일한 의미
  • 클래스 상속과 달리 구현코드가 없으므로 여러 인터페이스를 구현할 수 있음
  • 형 변환되는 경우 인터페이스에 선언된 메서드만을 사용가능함

인터페이스를 왜 쓰는가?

인터페이스가 하는일

  • 클래스나 프로그램이 제공하는 기능을 명시적으로 선언
  • 일종의 클라이언트 코드와의 약속이며 클래스나 프로그램이 제공하는 명세
  • 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있음
  • 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미임
  • 인터페이스를 구현한 다양한 객체를 사용함 -다형성

프로그램에서 인터페이스의 역할과 다형성(dao 구현하기)

인터페이스와 다형성

  • 하나의 인터페이스를 여러 객체가 구현하게 되면 클라이언트 프로그램은 인터페이스의 메서드를 활용하여 여러 객체의 구현을 사용할 수 있음 (다형성)

인터페이스를 활용한 DAO 구현하기

  • DB에 회원정보를 넣는 dao(data access object)를 여러 DB 제품이 지원될 수 있게 구현함
  • 환경파일(db.properties)에서 database의 종류에 대한 정보를 읽고 그정보에 맞게 dao 인스턴스를 생성하여 실행될 수 있게함

여러 인터페이스 구현하기, 인터페이스의 상속

여러 인터페이스 구현

  • 자바의 인터페이스는 구현 코드가 없으므로 하나의 클래스가 여러 인터페이스는 구현 할 수 있음
  • 디폴트 메서드가 중복 되는 경우는 구현하는 클래스에서 재정의 하여야 함
  • 여러 인터페이스를 구현한 클래스는 인터페이스 타입으로 형 변환 되는 경우 해당 인터페이스에 선언된 메서드만 사용 가능 함

인터페이스의 상속

  • 인터페이스 사이에도 상속을 사용할 수 있음
  • extends 키워드를 사용
  • 인터페이스를 다중 상속이 가능하고 구현 코드의 상속이 아니므로 타입 상속 이라고 함

클래스 상속과 인터페이스 구현 함께 쓰기

  • 실무에서 프레임워크나 오픈소스와 함께 연동되는 구현을 하게 되면 클래스 상속과 인터페이스의 구현을 같이 사용하는 경우가 많음
  • 책이 순서대로 대여가되는 도서관구현
  • 책을 보관하는 자료 구조가 Selef에 구현됨
  • Queue 인터페이스를 구현함
  • Shelf 클래스를 상속 받고 Queue를 구현한다.
profile
주니어 개발자 되고싶어요

0개의 댓글