## java 가 확장한 객체 지향
### abstract 키워드
abstract에는 추상 메서드를 포함 할 수 있는데, 이는 오버라이딩을 강제한다.
추상 클래스는 new를 할 수 없다.
추상 클래스를 사용하는 이유는 추상 메서드, 선언만 하고 구현은 하지 않을때의 경우가 필료하기 때문이다 .
생성자를 생성하지 않으면 기본 생성자를 만들어 주지만, 하나라도 만들면 기본 생성자는 제공하지 않는다.
맨 처음에 static 영역에 class 를 할당할 때에 사용하지 않는 class 는 할당하지 않는다.
class 를 할당하는 시점은 맨 처음 사용될때 이다.
class 를 사용하는 예는 클래스의 정적 멤버나 메소드를 사용하거나, 인스턴스를 생성할 때이다.
이런 class의 static 블럭은 딱 한번 맨처음 할당될 때에 실행된다.
( @Before in Junit )
---
### final
final 은 말 그대로 마지막이라는 의미이다
변수에 사용되면 불변,
클래스에 사용되면 더 이상 상속 불가
메서드에 사용되면 오버라이딩이 불가능하다.
---
### instanceof
특정 클래스의 구현체인지 아닌지를 알려준다. 인터페이스 구현 또한 적용된다.
---
### package
namespace를 만들어준다.
중복된 클래스 이름을 서로 다른 패키지에서 구현 하면 다른거
---
### 인터페이스와 추상 클래스 의 차이
인터페이스는 공통된 동작을 약속하기 위해
추상 클래스는 확장을 위해, 슈퍼 클래스의 기능을 사용하기 위함이다.
인터페이스는 여러개를 구현 가능하지만, 클래스의 경우는 다중 상속이 불가능하다.
필드는 특성이다.
---
### super
이 키워드는 this 와 다르게 상위 클래스를 지칭한다.
중첩은 할 수 없다.
----
### SOLID
객체지향 설계 5원칙
SRP ( 단일 책임 )
OCP ( 개방 폐쇄 )
LSP ( 리스코프 치환 ) 상위에서 물려줄 특성이 많을 수록 좋다
ISP ( 인터페이스 ) 인터페리스의 메서드가 적을 수록 좋다
DIP ( 의존 역전 )
---
### SRP
단일 책임 원칙
이는 하나의 객체가 하나의 일만을 하도록 한다.
하지만, 이는 비단 객체 뿐만 아니라 메서드, 필드 에도 적용되어야한다.
이를 잘 처리하지 못하면 분기처리를 해야하는데 이는 대표적으로 나쁜 코드이다.
이는 객체 지향의 4대 원칙인 추상화에 맞닿아있다
---
### OCP
엔티티 ( 클래스, 모듈, 함수 )는 확장에 대해서는 열려있지만, 변경은 할 수 없어야 한다.
이를 조금 더 이용한다면, 같은 개념에 대해서 확장을 하고, 그 상위 클래스를 사용한다면, 변화에 빠르게 대응 할 수 있다.
따라서 역할에 따른 구분만 하게 된다면, 그 구체적인 객테가 무엇이 되더라도 대응이 가능하다.
예를 들어 jdbc 가 있는데 데이터 베이스를 어떤걸 써도 바로 갈아낄 수있다. 중간에 jdbc 가 있기 때문이다. ( 여기서 상위 클래스 오버라이딩을 하면 덮어 씌워진다를 활용한듯...? )
---
### LSP
서브 타입은 언제나 자신의 기반 타입으로 교체 할 수 있어야한다.
이는 상속을 올바르게 지키면 된다.
---
### ISP
클라이언트는 자신이 사용하지 않는 메서드에 의존관계를 맺으면 안된다.
이는 단일 책임 원칙과도 맞닿아 있다.
따라서 단일 책임 원칙을 지키기 위해 여러 클래스로 나눌 수도 있지만, 여러 인터페이스를 두어 상속을 할 수도 있다.
그 후 특정 상황에서는 특정 인터페이스만으로 제한 하는 방법이다.
이때에 특정 상황만을 특정을 하여 인터페이스가 최소한의 메서드를 가지도록 하는것이 제일 좋다.
이는 인터페이스의 참조 변수에 할당하면 이를 구현할 수 있다.
Human에서 workable 인스턴스를 구현한 후
Workable worker = new Human();
worker.work(); // Output: Human is working.
---
### DIP
저차원, 하위 객체에 의존하지 말고 상위, 고차원에 의존해야 한다.
이는 위의 OCP 와도 같다.
변하기 쉬운 하위 개체보다 잘 변하지 않는 상위 객체에 의존하도록 한다.
변하기 쉬운것에는 의존하지 말아라.
'spring' 카테고리의 다른 글
[ 모각코 ] 소프트웨어 아키텍쳐 (1) | 2024.03.22 |
---|---|
[ 모각코 ] spring IOC container (0) | 2024.03.15 |
[모각코] oop for spring (1) | 2024.03.08 |