본문 바로가기
부트캠프/백

11.8 다형성 추상화

by 티코딩 2022. 11. 9.

객체지향 프로그래밍의 4개의 기둥

상속 캡슐화 다형성 추상화 (상캡다추) 중에 다형성과 추상화를 마저 배웠다.

 

ㅇ 다형성(polymorphism) ***

하나의 객체가 여러가지 형태를 가질 수 있는 성질을 의미.

Java에서 다형성은 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것을 의미함. 상위 클래스 타입의 참조변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용한 것.

class Friend{ . . .}

class Girlfriend extends Friend{ . . .}

Friend girlfriend = new Girlfriend(); - - - - - > 가능

Girlfriend friend2 = new Friend() - - - - -> 불가능. Friend의 멤버개수보다 friend2가 사용할 수있는 멤버가 더많음.

메서드 오버라이딩, 오버로딩도 다양하게 형태를 가지는 면에서 다형성이라 볼 수 있음.

 

ㅇ 참조변수의 타입변환

기본자료형의 형변환처럼 참조변수도 타입변환이 가능하다.

조건은, 서로 상속관계에 있어야 하며, 하위 -> 상위(업캐스팅)은 괄호생략 가능, 상위 -> 하위(다운캐스팅)은 괄호필수.

class Vehicle{ . . . }

class Car extends Vehicle{ . . . }

class Motorbike extends Vehicle{ . . . }

Car car = new Car();

Vehicle vehicle = (Vehicle) car;  - - - > 업캐스팅

Car car2 = (Car) vehicle; - - ->다운캐스팅

Motorbike motorbike = (Motorbike) car; // error. 상속관계가 아님.

 

ㅇ instanceof 연산자

참조_변수 instanceof 타입ㅈ

참조변수가 해당타입으로 타입변환이 가능한지여부를 알려줌.

car instanceof Vehicle //true

car instanceof Motorbike. //false

 

ㅇ 추상화 ***

공통성과 본질을 모아 추출하는 것

기존 클래스들의 공통적인 요소들을 뽑아 상위클래스를 만들어 내는 것.

Java에서는 추상클래스와 추상 메서드, 인터페이스가 있음.

 

ㅇ abstract 제어자

클래스와 메서드앞에 붙히면  추상클래스, 추상메서드가 된다. 

추상 메서드가 있으면 그 클래스는 추상 클래스가 자동으로 된다.

추상메서드는 메서드 바디가 없다. 상속받아서 완성 시켜야 한다.

abstract void start();

 

ㅇ 추상클래스

미완성 구조기에 객체 생성 불가능. 왜 사용할까? 상속관계에 있어 새로운 클래스 작성하기에 매우 유리함.

오버라이딩 통해 메서드 완성시키고 완성된 클래스 기반으로 객체 생성 가능함.

상속계층도의 상층부에 있을 수록 추상화의 정도가 높고 더 공통적인 속성과 기능들이 정의되어있음.

 

ㅇ final

필드, 지역변수, 클래스 앞에 위치가능함.

클래스 앞 : 변경,확장,상속 불가

메서드 앞 : 오버라이딩 불가

변수 앞 : 상수

 

ㅇ 인터페이스

추상클래스와 유사하지만 더욱 높은 추상성을 가진다. 추상 클래스는 추상메서드 하나 이상만 가지고 있으면 되지만,

인터페이스는 추상메서드와 상수, default, static메서드만 포함 가능하다.

사용방법으로는 class 대신 Interface, extends 대신 implements 사용한다.

인터페이스는 다중 상속이 가능하다!(Java에서는 보통 다중상속이 불가능하다!)

 

 

오후 라이브세션을 진행하며 중요하다고하신 말들이다. 찾아보았다.

구현에 의존하고있다?**

의존관계 역전 원칙 이라고 한다. 객체지향 설계의 다섯가지 기본원칙(SOLID) 중 D(Dependency)라고 한다. 추상화에 의존해야지, 구체화에 의존하면 안된다는 것이다. 그 이유 첫번째, 고수준 모듈이 저수준 모듈에 의존하지 말아야 한다. 둘 다 추상화에 의존해야 한다. 둘째,추상화는 세부사항(즉, 구현)에 의존해서는 안된다. 구현이 변경되더라도 추상화가 변경되면 안된다는 뜻. 의존이란, 클래스A의 메서드를 클래스B가 사용한다면, A는 B의 존재를 모르지만 B는A에 의존하는 것이다. A가 메서드를 바꾸면 B는 에러가 난다.

https://blog.hexabrain.net/395

 

SOLID. 의존관계 역전 원칙(Dependency inversion principle)

의존관계 역전 원칙 의존관계 역전 원칙은 객체 지향 설계의 다섯 가지 기본 원칙(SOLID) 중 하나(D)입니다. 이를 인터페이스 편의 설계적인 관점에 넣으려고 했으나 상당히 중요한 부분이기 때문

blog.hexabrain.net

의존성 주입**

DI(Dependency Injection) 스프링에서 가장 중요한 개념이라고 하셨다.

의존은 위에서 설명했듯이 의존대상A가 변하면 의존하는 B에 영향을 미친다라는 것이다.

의존관계를 인터페이스로 추상화 하면, 더 다양한 의존 관계를 맺을 수 있고, 실제 구현 클래스와의 관계가 느슨해지고, 결합도가 낮아진다.

DI는  의존관계를 외부에서 결정하고 주입하는것이다. 세가지 조건을 충족하는 작업을 의존관계 주입이라고 한다.

1. 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스만 의존하고 있어야한다.

2. 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제 3의존재가 결정한다.

3. 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공해줌으로써 만들어진다.

- 토비의 스프링(2012)

DI장점

의존성이 줄어들고, 재사용성이 높은 코드가 된다, 테스트하기 좋은 코드가 된다, 가독성이 높아진다.

밑에 출처에서 보고 다시 공부해봐야 겠다.

https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/

 

'부트캠프 > ' 카테고리의 다른 글

11.11 컬렉션 연습문제  (0) 2022.11.14
11.10 enum, 제네릭, 예외, 컬렉션 프레임워크  (0) 2022.11.14
11.7 상속, 캡슐화  (0) 2022.11.07
11.4 생성자,this, this()  (0) 2022.11.07
11.2 배열  (0) 2022.11.04