본문 바로가기

Java76

[Java] Shallow copy(얕은 복사) vs Deep copy(깊은 복사) 안녕하세요~ 잭코딩입니다! 이번 내용에서는 Shallow copy(얕은 복사)와 Deep copy(깊은복사)를 살펴봅시다 코드를 짜다보면 객체를 복사해야할 경우가 생깁니다 이 때 실수로 복사를 잘못하면 큰 이슈가 생길 수 있습니다 Shallow copy(얕은 복사) vs Deep copy(깊은 복사) Shallow copy(얕은 복사)는 '주소값'을 복사합니다 (즉, 참조하고 있는 실제값은 같습니다) Deep copy(깊은 복사)는 '실제값'을 새로운 메모리 공간에 복사합니다 (즉, 실제값이 다릅니다) 한번 코드와 그림을 통해 알아볼까요? 우선 이름과 돈을 가진 JackCoding 클래스를 만듭니다 public class JackCoding { String name; long money; public J.. 2020. 11. 30.
[이펙티브자바 3판] ITEM41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 이번장의 핵심은... 마커 인터페이스와 마커 애너테이션은 각자의 쓰임이 있다 새로 추가하는 메서드 없이 단지 타입 정의가 목적이라면 마커 인터페이스이 올바른 선택이다 클래스나 인터페이스 외의 프로그램 요소에 마킹해야 하거나, 애너테이션을 적극 활용하는 프레임워크의 일부로 그 마커를 편입시키고자 한다면 마커 애너테이션이 올바른 선택이다 마커 인터페이스 아무 메서드도 담고 있지 않고, 구현한 클래스를 표시해주는 인터페이스 ex) Serializable 인터페이스 Serializable은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 쓸 수 있다고, 즉, 직렬화(serializtion)할 수 있다고 알려줌 public interface Serializable{ } 마커 애너테이션이.. 2020. 11. 29.
[이펙티브자바 3판] ITEM40. @Override 애너테이션을 일관되게 사용하라 이번장의 핵심은... 재정의한 모든 메서드에 @Override 애너테이션을 의식적으로 달면 여러분이 실수했을 때 컴파일러가 바로 알려줄 것이다 예외는 한 가지인데, 단다고 해서 해로울 것도 없다 @Override 상위 메서드 재정의 이 애너테이션을 일관되게 사용하면 여러 가지 악명 높은 버그를 예방해줌 Bigram Class 예제 // 코드 40-1 영어 알파벳 2개로 구성된 문자열(바이그램)을 표현하는 클래스 - 버그를 찾아보자. (246쪽) public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second.. 2020. 11. 29.
[이펙티브자바 3판] ITEM39. 명명 패턴보다 애너테이션을 사용하라 이번장의 핵심은... 애너테이션으로 할 수 있는 일을 명명 패턴으로 처리할 이유는 없다 도구 제작자 제외하곤 일반 프로그래머가 애너테이션 타입을 직접 정의할 일은 거의 없지만, 자바 프로그래머라면 예외 없이 자바가 제공하는 애너테이션 타입들은 사용해야 한다 명명 패턴의 단점 ex) junit3 : 테스트 메서드의 시작을 test로 시작하게 하였다. 1. 오타가 나면 안됨 테스트 메서드 이름에 오타가 난다면 JUnit 3은 이 메소드를 그냥 지나쳐버림 2. 올바른 프로그램 요소에서만 사용되리라 보증할 방법이 없음 3. 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없다 예외를 던져야 성공하는 테스트 : 방법이 없다 → 애너테이션은 이 모든 문제를 해결해준다 애너테이션 @Retention(Retention.. 2020. 11. 18.
[클린코드(CleanCode)] 4장. 주석 나쁜 코드에 주석을 달지 마라. 새로 짜라 부정확한 주석은 아예 없는 주석보다 훨씬 더 나쁘다 코드만이 자기가 하는 일을 진실되게 말한다 우리는 주석을 가능한 줄이도록 꾸준히 노력하자 주석은 나쁜 코드를 보완하지 못한다 코드에 주석을 추가하는 일반적인 이유는 코드 품질이 나쁘기 때문이다 표현력이 풍부하고 깔끔하며 주석이 거의 없는 코드가, 복잡하고 어수선하고 주석이 많이 달린 코드보다 훨씬 좋다 코드로 의도를 표현하라 확실히 코드만으로 의도를 설명하기 어려운 경우가 존재할 수 있음 하지만, 몇 초만 더 생각하면 코드로 대다수 의도를 표현할 수 있음 주석으로 달려는 설명을 함수로 만들어 표현해도 충분함 // 직원에게 복지 혜택을 받을 자격이 있는지 검사 if ((employee.flags && HOURLY.. 2020. 11. 18.
[클린코드(CleanCode)] 3장. 함수 작게 만들어라 함수를 만드는 규칙은 작게! 블록과 들여쓰기 if, else, while 문 등으로 들어가는 블록은 한 줄이어야 함 (대게 거기서 함수를 호출) → 그래야 함수는 읽고 이해하기 쉬워짐 한가지만 해라 한 가지만 해야하고, 한 가지를 잘해야함! 단순히 다른 표현이 아닌, 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 것 '한 가지'만 하는지 판단하는 방법 함수 당 추상화 수준은 하나로 함수가 확실히 한 가지 작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 함 한 함수 내에 추상화 수준을 섞으면 코드를 읽는 사람이 헷갈림 위에서 아래로 코드 읽기 : 내려가기 규칙 위에서 아래로 프로그램을 읽으면 함수 추상화 수준이 한 단계씩 낮아짐 Switch 문 sw.. 2020. 11. 18.
[이펙티브자바 3판] ITEM38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 이번장의 핵심은... 열거 타입 자체는 확장할 수 없지만, 인터페이스와 그 인터페이스를 구현하는 기본 열거 타입을 함께 사용해 같은 효과를 낼 수 있다 열거 타입은 확장할 수 없다 타입 안전 열거 패턴은 열거한 값들에 값을 더 추가하여 다른 목적으로 사용할 수 있지만, 열거 타입은 불가능 확장할 수 있는 방법? 열거 타입이 인터페이스를 구현할 수 있다는 아이디어를 이용 연산 코드용 인터페이스를 정의하고 열거 타입이 이를 구현하도록 함 public interface Operation { double apply(double x, double y); } // 인터페이스를 이용해 확장 가능 열거 타입을 흉내 public enum BasicOperation implements Operation { PLUS("+".. 2020. 11. 18.