Item 61. 박싱된 기본 타입보다는 기본 타입을 사용해라 JDK 1.5버전에서는 오토박싱과 오토언박싱 덕분에 두 타입을 크게 구분하지 않고 사용할 수 있다. 하지만 두 개의 차이는 명확하게 구분된다. 기본 타입과 박싱된 기본 타입의 차이 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값 + 식별성이라는 속성을 갖는다. 다시 말하면, 값이 같은 박싱된 기본 타입의 인스턴스가 두 개 존재할 때, 이 두 개는 서로 다르다고 식별될 수 있다. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값을 가질 수 있다. 즉, null을 가질 수 있다. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. 이 세 가지 차이로 인해 주의하지 않고 사용하면 문제가 발생할 ..
Garbage Collection 가비지 컬렉션과 관계된 객체 참조 방식들 객체 참조 방식 Java 프로그램에서 하나의 객체는 다른 객체를 참조하고 다른 객체는 또 다른 객체를 참조하는 참조 사슬이 형성되는데, 이 참조 사슬 중 최초로 참조한 것을 Root Set이라고 한다. 힙 영역에 있는 객체들은 총 4가지 경로로 참조를 하게 된다. 힙 내의 다른 객체에 대한 참조(클래스 내에서 다른 클래스 인스턴스화) Java 스택 즉, Java 메소드 실행 시 해당 메소드의 지역변수와 파라미터들에 의한 참조 네이티브 메소드 스택(Java가 아닌 다른 언어로 작성된 코드)에 의해 생성된 객체에 대한 참조 메소드 영역의 정적 변수(static)에 의한 참조 2,3,4에 의해 참조한 것을 Root Set이라고 한다. ..
Java Virtual Machine JVM이란 Java 애플리케이션을 클래스 로더를 통해 읽어 들여 Java API와 함께 실행하는 것을 말한다. JVM은 Java와 OS 사이에서 중개자 역할을 하며 Java가 OS에 구애받지 않고 재사용을 가능하게끔 해준다. JVM은 스택기반의 가상머신으로 메모리 관리와 Garbage Collection을 수행한다. 우리는 왜 JVM을 알아야 할까? 메모리는 한정되어 있고 우리는 이 한정된 메모리에 안에서 프로그램을 실행해야하니 메모리를 최대한 효율적으로 사용해야 하는 것이다. 메모리를 효율적으로 사용하기 위해서는 메모리 구조를 알고 메모리 관리가 어떤 식으로 되는 진행되는 지 파악하여 그 입맛에 맞게 개발을 해야한다. JAVA 프로그램의 실행 과정을 살펴보자 우리가..
배열과 리스트의 관계 ArrayList ArrayList는 자료구조의 한 종류로서 동적으로 배열의 크기를 변경할 수 있다. 그럼 ArrayList는 어떻게 배열의 크기를 조정하는 것일까? ArrayList의 초기 크기는 10이다. add()로 인해 사이즈가 꽉 찼을 시 현재의 1.5배를 증가시켜 새로운 배열을 생성한다. 1.5배 증가시킨 새로운 배열에 현재의 배열을 copy한다. 만약 배열의 추가 및 삭제가 반복적으로 일어나게 된다면, 기존 배열에 있는 데이터들은 공간을 매꾸기 위해서 이동해야한다. 즉, 성능적인 이슈가 발생할 수 있다는 것이다. 이 때는, ArrayList 보다는 LinkedList로 배열을 생성하는 것이 더 적합할 수 있다. LinkedList LinkedList는각 인스턴스들이 다음..
String 사용? 미사용? String은 메모리에 어떻게 저장되는가? 객체의 값은 변경가능 한가? String 객체 대부분은 원시(Primitive) 타입으로 취급하므로 new 키워드를 사용할 필요가 없다. new 키워드를 사용 안 하고 String 리터럴로 표현할 경우 String Constant Pool 영역(힙 영역이 감싸고 있음)에 존재한 후 해당 영역의 값을 가리키게 된다. new 키워드를 사용할 경우에는 heap영역에 String 객체를 생성하게 되는 것이다. Java에서 String은 특별한 참조 자료형이다. 다른 객체들과 마찬가지로 new 생성자를 이용해서 인스턴스를 만들고 heap영역에 올라가지만, 다른 참조형과는 다르게 한번 객체가 생성되면 해당 값은 변하지가 않는다. String s..
추상클래스와 인터페이스 추상 메소드의 구현 강제성 추상 클래스 추상 클래스는 클래스 내에 추상 메소드가 하나 이상 포함거나 abstract로 정의된 경우를 말한다. 인터페이스 인터페이스는 모든 메소드가 추상 메소드인 경우를 말한다. 추상 클래스와 인터페이스는 상속받는 하위 클래스 혹은 구현 클래스에서 추상 메소드를 구현하도록 강제한다 추상클래스와 인터페이스 목적 그렇다면 의문이 들 수 있다. 인터페이스는 왜 필요하지? 그냥 추상 클래스로 인터페이스 역할까지 하면 되는거 아닌가? 둘은 존재 목적이 다르다. 추상클래스는 해당 추상 클래스를 상속받아서 확장하기 위해 존재하는 것이다. 추상 클래스는 단일 상속만 받아서 확장을 하고자 하는 것이다. 인터페이스는 구현한 객체들이 동일한 동작을 약속하기 위해 존재하는..
정보은닉과 접근제한자 정보은닉이란, 잘 설계된 컴포넌트는 바로 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐이다. 즉, 오직 API를 통해서만 다른 컴포넌트와 소통하고 서로의 내부 동작 방식에는 개의치 않는 것을 말한다. 그럼, 정보은닉의 장점을 살펴보자 시스템 개발 속도를 높여준다. 여러 컴포넌트들이 독자적이어서 병렬로 개발할 수 있기 때문이다. 시스템 관리 비용을 낮춰준다. 다른 컴포넌트로 교체하는 부담이 적기 때문이다. 정보은닉 자체가 성능을 줄여주지는 않지만 성능 최적화에는 도움을 준다. 다른 컴포넌트에 영향을 주지않고 해당 컴포넌트만 최적화할 수 있는 기회가 생기기 때문이다. 소프트웨어 재사용성을 높여준다. 외부에는 거의 의존하지 않고 독자적으로 동작할 수 있는 ..
접근제한자 접근 제한자는 클래스 내에서 멤버의 접근을 제한하는 역할을 한다. 접근 제한자의 종류 public 모든 클래스에서 접근이 가능하다. protected 같은 패키지내에서만 접근이 가능하다. 서로 다른 패키지라도 상속받은 하위 클래스에서는 접근이 가능하다. private 자기 자신만이(자기 클래스) 접근이 가능하다. default(접근 제한자 적지 않으면) 같은 패키지내에서만 접근이 가능하다(protected와 비슷) 정보은닉과 접근제한자 참고 https://it-mesung.tistory.com/41?category=813111 [Effective Java] 아이템 15. 클래스와 멤버의 접근 권한을 최소화하라 it-mesung.tistory.com
- Total
- Today
- Yesterday
- 인프런
- 스프링부트
- effectivejava
- package-private
- 정적팩터리메서드
- Effective Java
- 연관관계
- java
- 팩토리 메소드 패턴
- 점층적 생성 패턴
- 김영한
- Spring
- mustache
- 빌더 패턴
- jdk버전
- junit
- 생성자
- try with resources
- try catch finally
- @Lazy
- java8
- springboot
- 빈 순환 참조
- ifPresent
- flatMap
- 이펙티브자바
- 자바8
- JPA
- 복사 팩토리
- 이펙티브 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |