이번 포스팅에서는 new String()과 “”의 차이를 살펴봅시다. new String()과 ""의 차이점 둘의 차이는 새로운 인스턴스를 만들어내느냐에 있습니다. String string = new String("eric"); 이 코드는 실행될 때마다 String 인스턴스를 새로 만듭니다. 반복문이나 빈번히 호출되는 메서드 안에 있다면 쓸데없는 String 인스턴스가 수천 개 이상 만들어질 수 있습니다. 이에 개선된 버전의 코드가 바로 “”로 선언하는 코드입니다. String string = "eric"; 이 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용합니다. 나아가 이 방식을 사용한다면 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객..
JVM 구조 클래스 로더 시스템, 메모리, 실행 엔진, 네이티브 메서드 인터페이스, 네이티브 메소드 라이브러리가 존재한다. 이미지는 다음 링크를 참고하자. 자바 가상 머신 - 위키백과, 우리 모두의 백과사전 ko.wikipedia.org 1. 클래스 로더 시스템 1.1 로딩(loading) 클래스 로더가 프로젝트 내에 있는 소스 코드 형태로 되어 있는 .class 파일을 읽는다. 그 파일의 내용을 binary 데이터를 만들고, 메소드에 저장한다. 이 때 저장하는 데이터는 다음과 같다. FQCN(Fully Qualified Class Name) 그 파일이 클래스인지 인터페이스인지 enum인지에 대한 식별 정보 파일 내에 있는 메서드와 프로퍼티 정보 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하..
자바에서 두 개의 오브젝트가 같은가라는 말은 주의해서 써야 합니다. 자바에서는 “같다"라는 표현에 다음과 같은 두 가지 의미가 담습니다. 동일성(identical) 두 개의 오브젝트가 완전히 같다는 의미 == 연산자 두 개의 오브젝트가 동일하다면 사실은 하나의 오브젝트만 존재하는 것이고, 두 개의 오브젝트 레퍼런스 변수를 가집니다. 동등성(equality) 두 개의 오브젝트가 같은 정보를 담고 있다는 의미 equals() 두 개의 오브젝트가 동등한 경우에는 두 개의 각기 다른 오브젝트가 메모리상에 존재합니다. 자바 클래스를 만들 때 equals() 메서드를 따로 오버라이딩하지 않았다면, 최상위 클래스인 Object 클래스에 구현되어 있는 equals() 메서드가 사용됩니다.
보다 나은 객체지향 실력을 위해 토이 프로젝트를 TDD로 개발해보려고 합니다. 토이 프로젝트에서는 다음 책이나 사이트에서 배운 것들을 무조건 혹은 최대한 반영하려고 합니다. 클린 코드 이펙티브 자바 객체지향 생활 체조 이번에 할 토이 프로젝트는 레이싱 카입니다. 요구사항은 다음과 같습니다. 주어진 경기수 동안 n대의 자동차는 전진 또는 멈출 수 있다. 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. 전진하는 조건은 0에서 9 사이에서 random 값을 구한 후 random 값이 4이상일 경우 전진하고, 3이하의 값이면 멈춘다. 매 경기마다 자동차들의 전진한 횟수를 “-”로 출력해야 한다. 위 요구사항을 보고 어떠한 도메인을 도출해내는 게 중요합니다. 도메인 도출 후 여러 테스트 케이스를 도..
API 설계자가 메서드 선언에 예외를 명시하는 까닭은, 그 메서드를 사용할 때 적절한 조치를 취해달라고 말하는 것입니다. API 설계자의 목소리를 흘려버리지 맙시다. 안타깝게도 예외를 무시하기란 아주 쉽습니다. 해당 메서드 호출을 try 문으로 감싼 후 catch 블록에서 아무 일도 하지 않으면 끝입니다. // catch 블록을 비워두면 예외가 무시된다. try { ... } catch (SomeException e) { } 예외는 문제 상황에 잘 대처하기 위해 존재하는데 catch 블록을 비워두면 예외가 존재할 이유가 없어집니다. 비유하자면 화재경보를 무시하는 수준을 넘어 아예 꺼버려, 다른 누구도 화재가 발생했음을 알지 못하게 하는 것과 같습니다. 운이 좋아 별 탈이 없으면 다행이지만 끔찍한 참사로 ..
작업 도중 예외가 발생해도 그 객체는 여전히 정상적으로 사용할 수 있는 상태라면 멋지지 않습니까? CheckedException를 던진 경우라면 호출자가 오류 상태를 복구할 수 있을 테니 특히 더 유용할 것입니다. 일반화해 이야기하면, 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 합니다. 이러한 특성을 실패 원자적(failure-atomic)이라고 합니다. 메서드를 실패 원자적으로 만드는 방법은 다양합니다. 가장 간단한 방법은 불변 객체(아이템 17)로 설계하는 것입니다. 불변 객체는 태생적으로 실패 원자적입니다. 메서드가 실패하면 새로운 객체가 만들어지지는 않을 수 있으나 기존 객체가 불안정한 상태에 빠지는 일은 결코 없습니다. 불변 객체의 상태는 생성 시점에 고정되어 절대..
예외를 잡지 못해 프로그램이 실패하면 자바 시스템은 그 예외의 스택 추적 정보를 자동으로 출력합니다. 스택 추적은 예외 객체의 toString 메서드를 호출해 얻는 문자열로, 보통은 예외의 클래스 이름 뒤에 상세 메시지가 붙는 형태입니다. 이 정보가 실패 원인을 분석해야 하는 프로그래머 혹은 사이트 신뢰성 엔지니어(SRE)가 얻을 수 있는 유일한 정보인 경우가 많습니다. 더구나 그 실패를 재현하기 어렵다면 더 자세한 정보를 얻기가 어렵거나 불가능합니다. 따라서 예외의 toString 메서드에 실패 원인에 관한 정보를 가능한 한 많이 담아 반환하는 일은 아주 중요합니다. 달리 말하면, 사후 분석을 위해 실패 순간의 상황을 정확히 포착해 예외의 상세 메시지에 담아야 합니다. 실패 순간을 포착하려면 발생한 예..
메서드가 던지는 예외는 그 메서드를 올바로 사용하는 데 아주 중요한 정보입니다. 따라서 각 메서드가 던지는 예외 하나하나를 문서화하는 데 충분한 시간을 쏟아야 합니다. (아이템 56) 검사 예외는 항상 따로따로 선언하고, 각 예외가 발생하는 상황을 자바독의 @throws 태그를 사용하여 정확히 문서화합시다. 공통 상위 클래스 하나로 뭉뚱그려 선언하는 일은 삼갑시다. 극단적인 예로 메서드가 Exception이나 Throwable을 던진다고 선언해서는 안 됩니다. 메서드 사용자에게 각 예외에 대처할 수 있는 힌트를 주지 못할뿐더러, 같은 맥락에서 발생할 여지가 있는 다른 예외들까지 삼켜버릴 수 있어 API 사용성을 크게 떨어뜨립니다. 이 규칙에 유일한 예외가 있다면 바로 main 메서드입니다. main은 오..
- Total
- Today
- Yesterday
- Effective Java
- Spring Boot
- 이펙티브 자바
- C++
- Java
- 디자인 패턴
- Kotlin
- node.js
- programmers
- AWS
- 클린 코드
- Olympiad
- 프로그래머스
- MSA
- 이팩티브 자바
- 클린 아키텍처
- 코테
- BOJ
- Algorithm
- 정규표현식
- 테라폼
- JPA
- 디자인패턴
- 알고리즘
- 객체지향
- kkoon9
- kotest
- 백준
- Spring
- BAEKJOON
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |