제네릭
·
공부
Raw 타입은 사용하지 말라 이번 장에서는 제네릭과 함께 과거 호환성을 위한 남겨진 Raw 타입의 위험성을 설명한다. Raw 타입은 제네릭을 선언하면 함께 정의되는 타입으로, 예를 들어 `List`를 선언하면, `List`로 함께 선언된다. 형태로 알 수 있듯 List는 타입 매개변수(List에서 E)가 포함되지 않은 타입이다. 따라서 Raw 타입을 사용하게 되면 다음과 같은 코드가 컴파일될 수 있다. private final Collection stamps = ...; stamps.add(new Coin(...)); 즉, 제네릭을 통한 타입 일반화를 컴파일 타임이 아닌, 런타임 에러로 받게된다. 이런 사용법은 제네릭의 필요성에도 위반된다. 제네릭은 일반화된 타입을 컴
클래스와 인터페이스
·
공부
클래스와 멤버의 접근 권한을 최소화하라 객체지향언어 및 최근에 나온 언어를 접하게 되면 반드시 접하게 되는 개념이 있다. 바로 '가시성'에 대한 개념인데, 흔히 private, protected, public 등과 같은 키워드와 함께 설명된다. 저자는 컴포넌트의 설계 수준에 대한 기준점 중 하나로 객체가 얼마나 외부와 잘 격리되었는지, 즉 캡슐화를 다음과 같은 이유로 제안한다. 여러 컴포넌트는 병렬로 개발할 수 있다. 관리 비용을 낮춘다. 성능 최적화가 쉽다. 재사용성이 높아진다. 개별 컴포넌트에 대한 동작을 검증할 수 있다. 이는 비단 메서드에 국한되지 않는다. 클래스 필드 또한 가시성에 유의해야 한다. 만약 필드가 public으로 외부에서 직접 접근한 경우 해당 필드에 대한 변경 및 제어에 대한 제한..
모든 객체의 공통 메서드
·
공부
equals는 일반 규약을 지켜 재정의하라 이번 장에서는 Java의 최상위 객체인 Object에서 사용되는 메서드(equals, hashCode, toString, clone, finalize)들에 대한 주의사항을 소개한다. 이 중 finalize는 생략한다. 처음 다른 언어를 접하고 Java를 배운 사람들은 대부분 ==와 .equals의 차이를 한 번씩은 경험한다. 사소하지만 객체의 동일성은 메모리 주소가 아닌 객체가 가진 상태를 기준한다는 점에서 Java의 객체지향적인 부분이 드러나는 부분이라고 할 수 있다. 이처럼 객체지향언어에서 동치는 물리 또는 논리적 성격 두 가지를 의미할 수 있다. 상속을 통한 확장은 명세가 중요하다. 만약 명세가 제대로 잡히지 않은 메서드를 상속받아 오버라이드(overwri..
객체 생성과 파괴
·
공부
정적 팩터리 메서드 일반적인 객체지향 프로그래밍 언어들은 객체를 생성할 때 객체의 상태를 초기화할 수 있는 constructor(이하, 생성자)인 특별한 메서드가 존재한다. 각 언어마다 의미하는 키워드는 다르지만, 그 의미는 모두 동일한다. 이 책에서 소개하는 정적 팩터리 메서드를 권장하는 이유를 요약하면 다음과 같다. 이름을 가질 수 있다. 생성할 인스턴스를 제어할 수 있다. 위 이유로 알 수 있듯 기본 생성자는 언어 레벨에서의 제한과 생성할 객체의 상태는 제어할 수 있지만, 인스턴스 자체를 제어할 수 없다. 때문에 상태에 따라 인스턴스를 생성하기 위해서는 constructor overloading 하거나, 클라이언트 측에서 생성된 객체에 대한 상태를 setter를 통해 변경해야한다. 하지만 두 방법 ..
Github 계정 GPG 등록하기
·
공부
개발을 하면서 Github는 빼놓을 수 없는 최애 사이트 중 하나일 것이다. 최근은 커밋이 일기장 같은 느낌으로 와서 이것저것 커밋 내역에 뭐를 달아보고 있다. 최근 달았던 뱃지(?) 중 가장 마음에 드는 것이 바로 지금 소개할 Verified이다. 마치 장인이 자신의 작품에 자신의 이니셜을 새겨 넣는듯한 느낌이 들어서 내 코드에 더 애착이 생기는 것은 덤! 설치 먼저 gpg를 생성/관리하기 위하여 gpg를 설치한다. brew install gnupg2 키 생성 gpg를 설치했다면 이제 사용할 키를 생성해야한다. 키를 생성하기 위해선 --gen-key를 이용해 gpg를 실행한다. gpg --gen-key 이때 주의할 점은 키 생성 시 입력한 암호를 잃어버리면 이후 키 등록 및 사용에 문제가 있으니 기억해..
수강 하면 기록하는 명령어
·
공부
docker run --privileged --name docker-server -itd -p 10022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup:rw --cgroupns=host edowon0623/docker-server:m1 /usr/sbin/init docker run --privileged -itd --name ansible-server -p 20022:22 -p 8082:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup --cgroupns=host edowon0623/ansible-server:m1 /usr/sbin/init