전체 글
-
item 28 배열보다는 리스트를 사용하라책/이펙티브 자바 2022. 3. 19. 22:21
ITEM 28 배열보다는 리스트를 사용하라 배열과 제네릭 타입의 차이 배열은 공변이다 함께 변한다는 뜻 sub가 super의 하위 타입이라면 배열sub[]는 배열 super[]의 하위 타입이 된다 제네릭은 불공변이다 서로 다른 타입 type1 , type2 가 있다면 List은 List의 하위 타입도 아니고 상위 타입도 아니다 문제가 있는건 제네릭이 아닌 배열이다(제네릭은 컴파일 단계에서 문제를 알 수 있지만 배열은 런타임 단계에서 오류를 발생한다) 배열은 실체화(reify) 된다 런타임에도 자신이 담기로 한 원소의 타입을 인지하며 확인한다 제네릭은 타입 정보가 런타임에는 소거된다 원소 타입을 컴파일타임에만 검사하고 런타임시기에는 알 수 없다 소거는 제네릭이 지원되기 전의 레거시 코드와 제네릭 타입의 호..
-
10820 문자열 분석PS/백준 2022. 3. 18. 00:03
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); String s = ""; /*** * a ~ z : 97 ~ 122 * A ~ Z : 65 ~ 90 * 0 ~ 9 : 48 ~ 57 * '' : 32 */ while ((s = buf.readLine()) != null) { int[] res = new int[4];..
-
item 27 비검사 경고를 제거하라책/이펙티브 자바 2022. 3. 17. 23:52
ITEM 27 비검사 경고를 제거하라 제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게된다 비검사 형변환 경고 비검사 메서드 호출 경고 비검사 매개변수화 가변인수 타입 경고 비검사 변환 경고 제네릭에 익숙해지면 보게되는 경고의 개수는 줄어들겠지만 새로 만든 코드가 한번에 컴파일 될거라고 기대하지는 말자 할 수 있는 한 모든 비검사 경고는 제거하고 비검사 경고는 중요하니 무시하지 말자 비검사 경고를 모두 제거하면 해당 코드는 타입 안정성이 보장된다 런타임에 ClassCastException이 발생할 일이 없으며 작성자의 의도대로 동작한다 모든 비검사 경고는 런타임에 ClassCastException을 일으킬 수 있는 잠재적 가능성을 뜻하니 최선을 다해 제거해라 경고를 없앨 방법을 먼저 찾아보고 만약 ..
-
10809 알파벳 찾기PS/백준 2022. 3. 16. 22:17
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); String inputVal = buf.readLine(); int[] cntArray = new int[26]; for (int i = 0; i < cntArray.length; i++) { cntArray[i] = -1; } for (int i = 0; i < in..
-
item 26 로 타입은 사용하지 말라책/이펙티브 자바 2022. 3. 16. 22:02
ITEM 26 로 타입은 사용하지 말라 제네릭 타입 제네릭 클래스와 제네릭 인터페이스를 통틀어 제네릭 타입이라 부른다 제네릭 클래스, 제네릭 인터페이스 : 클래스와 인터페이스 선언에 타입 매개변수가 사용된것List은 원소 타입이 String인 리스트를 뜻하는 매개변수화 타입이다 각각의 제네릭 타입은 일련의 매개변수화 타입을 정의한다 먼저 클래스 이름이 나오고 꺾쇠괄호 안에 실제 타입 매개변수들을 나열한다 String이 정규타입 매개변수 E에 해당하는 실제 타입 매개변수다 제네릭을 사용하면 컴파일러가 원소를 꺼내는 모든 곳에 보이지 않는 형변환을 추가하여 절대 실패하지 않음을 보장한다 로타입 제네릭 타입을 하나 정의하면 그에 딸린 로타입도 함께 정의된다 로타입 : 제네릭 타입에서 타입 매개변수를 전혀 사용..
-
10808 알파벳 개수PS/백준 2022. 3. 15. 23:53
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); String inputVal = buf.readLine(); int[] cntArray = new int[26]; for (int i = 0; i < inputVal.length(); i++) { cntArray[inputVal.charAt(i)-97]++; } for..
-
item 25 톱 레벨 클래스는 한 파일에 하나만 담으라책/이펙티브 자바 2022. 3. 15. 22:46
ITEM 25 톱 레벨 클래스는 한 파일에 하나만 담으라 소스 파일 하나에 톱레벨 클래스를 많이 선언해도 컴파일에 문제는 없지만 아무 의미가 없고 위험만 증가한다 한 클래스를 여러가지로 정의가 가능해지고 어느게 사용되는지는 컴파일 순서에 따라 달라지기 때문이다 public class Main { public static void main(String[] args) { System.out.println(Utensil.NAME + Dessert.NAME); } } Utensil.java class Utensil { static final String NAME = "pan"; } class Dessert { static final String NAME = "cake"; } Dessert.java class U..
-
10992 별 찍기 17PS/백준 2022. 3. 14. 22:00
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(buf.readLine()); for (int i = 1; i < n; i++) { System.out.printf(" "); } System.out.println("*"); for (int i = 2; i
-
item 24 멤버 클래스는 되도록 static으로 만들라책/이펙티브 자바 2022. 3. 14. 20:21
ITEM 24 멤버 클래스는 되도록 static으로 만들라 중첩 클래스 다른 클래스 안에 정의된 클래스이다 자신을 감싼 바깥 클래스에서만 사용 되어야 한다 다르게 사용하는 경우는 톱레벨 클래스로 만들어야 한다 중첩 클래스의 종류는 정적 멤버 클래스, 멤버 클래스(비정적 클래스), 익명 클래스, 지역 클래스가 있다 첫 번째를 제외한 나머지 클래스는 내부 클래스다 정적 멤버 클래스 다른 클래스 안에 선언된다 바깥 클래스의 private 멤버에도 접근할 수 있다 나머지는 일반 클래스와 같다 정적 멤버 클래스는 다른 정적 멤버와 똑같은 접근 규칙을 적용받는다 private로 선언하면 바깥 클래스에서만 접근 가능하다 정적 멤버 클래스는 바깥 클래스와 함께 사용되는 경우 public 도우미로 유용하게 쓰인다 정적 ..
-
item 23 태그 달린 클래스보다는 클래스 계층구조를 활용하라책/이펙티브 자바 2022. 3. 14. 19:57
ITEM 23 태그 달린 클래스보다는 클래스 계층구조를 활용하라 태그 달린 클래스 두 가지 이상의 의미를 표현할 수 있으며 현재 표현하는 의미를 태그 값으로 알려주는 클래스 태그 달린 클래스의 단점 열거 타입의 선언, 태그 필드, switch 문 등 쓸데없는 코드가 많다 여러 구현이 한 클래스에 들어있어 가독성이 안좋다 다른 의미를 위한 코드가 같이 있으니 메모리 사용량이 많다 필드들을 final로 선언하려면 해당 의미에 쓰이지 않는 필드까지 생성자에서 초기화 해야한다 태그 달린 클래스는 장황하며 오류가 나기 쉬우며 비효율적이다 클래스 계층구조 타입 하나로 다양한 의미의 객체를 표현 가능한 좋은 수단이다 태그 달린 클래스는 클래스 계층구조를 어설프게 흉내낸 아류일 뿐이다 태그 달린 클래스를 클래스 계층구..