본문 바로가기
728x90

카테고리249

[이펙티브자바]item 25.톱레벨 클래스는 한 파일에 하나만 담으라. 소스파일 하나에 톱레벨 클래스를 여러개 선언하더라도 컴파일 된다. 하지만 같은 클래를 컴파일하거나, 설령 컴파일이 됐다하더라도, 컴파일러가 읽는 순서에 따라 동작이 달라질 수 있는 위험이 있다. 이를 해결하기 위해. 서로 다른 소스 파일로 분리하고 굳이 여러 톱레벨 클래스를 한파일에 담고 싶다면, 정적 멤버 클래스(아이템24)를 사용하는 방법을 고민해 보자. 교훈: 소스 파일 하나에는 반드시 톱레벨 클래스(혹은 톱레벨 인터페이스)를 하나만 담자 2023. 2. 8.
[이펙티브자바]item 24.멤버 클래스는 되도록 static으로 만들라. 중첩 클래스는 4 가지가 있다. 이중 2가지 정도만 살펴보면될듯, 정적 멤버 클래스 바깥 클래스와 함께 쓰일 때만 유용한 public 도우미 클래스 outer class 와 별개라 생각하면 될듯 비정적 멤버 클래스 바깥 클래스와 암묵적으로 연결된다. 멤버 클래스에서 바깥 인스턴스를 참조할 필요가 없다면 무조건 정적 멤버 클래스로 만들자 익명 클래스 람다를 지원하기전에 즉석에서 작은 함수 객체나 처리 객체를 만들 때 사용. 쓰이는 시점과 동시에 인스턴스가 만들어진다. 지역 클래스 가장 드물게 사용되며, 지역 변수를 사용하는 곳이면 어디든 정의해 사용할 수 있다. public class OuterClass { private static int outerVariable = 20; private int vari.. 2023. 2. 8.
[RealMysql 8.0] 인덱스 8.3.5 ~ 8.9.2 다중 칼럼 인덱스 두개 이상의 칼럼으로 구성된 인덱스를 다중 컬럼 인덱스(또는 복합 컬럼 인덱스)라고 한다. 데이터 레코드 건수가 적을경우 브랜치 노드가 없는 경우가 있을 수 있다. 루트 노드와 리프노드는 항상 존재 인덱스의 두번째 컬럼은 첫번째 컬럼에 의해 정렬돼 있다. 인덱스를 늘리면 앞전의 컬럼에 의해 정렬된다. 다중 칼럼 인덱스에서는 인덱스 내에서 각 칼럼의 위치가 상당히 중요하다. 2번째 칼럼이 정렬 순서가 빠르더라도 첫번째 칼럼에 의해 인덱스 리프 노드의 젤 아래에 위치할 수 있다. B-Tree 인덱스의 정렬 및 스캔 방향 인덱스를 생성할 때 설정한 정렬 규칙에 따라서 인덱스의 키 값은 항상 오름차순이나, 내림차순으로 정렬되어 저장된다. 어느 방향으로 읽을지는 옵티마이저가 실시간으로 만들어 내.. 2023. 2. 7.
[RealMysql 8.0] 인덱스 8.3.4 ~ 8.3.4.4 B-Tree 인덱스를 통한 데이터 읽기 각 스토리지 엔진이 어떻게 인덱스를 이용해서 실제 레코드를 읽어 내는지 알아보자. 아래는 mysql이 인덱스를 이용하는 방법을 알아본다. 1.인덱스 레인지 스캔 인덱스 접근 방법 가운데 가장 대표적인 접근 방식이다. 인덱스를 통해 레코드를 한 건만 읽는 경우와, 한 건 이상을 읽는 경우를 각각 다름 이름으로 구분하지만 해당 절에서는 모두 인덱스 레인지 스캔이라 한다.(추후 10장에서 다시 언급) 검색해야 할 인덱스의 범위가 결졍됐을 떄 사용하는 방식이다.검색하려는 값의 수나 결과 레코드 건수에 관계없이 레인지 스캔이라 한다. B-Tree 인덱스에서 루트와 브랜치 노드를 이용해 스캔 시작 위치를 검색하고, 그 지점부터 필요한 방향(오름, 내림)으로 인덱스를 읽어 나간.. 2023. 2. 7.
mysql 인덱스 테이블 정보, show index from 테이블 정보 실행계획이 틀어지는 경우가 발생하여, 살펴보니 인덱스 중복 이 발견되어 해당 인덱스 테이블에 대한 컬럼에 대한 정보가 궁금해서 정보를 남긴다. show index from table 컬럼 Table: 테이블의 이름 Non_unique: 0이면 고유한 인덱스, 1이면 중복 허용 인덱스 Key_name: 인덱스의 이름 Seq_in_index: 인덱스의 열 순서 Column_name: 인덱스가 적용된 컬럼의 이름 Collation: 인덱스의 정렬 순서(A: 오름차순, D: 내림차순) Cardinality: 인덱스의 유일성(유일한 값의 개수) Sub_part: 인덱스의 부분 색인(NULL이면 전체 컬럼이 색인됨) Packed: NULL Null: NULL일 수 있는지의 여부(YES/NO) Index_type: .. 2023. 2. 7.
[이펙티브자바]item 23.태그 달린 클래스보다는 클래스 계층구조를 활용하라. 태그 클래스란 특정 기능을 구현하기 위해 클래스에 태그값을 추가하여 사용하는 클래스를 의미한다. 태그란? 특별한 종류의 식별자, 보통 추가 정보를 제공하거나 선언의 동작을 변경하기 위해 선언에 나타낸다. 단순 키워드일 수도 있다. 태그의 단점은 많으므로(장황하고, 오류를 내기쉽고, 비효율 등등) 계층구조(상속)을 사용하여 리팩터링을 해보거나 쓰자. 2023. 2. 6.
[이펙티브자바]item 22.인터페이스는 타입을 정의하는 용도로만 사용하라. 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 상수 인터페이스 같은 경우는 잘못 사용된 예이다. 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당한다. 이러한 경우 몇가지 추천 방법이 있는데 특정 클래스나 인터페이스와 강하게 연관된 상수라면 해당 클래스나 인터페이스에 직접 추가하자. 열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 만들자. 인스턴스화 할 수 없는 유틸리티 클래스에 담아 공개하자 public class PhysicalConstants { private PhysicalConstants() { } // 인스턴스화 방지 public static final double AVOGADROS_NUMBER = 6.022_140_857e23.. 2023. 2. 6.
[이펙티브자바]item 21.인터페이스는 구현하는 쪽을 생각해 설계하라. 인터페이스에 디폴트 메서드를 선언하면, 해당 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 된다. 자바 8 전에는 기존 구현체를 깨뜨리지 않고 인터페이스에 메서드를 추가할 방법이 없었다. 인터페이스에 새로운 메서드 추가는 절대로 없다라고 가정하였으며 디폴트 메서드로 추가하는 길이 열렸지만 기존 구현체들과 매끄럽게 연동되리라는 보장은 없다. 디폴트 메서드는 구현 클래스에 대해 아무것도 모른 채 합의 없이 무작정 "삽입"될 뿐. 디폴트 메서드는 컴파일이 성공하더라도 기존 구현체에 런타임 오류를 일으킬 수 있다. interface MarkerInterface { default void hello() { System.out.println("MarkerInterface.hello"); } } cl.. 2023. 2. 6.
[RealMysql 8.0] 인덱스 8 ~ 8.3.3.4 디스크 읽기 방식 컴퓨터의 CPU나 메모리 처럼 전기적 특성을 띤 장치의 성능은 짧은 시간 동안 매우 빠른 속도로 발전 했지만 디스크 같은 기계식 장치의 성능은 상당히 제한적으로 발전했다. 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이냐가 관건일 때가 상당히 많다. 하드 디스크 드라이브(HDD) 솔리드 스테이트 드라이브(SDD) 순차 I/O 에서는 ssd 가 hdd 보다 조금 빠르거나 비슷한 성능을 보이기도 하지만 랜덤 I/O 에서는 ssd 가 훨씬 빠르다 데이터베이스는 순차 I/O 작업은 그다지 비중이 크지않고 랜덤 I/O를 통해 작은 데이터를 읽고 쓰는 작업이 대부분이므로 dmbs용 스토리지에 최적이라 볼 수 있다. 랜덤 I/O와 순차 I/O 하드 디스크 드라이브의 플래터(원판)를 돌려서 읽.. 2023. 2. 5.
728x90