[Java] 객체지향 프로그래밍 - 추상화

·2022년 9월 8일
0

Java

목록 보기
6/14
post-thumbnail

추상화

추상화의 개념

  • 추상 : 공통성과 본질을 모아 추출하는 것
  • 추상화 : 기존 클래스들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 내는 것

abstract 제어자

  • abstract : 추상적인, 미완성의
  • 주로 클래스와 메서드 앞에 붙여 사용한다.

추상 메서드

  • 메서드 바디가 없는 메서드
abstract 리턴타입 메서드이름(매개변수);   // 메서드 바디{} 가 없음
  • 하위 클래스마다 다르게 구현될 것으로 예상되는 경우 사용

    💡 메서드 바디가 없는 이유 : 하위 클래스마다 다르게 구현해야 하기 때문에

  • 추상 메서드는 호출이 가능하다.(호출할 때는 선언부만 필요)

    💡 인스턴스 메서드는 인스턴스 생성 후 호출이 가능하기 때문에 추상 메서드를 호출해도 문제가 발생하지 않는다. 왜? 인스턴스 생성은 추상 클래스를 상속 받은 하위 클래스로부터 생성될 것이기 때문에

추상 클래스

  • 미완성 설계도, 미완성 메서드(추상 메서드)를 가지고 있는 클래스
  • 다른 클래스 작성에 도움을 주기 위해 존재함.
abstract class Player {
	abstract void play();
}

Player p = new Player();   // 에러 발생. 인스턴스 생성 불가능 
  • 미완성 설계도이기 때문에 인스턴스 생성이 불가능하다.
  • 상속을 통해 추상 메서드를 완성(오버라이딩)해야 인스턴스 생성 가능
abstract class Player {
	abstract void play();
}

class AudioPlayer extends Player {
	void play() {...}
} 

AudioPlayer a = new AudioPlayer; // 인스턴스 생성 가능

💡 추상 클래스를 상속 받은 하위 클래스는 추상 클래스가 가지고 있는 메서드 모두를 사용해도 되고 일부만 사용해도 된다.
단, 하나라도 추상 메서드 그대로 포함한다면 그 클래스는 추상 클래스이다.

abstract class Player {
	abstract void play(int pos);
    abstract void stop();
}

class AudioPlayer extends Player {
	void play(int pos) {return pos;}
} 

// 에러 발생! AudioPlayer는 Player를 상속 받은 클래스라 Player의 멤버를 가지고 있음.
stop()메서드를 구현하지 않았기 때문에 stop()메서드는 여전히 추상메서드임!

인터페이스(interface)

인터페이스

  • 인터페이스 : 두 대상간의 소통을 돋는 중간 역할.
  • 추상 메서드의 집합
  • 구현된 것이 전혀 없는 설계도, 추상 클래스보다 더 넓은 개념의 추상화
  • 모든 멤버가 public

    💡 추상 클래스와 인터페이스의 차이
    추상 클래스 : 일반 클래스가 추상 메서드를 가지고 있는 것 (일부만 구현 X)
    인터페이스 : 추상메서드만 있는 것(빈 깡통)

interface 인터페이스이름 {
	public static final 타입 상수이름 =;
    public abstract 메서드이름(매개변수);
}
  • 상수 ( public static final), 추상 메서드(public asbtract)만 올 수 있고 제어자는 생략 가능하다.
  • 인터페이스의 조상은 인터페이스만 가능!! ( 최상위 클래스 Object 절대 아님!)
  • 다중 구현 가능.(추상 메서드라 충돌 위험이 없음)

인터페이스의 구현

  • 인터페이스도 미완성 설계도이기 때문에 상속을 통해 구현해야 함.
class 클래스이름 implements 인터페이스이름 {
	// 인터페이스에 정의된 추상 메서드를 모두 구현해야 한다.
}
  • 일부 추상 메서드만 구현한다면 클래스 앞에 abstract를 정의해 추상 클래스 임을 알려줘야 한다.

인터페이스를 이용한 다형성

  • 인터페이스도 인터페이스로 구현한 클래스의 부모라고 할 수 있다.
  • 다형성의 특징들이 다 적용된다.
  • 인터페이스 타입 매개변수는 인터페이스를 구현한 클래스의 인스턴스만 가능
  • 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
    -> 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 의미

인터페이스의 장점

  1. 개발 시간 단축
  2. 표준화 가능
  3. 서로 관계없는 클래스들을 묶을 수 있다.
  4. 독립적인 프로그래밍 가능
profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글