Skip to content

Commit

Permalink
[4회차] 아이템 27, 28 - 프람(김민종) (#45)
Browse files Browse the repository at this point in the history
* Auto Updated README.md with latest contributions

* Create Comparable을_구현할지_고려하라_프람.md

* Auto Updated README.md with latest contributions

* Update Comparable을_구현할지_고려하라_프람.md

* Create 변경_가능성을_최소화하라_프람.md

* Auto Updated README.md with latest contributions

* Create 상속을_고려해_설계하고_문서화하라._그러지_않았다면_상속을_금지하라_프람.md

* Create 태그_달린_클래스보다는_클래스_계층구조를_활요하라_프람.md

* Update 태그_달린_클래스보다는_클래스_계층구조를_활요하라_프람.md

* Create 비검사_경고를_제거하라_프람.md

* Create 배열보다는_리스트를_사용하라_프람.md

* Update 배열보다는_리스트를_사용하라_프람.md

* Update 배열보다는_리스트를_사용하라_프람.md

* Update 배열보다는_리스트를_사용하라_프람.md

* Update 배열보다는_리스트를_사용하라_프람.md

---------

Co-authored-by: Dobby-Kim <[email protected]>
  • Loading branch information
koust6u and Dobby-Kim committed May 16, 2024
1 parent d77eef9 commit e3308b8
Show file tree
Hide file tree
Showing 3 changed files with 487 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# (아이템 23) 태그 달린 클래스보다는 클래스 계층구조를 활용하라
>작성자: 프람
>
> 작성일시: 2024\_05\_03
## 인사
안녕하세요~. 프람입니다⛴️ 이번 주 이것 저것 한다고 많이들 바쁘셨죠? 그래도 어김없이 돌아오는 불금입니다.

일주일의 마무리를 이펙티브 자바를 함께 공부해보며 마무리해봅시다.💪💪💪
그럼 본격적으로 `태그 달린 클래스보다는 클래스 계층구조를 활용하라` 에 대해 알아봅시다.

---

## 태그란 무엇일까요??

글을 읽다가 태그란 무엇을 일까?? 라고 생각을 해봤는데요.

아마 아래 어학사전에서 설명하는 사전적 의미가 아닐까 생각이 듭니다. <br/>
혹시, 정확한 뜻을 아신다면, 말씀해주세요~ <br/>
`네이버 어학사전피셜`: **(어떤 표시를 하기 위해 붙인) 꼬리표**

그렇다면, 같이 예제를 보고 태그 달린 클래스를 확인해봅시다.

``` java
class Figure {
enum Shape { RECTANGLE, CIRCLE }

// 태그 필드
final Shape shape;

// 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 쓰인다.
double length;
double width;

// 다음 필드는 모양 원(CIRCLE)일 때만 쓰인다.
double radius;

// 원용 생성자
Figure (double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}

// 사각형용 생성자
Figure (double length, double width) {
shape = Shape.RECTANGLE;
this.length = length;
this.width = width;
}

double area() {
switch (shape) {
case RECTANGLE:
return length * width;
case CIRCLE:
return Math.PI * (radius * radius);
default:
}
}
}
```

우리 친구들~~ 이 코드만 봐도 토가 쏠리지 않나요? 🤮
어떤 문제점들이 있는지 하나씩 짚어보아요🤗

## 태그의 문제점

특히, 위 코드는 객체지향의 꽃인 `OCP`를 위반하고 있어 매우 매우 불편한데요.

FIGURE에 Shape이 추가될 때마다 불필요한 인스턴스 변수 추가, 생성자 추가 그리고 area메서드의 switch문에 넓이 구현 로직이 추가 되어야한다는 것이죠.

이렇게 된다면 Shape이 추가되면 될수록 코드가 장황해지겠죠? <br/>
그렇게 된다면, 오류를 찾기도 힘들거에요.

그래서 우리는 자바에서 지원하는 서브 타이핑(확장, 구현)을 대안으로 사용해봅시다.


## 대안

대안으로 계층 구조를 활용하라고 본 아이템에서 설명 하고 있습니다. <br/>
한번 같이 코드로 살펴봅시다.

```java
abstract class Figure {
abstract double area();
}

class Circle extends Figure {
final double radius;

Circle(double radius) { this.radius = radius; }

@Override
double area() { return Math.PI * (radius * radius) }
}

class Rectangle extends Figure {
final double length;
final double width;

Rectangle(double length, double width) {
this.lenght = length;
this.width = width;
}

@Override
double area() { return length * width }
}
```
위 코드와 같이 상속을 사용해서 계층 구조를 만들어 확장하는 방식을 책에서는 소개하고 있다. <br/>

이렇게 된다면, 태그를 사용한 클래스의 문제점인 확장이 닫힌 문제점을 해결하고 각 클래스에서 쓸데 없는 코드도 없어진 모습을 볼 수 있다.


---

### 결론

클래스의 적절한 분리(확장, 구현)를 통해 유지보수성을 증가 시켜주자.

102 changes: 102 additions & 0 deletions 05장/아이템_27/비검사_경고를_제거하라_프람.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# 비검사 경고를 제거하라

> 작성자: 프람
>
> 작성 일시: 2024.05.06
>
> 내용: Effective java 5장 아이템27


## 인사
이번 주제는 "비검사 경고를 제거하라"입니다.
비검사 경고가 뭔데?
이번 아이템도 여김없이 제목이 담고 있는 의미가 무엇인지를 먼저 파악해볼까 합니다.

---

## 비검사 경고가 뭔데?

우선(Unchecked Exception과 상관관계가 없습니다!!)
비검사 경고[[1]](https://www.baeldung.com/java-warning-unchecked-cast)가 등장하는 코드를 만들어 보겠습니다.👍
<img width="858" alt="image" src="https://github.com/koust6u/2024-effective-java/assets/111568619/f12881cf-ae31-4fcf-ad4b-61cdecb8ad66">


마구 마구 노란줄이 뜨는게 보이시나요??

실행을 해보면 경고에 대한 디테일 들이 출력되는데요.

경고가 있다고해서 프로그램이 작동하지 않는 것은 아닙니다.

그렇다면 실행 결과를 봐 볼까요?

<img width="861" alt="image" src="https://github.com/koust6u/2024-effective-java/assets/111568619/eea693be-11c7-403b-8f26-29d24c929cdb">


콘솔 로그와 같이 warning: [unchecked] unchecked conversion 이라는 경고 문구가 있네요??

Unchecked 경고는 이와 같이 제네릭 매개변수를 명시적으로 표현하지 않아주었을때 볼 수 있는 경고입니다.

컴파일러 내부에서 타입 캐스팅을 해줄때 런타임 에러를 뿜을 수 있다는 아주 강력한 경고를 하고 있는 겁니다!!

---

## 경고를 무시한 댓가
그렇다면, 이러한 오류를 간과하면 어떤 대가를 치루는지도 함께 봅시다.

기념일에 오늘을 추가해주었습니다.(다만 LocalDate 타입이 아닌, Date 타입으로 말이죠)

각 기념일을 하루씩 빼고 출력하도록 간단하게 로직을 추가해보았습니다.

<img width="859" alt="image" src="https://github.com/koust6u/2024-effective-java/assets/111568619/8618318a-9ae1-484b-b7ce-000a84241f75">

결과는 예상한대로 ClassCastExecption예외가 발생합니다.
<img width="856" alt="image" src="https://github.com/koust6u/2024-effective-java/assets/111568619/f7d991c1-2a69-4be6-9651-80a3c7edfa25">


간단한, 코드라 바로 오류를 찾을 수 있겠지만, 프로젝트 크기가 커진다면 찾는것도 엄청나게 힘들겠죠??

그러니까 명시적으로 제네릭 매개변수를 알려줍시다. 그러면 아래와 같이 컴파일 시점에서 오류를 잡아줍니다👍
<img width="859" alt="image" src="https://github.com/koust6u/2024-effective-java/assets/111568619/34cf9c05-a702-491b-8fa6-c267678cd072">

---

## 의도적으로 경고를 끄려면?
그럼에도 불구하고 unchecked 경고를 표시해야하는 경우가 있을 수 있습니다.

이런 경우에는 확실히 제어할 수 있는 경우이므로 경고를 꺼주라고 합니다.

어떻게하면 끌 수 있는지 확인해봅시다.😊
<img width="854" alt="image" src="https://github.com/koust6u/2024-effective-java/assets/111568619/e2e54623-be7d-458b-ae72-723448370195">






@SupressWarnings 라는 애노테이션을 자바에서 지원해주는데요.

경고가 발생하는 스코프내에 "unchecked"를 매개변수로 넣어주면 아래와 같이

경고 없이 실행할 수 있습니다!!

<img width="811" alt="image" src="https://github.com/koust6u/2024-effective-java/assets/111568619/db95c698-57df-4faf-8191-9141fcf393e7">




@SupressWarnings는 unchecked 경고만을 잡아주는 것이 아니고 어려가지 경고를 잡아주는 데

자세한 내용은 SuppressWarning(IBM)[[2]](https://www.ibm.com/docs/ko/radfws/9.6.1?topic=code-excluding-warnings)을 참고해주세요😊

단, 당연한 이야기지만 책에서 또 강조하는 것은 최대한 쫍은 스코프에 적용해주라네요 😅

---

## 결론
컴파일이 뿌려주는 모든 오류는 추후에 댓가를 치루기 싫으면 모두 잡아줘라!!!


## 참고 자료
[[1] "Unchecked Cast"](https://www.baeldung.com/java-warning-unchecked-cast)
[[2] "Code Excluding Warnings(IBM)"](https://www.ibm.com/docs/ko/radfws/9.6.1?topic=code-excluding-warnings)
Loading

0 comments on commit e3308b8

Please sign in to comment.