전략 패턴은 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 행위를 직접 수정하지 않고 전략을 바꿔주는 유연한 확장 방법을 말합니다.
다음 예시와 같이 현재 표현하는 의미를 태그로 알려주는 클래스를 가끔 볼 수 있다. shape 멤버 변수로 나타내는 것이다.이러한 코드는 일단 문제가 많다. 열거 타입을 선언해야 하고, area 메소드의 switch 문 등의 비효율적인 코드가 들어가게 된다.
인터페이스는 클래스에 자신이 어떤 기능을 할 수 있는지를 알려주는 역할이다. 인터페이스는 오직! 이 용도로만 사용되어야 한다.이 용도 외에 잘못 설계된 예시가 있는데, 바로 상수 인터페이스이다. 상수 인터페이스는 static final 필드로만 이루어진 인터페이스다.
자바 8 전에는 인터페이스에 메소드를 추가할 방법이 없었다. 그런데 디폴트 메소드라는 방법이 생겼는데 이것을 사용하면 되지 않을까라는 물음이 생길 수 있다.
추상 클래스와 인터페이스는 모두 인스턴스 메소드를 구현 형태로 제공할 수 있다.하지만 추상 클래스를 구현하는 클래스는 반드시 하위 클래스가 되어야 한다는 것이다. 자바에서는 단일 상속만 지원하기 때문에 엄청난 부담이 될 것이다.인터페이스의 장점을 알아보자.
평소에 개발할 때 상속을 하여 개발할 일이 많을 것이다. 근데 이러한 상속하는 과정에서 다양한 것을 고려하지 않으면 에러가 발생할 수 있다. 한번 알아보자. 먼저, 문서화를 해야 한다!
HTTP에서 HTTPS로 바꾸기 위해 내가 했던 시도들과 삽질들을 소개하려고 한다.먼저 내가 처음으로 적용했던 SSL 인증 방식에 대해 살펴보자.환경 : Amazon Linux 2023, AWS Certificate Manager, Route 53, ALB
우리가 코드를 재사용할때 상속을 썼었다. 그런데 상속이 항상 최선의 방법일까?같은 패키지 안이거나 확장적인 목적이고 문서화가 잘된 클래스는 문제가 없다.이런 케이스가 아닌 이상 구체 클래스를 상속하는 것은 위험하다..(인터페이스 간, 인터페이스 상속 제외)
불변 클래스라 함은 인스턴스의 내부 값을 수정할 수 없는 클래스를 의미한다. 이는 생성부터 객체가 파괴될 때까지 변함없다.다음은 클래스를 불변으로 만들기 위한 다섯 가지 규칙이다.객체의 상태를 변경하는 메소드를 제공하지 않는다.클래스를 확장할 수 없도록 한다:
해당 클래스에 필드는 자유롭게 접근가능하므로 캡슐화가 이루어지지 못한다.불변식을 보장할 수 없고, 외부에서 필드에 접근할 때 추가적인 작업을 할 수도 없다. (ex. Locking)public 클래스라면 이 방식으로 접근자를 제공함으로써 유연성을 얻을 수 있다.
일반적으로 캡슐화가 잘 이루어지면 잘 설계된 컴포넌트라고 한다. 내부 구현과 공개 API를 철저히 분리한다.내부 정보를 숨기는 것에는 장점이 많은데 다음과 같다.시스템 개발 속도를 높인다: 병렬 개발 가능시스템 관리 비용을 낮춘다.
코딩을 하면서 값을 비교하는 경우는 굉장히 많다! 다양한 경우가 많은데 새로운 객체를 만들 때는 Comparable을 구현할지 고려해야 할 것이다.Comparable 인터페이스는 다음과 같이 생겼다.equals의 규약과 compareTo의 규약은 비슷하다.
clone 메소드는 원본 객체의 필드값과 동일하게 새로운 객체를 생성해주는 메소드이다.여기서 native라는 키워드가 있는데 자바에서 다른 언어를 사용할 수 이게 만들어주는 키워드이다.
Object의 기본 toString 메소드를 사용해서 객체를 출력하면 Address@abcdd 같이 클래스명@16진수\_해시코드로 반환된다.여기서 어떤 유익한 정보를 얻을 것 같은가? Address 클래스는 주소지를 알려주는 것이 훨씬 유익할 것이다.
item10과 연결되는 내용인데, equals를 재정의할 때는 hashCode도 재정의해야 한다.그렇지 않으면, HashMap, HashSet에서 문제를 일으킬 것이다.아래는 Object 명세에서 발췌된 규약이다.
equals 메소드는 굉장히 중요하다! 대부분의 경우에는 우리가 원하는 비교를 수행해준다. 정 그래도 재정의를 해야겠다면 조심해야 한다. 재정의를 할 때는 아래의 체크리스트를 확인해보자.각 인스턴스가 본질적으로 고유함: 다른 객체는 절대 같을 수가 없다
자바 라이브러리 중에는 close로 닫아줘야 하는 자원들이 많은데 InputStream, java.sql.Connection 등이 그 예다.item8에서 close의 안전망으로 finalizer를 사용하는 경우도 있다고 했지만 사실상 사용하면 안된다.
자바를 처음 배울 때 들었던 말은 finalizer를 그냥 쓰지 말라는 말이었다. 근데 왜?라는 궁금증은 해결하지 못한 채 그냥 넘어갔는데 책에서 이렇게 소개해주니 너무나도 좋다. 그럼 시작해보겠다!자바에서는 두 가지 객체 소멸자가 존재하는데..