java
-
Java - InputStream & OutputStreamLanguage/Java 2023. 3. 21. 16:57
InputStream & OutputStream 데이터 입출력 프로그램에서는 데이터를 외부에서 읽고 다시 외부로 출력하는 작업이 빈번하게 일어난다. 데이터는 사용자로부터 키보드, 마우스 등을 통해 입력될 수도 있고, 파일 또는 네트워크를 통해 입력될 수도 있다. 또 반대로 데이터를 사용자에게 모니터나 파일 등으로 출력할 수도 있다. 자바 입출력과 스트림 자바에서 데이터는 스트림을 통해 입출력된다. 스트림은 단일 방향으로 연속적으로 흘러가는 것을 말하는데 물이 높은 곳에서 낮은 곳으로 흐르듯이 데이터도 출발지에서 나와 도착지로 흘러간다는 개념이다. 프로그램이 출발지냐 또는 도착지냐에 따라서 스트림의 종류가 결정된다. 프로그램이 데이터를 입력받을 때에는 입력 스트림(InputStream)이라고 부르며, 데이..
-
제네릭 - 아이템 28. 배열보다는 리스트를 사용하라Study/Effective Java 2023. 1. 4. 14:55
배열보다는 리스트를 사용하라 배열과 제네릭의 차이 1. 공변과 불공변 배열과 제네릭 타입에는 중요한 두 가지 차이가 있다. 첫 번째, 배열은 공변이다. 예를 들어, Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다. 즉, 같이 변한다는 의미이다. 반면, 제네릭은 불공변이다. 즉, 서로 다른 타입 Type1과 Type2가 있을 때, List은 List의 하위 타입도 아니고 상위 타입도 아니다. Object[] objectArray = new Long[1]; objectArray[0] = "타입이 달라 넣을 수 없다."; // ArrayStoreException을 던짐 Long용 저장소에 String을 넣을 수는 없다. 배열에서는 이러한 문제점을 런타임에야 알게 ..
-
제네릭 - 아이템 26. 로 타입은 사용하지 말라Study/Effective Java 2023. 1. 3. 14:49
로 타입은 사용하지 말라 제네릭이란? 클래스와 인터페이스 선언에 타입 매개변수가 사용되면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라고 부르며 이를 통틀어 제네릭 타입이라고 한다. 각각의 제네릭 타입은 일련의 매개변수화 타입을 정의한다. 먼저 클래스의 이름이 나오고, 바로 옆에 꺾쇠괄호 안에 실제 타입 매개변수들을 나열한다. 예를 들어, List은 원소의 타입이 String인 리스트를 뜻하는 매개변수화 타입이다. 여기서 String은 정규 타입 매개변수 E에 해당하는 실제 타입 매개변수이다. 로 타입이란? 제네릭 타입을 하나 정의하면 그에 딸린 로 타입도 함께 정의된다. 로 타입이란 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 말한다. 예를 들어, List의 로 타입은 List이다. 로 타..
-
Java - 제네릭(Generic)의 제한 - extends, super, ?Language/Java 2022. 12. 28. 14:57
제네릭(Generic)의 제한 - extends, super, ? 개요 이전 게시글에서는 제네릭의 가장 일반적인 사용법과 특성에 대해서 알아보았다. 예를 들어, 타입을 T라고 하고 외부에서 Integer로 지정하면 T는 Integer가 되고, String으로 지정하면 T는 String이 된다. 만약, Student 클래스를 만들고 T를 Student를 지정한다면 T는 Student가 된다. 즉, 제네릭은 이 처럼 참조 타입 모두가 될 수 있다. 만약, 이러한 T를 특정 범위 내로 좁혀서 제한하고 싶다면 어떻게 해야 할까? 이때 필요한 것이 바로 extends, super, ?이다. extends와 super이라는 키워드는 많이 보았을 것이다. ?는 와일드카드라고 해서 쉽게 말해 알 수 없는 타입이라는 의..
-
Java - 제네릭(Generic)의 특성Language/Java 2022. 12. 28. 09:50
제네릭(Generic)의 특성 복수의 제네릭 사용 class EmployeeInfo { public int rank; EmployeeInfo(int rank) { this.rank = rank }; } class Person { public T info; public S id; Person (T info, S id) { this.info = info; this.id = id; } } public class GenericDemo { public static void main(String[] args) { Person p = new Person(new EmployeeInfo(1), 1); } } 클래스 내에서는 여러 개의 제네릭을 필요로 하는 경우가 있을 것이다. 위 코드는 이러한 경우의 예이다. 위 코드는..
-
Java - 제네릭(Generic)을 사용하는 이유Language/Java 2022. 12. 27. 17:26
제네릭(Generic)을 사용하는 이유 제네릭을 사용하지 않을 경우의 문제점 - 타입 안전성 class StudentInfo { public int grade; public StudentInfo(int grade) { this.grade = grade; } } class StudentPerson { public StudentInfo studentInfo; public StudentPerson(StudentInfo studentInfo) { this.studentInfo = studentInfo; } } class EmployeeInfo { public int rank; public EmployeeInfo(int rank) { this.rank = rank; } } class EmployeePerson {..