객체 지향의 장점은 코드의 재사용이다.
상속의 구현 (IS-A) 또는 객체의 구성 (HAS-A)를 통해 코드 재사용을 수행할 수 있는 두가지 방법이 있다.
IS-A 관계 : 일반화 관계(Generalizaion) => 상속 관계
~은 ~다.
상속은 is-a 관계에서 사용하는 것이 효율적이다.
상속을 코드 재사용의 개념으로 이해하면 안된다. 상속을 사용하면 클래스간 결합도가 높아져 상위 클래스를 수정해야할 때 하위 클래스에 미치는 영향이 크다.
즉, 의미상 상하 관계가 분명한 객체를 연결하기 위한 수단으로 사용해야한다.
클래스 선언에서 extends 또는 implements 키워드가 있으면 이 클래스는 IS-A 관계가 있다고 한다.
예) 집은 건물이다. 그러나 건물은 집이 아니다.
HAS-A관계 : 연관관계(Association) => 포함 관계
~은 ~을 가지고 있다.
컴포지션(HAS-A)는 단순히 다른 객체에 대한 참조인 인스턴스 변수의 사용을 의미한다.
HAS-A 관계는 코드 재사용의 생산적인 방법의 구성 관계이다.
예) 자동차에는 엔진이 있다. 집에는 욕실이 있다.
예시
Car 클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package relationships; class Car { // Methods implementation and class/Instance members private String color; private int maxSpeed; public void carInfo(){ System.out.println("Car Color= "+color + " Max Speed= " + maxSpeed); } public void setColor(String color) { this.color = color; } public void setMaxSpeed(int maxSpeed) { this.maxSpeed = maxSpeed; } } | cs |
Car 클래스에는 몇 가지의 인스턴스 변수와 메서드가 있다.
Maruti는 Car 클래스를 확장하는 특정 유형의 자동차로 Maruti IS-A Car를 의미한다.
Maruti 클래스
1 2 3 4 5 6 7 8 | class Maruti extends Car{ //Maruti extends Car and thus inherits all methods from Car (except final and static) //Maruti can also define all its specific functionality public void MarutiStartDemo(){ Engine MarutiEngine = new Engine(); MarutiEngine.start(); } } | cs |
Engine 클래스
1 2 3 4 5 6 7 8 9 | package relationships; public class Engine { public void start(){ System.out.println("Engine Started:"); } public void stop(){ System.out.println("Engine Stopped:"); } } | cs |
Maruti 클래스는 구성을 통해 Engine 객체의 start() 메서드를 사용한다.
Maruti HAS-A Engine이라고 할 수 있다.
RelationsDemo 클래스
1 2 3 4 5 6 7 8 9 10 | package relationships; public class RelationsDemo { public static void main(String[] args) { Maruti myMaruti = new Maruti(); myMaruti.setColor("RED"); myMaruti.setMaxSpeed(180); myMaruti.carInfo(); myMaruti.MarutiStartDemo(); } } | cs |
RelationsDemo 클래스는 Maruti 클래스의 객체를 만들고 초기화한다.
Maruti클래스에는 setColor(), setMaxSpeed() 및 carInfo() 메서드가 없지만,
Maruti 클래스와 Car 클래스의 IS-A 관계로 사용가능하다.
'✨ Java > etc' 카테고리의 다른 글
자바(JAVA) - 2Tier , 3Tier (0) | 2023.07.10 |
---|---|
자바(JAVA) - 자료의 형 변환(자료형) 업캐스팅, 다운캐스팅 (0) | 2023.07.09 |
자바(JAVA) - 달력 만들기 (0) | 2023.07.07 |
자바(JAVA) - 가변인자 (variable arguments) 란 무엇인가? (0) | 2023.07.07 |
자바(JAVA) - static(클래스)변수와 instance변수, local(지역)변수 (0) | 2023.07.06 |
댓글