본문 바로가기
728x90

개발/Java53

[Java] Array보다 List를 사용해야하는 이유 자바에서 배열과 리스트(List)는 각각 다른 특징과 용도를 가지고 있다. List를 더 사용해야하는 이유를 정리했다. 크기 조정: 배열의 크기는 선언할 때 정해지고, 이후에는 변경할 수 없다. 반면에 List는 동적으로 크기를 조정할 수 있다. 요소를 추가하거나 제거할 때 List의 크기가 자동으로 조정되므로 편리하다. 삽입과 삭제: List는 요소의 삽입과 삭제가 쉽다. 요소를 삽입하려면 인덱스를 지정하고 값을 추가하면 되며, 요소를 삭제하려면 인덱스나 값으로 제거할 수 있습니다. 배열의 경우 요소를 삽입하거나 삭제하려면 많은 작업이 필요하다. 유연한 자료형: List는 여러 가지 자료형의 요소를 저장할 수 있다. 예를 들어, 정수, 문자열, 객체 등 다양한 유형의 데이터를 한 List에 저장할 수 .. 2023. 6. 13.
[Java] 클래스, 추상클래스, 인터페이스 차이 클래스, 추상클래스, 인터페이스는 객체 지향 프로그래밍(OOP)에서 사용되는 개념으로, 각각의 특징과 용도에 따라 차이가 있다. 클래스 (Class) 클래스는 객체를 생성하기 위한 템플릿이며, 객체의 상태와 동작을 정의하는데 사용된다. 클래스는 객체를 생성하는데 사용되는 구체적인 속성과 메서드를 포함하며, 객체는 클래스를 기반으로 생성된다. - 객체(Object) 객체는 클래스를 기반으로 생성된 실체. 클래스의 인스턴스라고도 함. 객체는 클래스의 속성과 동작을 가짐. 객체는 메모리에 할당되어 실행 중인 프로그램에서 실제로 동작함. 객체는 독립적으로 자신의 상태를 가지고 메소드를 호출하거나, 다른 객체와 상호작용할 수 있다. 추상클래스 (Abstract Class) 추상클래스는 클래스의 한 종류로, 인스턴.. 2023. 4. 21.
[Java] Raw 타입은 사용하지 말기 1. 개념 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면, 이는 제네릭 클래스나 제네릭 인터페이스라 함. List 를 말하며, 제네릭 클래스와 제네릭 인터페이스를 제네릭 타입이라고 함. 제네릭 타입은 매개변수화 타입을 정의함. 제네릭을 지원하기 전에는 컬렉션을 직접 선언함 2. 잘못된 코드 private final Collection stamps = ...; 위 코드를 사용하면 다른 타입을 넣어도 오류가 없음. stamps.add(new Coin(...)); coin을 꺼내기 전에는 오류를 뱉지 않음. 3. 올바른 코드 private final Collectiom stamps = '...'; stamps에 Coin 타입을 넣을 경우 incompatible types: Coin cannot be con.. 2023. 1. 23.
[Java] 클래스와 멤버는 접근 권한 최소화하기 1. 개념 - 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 클래스의 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼는지. - 잘 설계된 컴포넌트는 구현과 API를 깔끔히 분리. - API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않음. -> 이는 정보 은닉, 캡슐화 2. 정보 은닉의 장점 시스템 개발 속도를 높임. -> 여러 컴포넌트를 병렬로 개발할 수 있기 때문. 시스템 관리 비용을 낮춤. -> 각 컴포넌트를 더 빨리 파악하여 디버깅 가능하고, 다른 컴포넌트로 교체하는 부담도 적음. 성능 최적화에 도움을 줌. 재사용성을 높여줌. 큰 시스템 제작의 난이도를 낮춰줌. -> 시스템 전체가 완성되지 않은 상태에서도 개별 컴포넌트의 테스트.. 2023. 1. 16.
[Java] File 입출력 1. 개념 - 파일은 가장 많이 사용되는 입출력 대상 - File 클래스를 통해 파일과 디렉토리를 다룰 수 있음. - window에서 예시 코드 import java.io.*; class FileExample { public static void main(String[] args) throws IOException { File f = new File("경로"); String fileName = f.getName(); int pos = fileName.lastIndexOf("."); System.out.println("경로 제외한 이름 " + f.getName()); System.out.println("확장자 제외한 이름 " + fileName.substring(0, pos)); System.out.pri.. 2023. 1. 13.
[Java] try-with-resources 사용하기 자바에는 close() 메소드를 사용해 직접 닫아야 하는 자원이 많음. ex) - InputStream - OutputStream - java.sql.Connection ... 이를 방지하기 위해 try-finally가 많이 쓰였다. static String firstLineOfFile(String path) throws IOExceiption { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } } 사용해야할 자원이 많아지면 static void copy(String src, String dst) throws IOException { InputSt.. 2023. 1. 12.
[Java] private 생성자로 인스턴스화 막기, 의존 객체 주입 사용하기 1. 인스턴스화 막기 - 단순히 정적 메소드와 정적 필드만을 담은 클래스를 만들 때가 있음 *예시 java.lang.Math java.util.Arrays java.util.Collections final 클래스와 관련된 메소드들을 모을 때. - 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아님. - 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만듦. -> 매개변수가 없는 public 생성자가 만들어짐. -> 사용자는 생성자가 자동 생성된 것인지 아닌지 구분할 수 없음. - 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없음. -> 하위 클래스를 만들어 인스턴스화하면 됨. - 이를 막기 위해서는 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수.. 2023. 1. 9.
[Java] private 생성자나 열거 타입으로 싱글턴 보증하기 - 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말함. - 싱글턴의 예로는 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트. - 클래스를 싱글턴으로 만들면 테스트가 어려워 질 수 있음. -> 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 Mock 구현으로 대체할 수 없기 때문. - 싱글턴을 만드는 방식은 2가지. - 두 방식 모두 생성자는 privated으로 생성 - 유일한 인스턴스에 접근할 수 있는 수단으로 public staitic 멤버를 생성해둔다. 1. public static 멤버가 final 필드인 방식 public class Member { public static final Member INSTANCE = new Memb.. 2023. 1. 7.
[Java] 생성자 대신 빌더 사용하기 1. 점층적 생성자 패턴 - 정적 팩토리와 생성자는 매개변수가 많을 경우 적절히 대응하기 어렵다. - 과거에는 점층적 생성자 패턴 사용 public class Member { private String name; private String email; private int age; private String address; private String phone; public Member (String name, String email) { this(name, email); } public Member (String name, String email, int age) { this(name, email, age); } public Member (String name, String email, int age,.. 2023. 1. 5.
728x90