Develop Artifacts/Java

Java - 06. inheritance and polymorphism

equals를 override하면 hashCode도 해야 하는 이유 — 상속과 다형성의 계약해시맵에 객체를 넣었다. 같은 키로 조회했는데 null이 돌아온다. equals()로 비교하면 true인데. 원인은 hashCode()를 함께 override하지 않았기 때문이다.쉽게 말하면: HashMap은 객체를 넣을 때 hashCode()로 "몇 번 서랍에 넣을지"를 결정한다. 그런데 equals()는 "같은 사람이야"라고 하는데, hashCode()는 "다른 서랍 번호"를 돌려준다 — 서랍이 안 맞으니 찾을 수 없다. 이것이 equals와 hashCode의 계약 위반이다.이 현상은 다형성(polymorphism)과 동적 디스패치(dynamic dispatch)의 결과다. 이 글은 상속, override, O..

Develop Artifacts/Java

Java - 05. class and object

private 필드에 public setter를 붙이면 캡슐화가 아니다 — 클래스 설계의 함정많은 Java 튜토리얼이 "캡슐화 = 필드를 private으로 하고 getter/setter를 만드는 것"이라고 가르친다. 이 설명은 틀렸다.생각해 보자: private int balance;에 public void setBalance(int b) { this.balance = b; }를 붙였다. 외부에서 balance = -1000000을 직접 못 할 뿐, setBalance(-1000000)으로 똑같이 음수 잔액을 만들 수 있다. 비밀번호를 자물쇠로 걸어두고 열쇠를 현관에 두는 것과 같다.진짜 캡슐화는 "객체가 자신의 상태를 스스로 보호하는 것"이다. 이 글은 클래스와 객체의 생성, 접근 제어, 생성자 설계를..

Develop Artifacts/Java

Java - 04. array and string

String s = "ab"; s += "c";가 새 객체를 만드는 이유 — 불변 문자열과 배열의 세계웹 서버 로그를 조합하려고 루프 안에서 String message += line + "\n";을 실행했다. 데이터가 적을 때는 잘 돌아간다. 그러다 처리량이 늘어나면 GC 로그에 java.lang.String 객체가 폭발적으로 쌓이고, 결국 OutOfMemoryError가 발생한다. "문자열 더하기"가 왜 이런 결과를 부르는가?답은 단어 하나에 있다: String은 불변(immutable)이다. +=는 기존 문자열을 수정하지 않고 새 String 객체를 생성한다. (JLS §15.18.1) 이 글은 String의 불변성이 만드는 모든 결과 — String pool, StringBuilder, 성능, th..

Develop Artifacts/Java

Java - 03. operator control

switch가 식(expression)이 된 순간 — 연산자에서 제어 흐름까지예전 Java에서 switch를 쓰면 이랬다:String result;switch (day) { case 1: result = "월"; break; case 2: result = "화"; break; // ... break 빼먹으면 다음 case로 흘러내림}변수 선언 → switch → case마다 대입 → break. 이게 값 하나를 결정하는 데 너무 많은 의식이다. Java 14부터 switch가 값을 반환하는 식이 됐다 — String result = switch(day) { case 1 -> "월"; ... }; 한 줄로. break도 없고, 흘러내림도 없다. (JEP-361)이 글은 이 변화의 배경이 되..

Develop Artifacts/Java

Java - 02. types

==가 true이기도 하고 false이기도 한 이유 — Java 타입 시스템의 두 세계다음 코드를 보자.// Java 25Integer a = 127;Integer b = 127;System.out.println(a == b); // (1)Integer c = 200;Integer d = 200;System.out.println(c == d); // (2)(1)은 true, (2)는 false다. 같은 == 연산자인데, 값이 127일 때와 200일 때 결과가 다르다. 이게 말이 되는가?이 미스터리를 풀려면 한 가지를 알아야 한다 — Java에는 데이터를 저장하는 두 가지 방식이 있다는 것. 이 두 방식의 차이가 ==의 동작을 결정하고, null의 의미를 결정하고, 성능과 메모리 사용량까지 결정한다..

Develop Artifacts/Java

Java - 01. intro

java Hello.java가 숨기고 있는 것 — JVM, 바이트코드, 그리고 "한 번 쓰면 어디서나"의 진짜 의미Java 11부터 java Hello.java 한 줄로 프로그램을 바로 실행할 수 있게 됐다. (JEP-330) 파일을 저장하고 java 명령 하나면 끝난다. 이 명령이 내부적으로 무엇을 하는지 모른 채 써도 프로그램은 잘 돌아간다.문제는 여기서 시작된다. "Java는 컴파일 언어인가 인터프리터 언어인가?"라는 질문에 답하지 못하는 것은, 단계를 건너뛰었기 때문이다. javac가 .java 파일을 무엇으로 바꾸는지, JVM이 그 결과물을 어떻게 실행하는지, "Write Once Run Anywhere"가 마케팅 구호가 아니라 정밀한 기술적 설계임을 이해하지 못하면 — GC 튜닝, 클래스 로딩..

Archive

'Java' 24

Develop Artifacts/Java

Java - 06. inheritance and polymorphism

equals를 override하면 hashCode도 해야 하는 이유 — 상속과 다형성의 계약해시맵에 객체를 넣었다. 같은 키로 조회했는데 null이 돌아온다. equals()로 비교하면 true인데. 원인은 hashCode()를 함께 override하지 않았기 때문이다.쉽게 말하면: HashMap은 객체를 넣을 때 hashCode()로 "몇 번 서랍에 넣을지"를 결정한다. 그런데 equals()는 "같은 사람이야"라고 하는데, hashCode()는 "다른 서랍 번호"를 돌려준다 — 서랍이 안 맞으니 찾을 수 없다. 이것이 equals와 hashCode의 계약 위반이다.이 현상은 다형성(polymorphism)과 동적 디스패치(dynamic dispatch)의 결과다. 이 글은 상속, override, O..

댓글
Develop Artifacts/Java

Java - 05. class and object

private 필드에 public setter를 붙이면 캡슐화가 아니다 — 클래스 설계의 함정많은 Java 튜토리얼이 "캡슐화 = 필드를 private으로 하고 getter/setter를 만드는 것"이라고 가르친다. 이 설명은 틀렸다.생각해 보자: private int balance;에 public void setBalance(int b) { this.balance = b; }를 붙였다. 외부에서 balance = -1000000을 직접 못 할 뿐, setBalance(-1000000)으로 똑같이 음수 잔액을 만들 수 있다. 비밀번호를 자물쇠로 걸어두고 열쇠를 현관에 두는 것과 같다.진짜 캡슐화는 "객체가 자신의 상태를 스스로 보호하는 것"이다. 이 글은 클래스와 객체의 생성, 접근 제어, 생성자 설계를..

댓글
Develop Artifacts/Java

Java - 04. array and string

String s = "ab"; s += "c";가 새 객체를 만드는 이유 — 불변 문자열과 배열의 세계웹 서버 로그를 조합하려고 루프 안에서 String message += line + "\n";을 실행했다. 데이터가 적을 때는 잘 돌아간다. 그러다 처리량이 늘어나면 GC 로그에 java.lang.String 객체가 폭발적으로 쌓이고, 결국 OutOfMemoryError가 발생한다. "문자열 더하기"가 왜 이런 결과를 부르는가?답은 단어 하나에 있다: String은 불변(immutable)이다. +=는 기존 문자열을 수정하지 않고 새 String 객체를 생성한다. (JLS §15.18.1) 이 글은 String의 불변성이 만드는 모든 결과 — String pool, StringBuilder, 성능, th..

댓글
Develop Artifacts/Java

Java - 03. operator control

switch가 식(expression)이 된 순간 — 연산자에서 제어 흐름까지예전 Java에서 switch를 쓰면 이랬다:String result;switch (day) { case 1: result = "월"; break; case 2: result = "화"; break; // ... break 빼먹으면 다음 case로 흘러내림}변수 선언 → switch → case마다 대입 → break. 이게 값 하나를 결정하는 데 너무 많은 의식이다. Java 14부터 switch가 값을 반환하는 식이 됐다 — String result = switch(day) { case 1 -> "월"; ... }; 한 줄로. break도 없고, 흘러내림도 없다. (JEP-361)이 글은 이 변화의 배경이 되..

댓글
Develop Artifacts/Java

Java - 02. types

==가 true이기도 하고 false이기도 한 이유 — Java 타입 시스템의 두 세계다음 코드를 보자.// Java 25Integer a = 127;Integer b = 127;System.out.println(a == b); // (1)Integer c = 200;Integer d = 200;System.out.println(c == d); // (2)(1)은 true, (2)는 false다. 같은 == 연산자인데, 값이 127일 때와 200일 때 결과가 다르다. 이게 말이 되는가?이 미스터리를 풀려면 한 가지를 알아야 한다 — Java에는 데이터를 저장하는 두 가지 방식이 있다는 것. 이 두 방식의 차이가 ==의 동작을 결정하고, null의 의미를 결정하고, 성능과 메모리 사용량까지 결정한다..

댓글
Develop Artifacts/Java

Java - 01. intro

java Hello.java가 숨기고 있는 것 — JVM, 바이트코드, 그리고 "한 번 쓰면 어디서나"의 진짜 의미Java 11부터 java Hello.java 한 줄로 프로그램을 바로 실행할 수 있게 됐다. (JEP-330) 파일을 저장하고 java 명령 하나면 끝난다. 이 명령이 내부적으로 무엇을 하는지 모른 채 써도 프로그램은 잘 돌아간다.문제는 여기서 시작된다. "Java는 컴파일 언어인가 인터프리터 언어인가?"라는 질문에 답하지 못하는 것은, 단계를 건너뛰었기 때문이다. javac가 .java 파일을 무엇으로 바꾸는지, JVM이 그 결과물을 어떻게 실행하는지, "Write Once Run Anywhere"가 마케팅 구호가 아니라 정밀한 기술적 설계임을 이해하지 못하면 — GC 튜닝, 클래스 로딩..

댓글

wall

방명록

방문 흔적을 남겨주세요. 질문이나 인사 모두 환영합니다.