Java(160)
-
[Effective Java] item 18. 상속보다는 컴포지션을 사용하라
상속은 코드를 재사용하는 강력한 수단이지만 잘못 사용하면 오류를 만들어내기 쉬운 소프트웨어가 된다. 슈퍼 클래스와 서브 클래스가 같은 프로그래머에 의해 다루어지며 통제하는 경우는 안전하다. 확장할 목적으로 잘 설계되었고 문서화도 잘 된 클래스 또한 안전하다. 그러나 외부 패키지에서 이를 상속하는 경우 문제가 발생한다. 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 다르게 말하면 슈퍼 클래스가 어떻게 구현되었느냐에 따라 서브 클래스의 동작에 문제가 생길 수 있다. 슈퍼 클래스는 버전마다 내부 구현이 달라질 수 있다. 이때문에 확장을 충분히 고려하여 설계하지 않거나 문서화가 부족한 경우 이를 상속하는 서브 클래스들은 이에 발맞춰서 코드를 수정해야 하는 불상사가 생긴다. 구체적인 예제를 살펴보자. HashSe..
2021.11.26 -
[Spring Boot] Spring OAuth 없이 Spring Boot로 Github OAuth 사용하기[2/2]
이전 글에 이어서 본격적으로 OAuth 기능을 구현해보자. 먼저 Github OAuth Api를 확인하자. https://docs.github.com/en/developers/apps/building-oauth-apps/authorizing-oauth-apps Authorizing OAuth Apps - GitHub Docs GitHub's OAuth implementation supports the standard authorization code grant type and the OAuth 2.0 Device Authorization Grant for apps that don't have access to a web browser. If you want to skip authorizing your a..
2021.11.22 -
[Spring Boot] Spring OAuth 없이 Spring Boot로 Github OAuth 사용하기[1/2]
스프링 부트 기반으로 Oauth를 다루려고 검색해보면 거의 대부분 Spring OAuth 모듈을 사용해서 해결하는 것 같다. 이번 글에서는 OAuth 라이브러리 없이 직접 Github OAuth를 활용해 Github API에 접근하는 글을 작성하도록 하겠다. 사전 준비 사항 깃허브 아이디 스프링 부트 기반 컨트롤러 매핑 지식 HTTP Oauth 기초 지식 OAuth 간단 정리 OAuth가 뭔지 간단하게 정리하고 가자. OAuth는 서비스 제공자가 직접 사용자의 정보를 관리하지 않고 외부 사이트에 존재하는 사용자의 정보에 대해 서비스 제공자에게 권한을 부여하는 개방형 표준이다. 우리가 평소에 회원가입을 통해 이름, 아이디, 비밀번호 등을 직접 입력하는 방식은 서비스 제공자가 정보를 관리하게 된다. OAut..
2021.11.22 -
[Java] Equals and HashCode
equals()와 hashcode()는 서로 다른 객체가 같은지를 판별할 때 사용되는 메서드이다. Object 클래스에 구현되어 있고 따라서 모든 객체가 상속받는다. Object의 equals()는 객체의 참조값을 비교하기 때문에 비교하고자 하는 클래스에서 hashCode()와 함께 오버라이딩해야 한다. hashCode()는 객체의 멤버 변수를 통해 해싱을 통한 해시값을 만들어낸다. 따라서 멤버 변수가 달라지면 hashCode()의 결과도 달라진다. 참고로 Object의 hashCode()는 객체의 주소값으로 해시코드를 만들어내기 때문에 프로그램을 실행할 때마다 변경될 수 있다. JDK1.8부터 java.util.Objects 클래스에 hash() 메서드가 추가됐다. hashCode()를 구현할 때 유용..
2021.10.19 -
2. Decorator Pattern
문제 커피 주문 시스템에서 각 커피에 대한 첨가물이 추가해달라는 요구사항이 들어왔다. 이를 해결해보자. 상속 위처럼 상속을 이용해서 설계를 하면 첨가물과 커피가 늘어날 때마다 클래스를 만들어서 상속해야 한다. 이는 엄청난 복잡도를 유발하게 될 것이다. 인스턴스 변수와 슈퍼 클래스 상속 이렇게 하면 어떨까? 이 역시 문제가 많다. 첨가물 가격이 바뀔 때마다 기존 코드를 수정해야 한다. 첨가물 종류가 늘어날 경우 그에 따른 메서드를 추가해야 한다(ex.시럽). 첨가물이 들어가지 않는 음료의 경우에도 불필요한 메서드를 상속받는다(ex.아이스티). 중복된 첨가물에 대한 표현이 불가능하다(ex.더블 모카). 해결 방법 객체에 추가적인 조건을 동적으로 추가해야 하는 문제는 데코레이터 패턴을 통해 해결할 수 있다. ..
2021.09.06 -
1. Observer Pattern
문제 인터넷 기반 기상정보스테이션을 구축해달라는 요청이 들어왔다. 현재의 기상 조건(기온, 습도, 기압)을 화면에 표시하는 기능의 프로그램이다. 그래서 우리 팀은 다음과 같이 데이터를 관리하는 클래스를 작성했다. public class WeatherData { public void measurementsChanged() { float temp = getTemperature(); float humidity = getHumidity(); float pressure = getPressure(); currentConditionsDisplay.update(temp, humidity, pressure); statisticsDisplay.update(temp, humidity, pressure); forecastDi..
2021.09.06