spring

[모각코] 자바가 확장한 객체 지향

cheesecrust1008 2024. 3. 29. 12:39

## 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