본문 바로가기

프로그래밍/자바(java)

(28)
[이펙티브 자바] 습관적으로 사용하는 Object 메소드 equals의 일반 규약을 지켜 재정의하라 String와 같은 class가 같은지 확인하는 메소드입니다. class에서 equals와 hashcode를 오버라이딩해본 사진이다. hashcode도 오버라이딩하는 이유는 논리적으로 같은 객체라면 같은 hashcode를 반환하기 위해서이다. Speaker의 해시 코드를 재정의 해주지 않으면, 값이 두개가 들어가게 되어 Map의 값이 2개는 일이 벌어지게 된다. hashCode를 재정의할때, Objects.hasCode로 재정의할 수 있다. 하지만, 속도가 상대적으로 더 느리다. 해시코드를 지연 초기화(lazy initialization) 하는 방법 지연초기화를 통해 캐쉬처리하면 유용한데 스레드 안전성까지 고려해야한다. 실제 업무에서는 lombok을 사용하여 @..
[이펙티브 자바] 객체 생성과 파괴(2) 1. Boxing type 대신 Primitive Type을 권장한다. 왼쪽 사진이 Boxing Type으로 계산 했을 경우고 오른쪽이 primitive Type으로 사용하였을 경우이다. 실제 실행 속도를 계산해보면 10배정도의 빠른 실험 결과를 볼 수 있다. Boxing Type을 남용하지 않도록 주의하는 것 뿐만 아니라, 의도치 않은 Auto Boxing을 조심해야한다. 2. UtilClass에서 또한 primitive type을 권장한다. 숫자 타입인지 검증하는 유틸을 만든다고 생각한다면 반환값을 boolean 과 같이 프리미티브 타입을 권장한다. 단, primitive type이 항상 옳은 것은 아니다. price가 null인것과 0은 의미가 다르다. 0은 이벤트 중 0원으로 측정할 수 있는것이고..
[이펙티브 자바] 객체의 생성과 파괴 1. Constructor와 static Factory method의 비교 생성자는 저희가 흔히 알고 있는 방식이 Movie에 있는 값들을 받아 생성하는 식으로 많이 사용한다. static Factory method 방식은 빈 생성자를 만든 후, return 을 해주는 방식을 말하고 있다. 그런데 이게 좋은건가? 라는 생각을 하게 된다. 약간 예제로 설명하게 되면다면, 밑에 같은 상황으로 사용할수 있을것같다. API 에서 받은 Reqeust Parameter 값을 원하는 값으로 변환시킬수 있다. 또한, 파라미터가 한개면 from으로 두개 이상이면 of로 표현한다. static Factory metho를 사용하면 장점들이 있다. 1. 이름을 가질수 있다. 2. Simple하고 명확하게 사용할 수 있다. 3..
[이펙티브 자바/ Effective Java] - 생성자 대신 정적 팩터리 메서드를 고려하라 클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자이다. 하지만 모든 프로그래머가 꼭 알아둬야 할 기법이 하나 더 있다. 클래스는 생성자와 별도로 정적 팩터리 메서드를 제공할 수 있다. 원래는 valueOf 사용하기 위해서는 new valueOf 와 같은 객체 생성이 필요하지만 static 메서드를 사용하면 생성없이 사용할 수 있다. 기존의 방법으로는 class객체를 선언하고 안에있는 메서드를 호출하는 식이라 불편함을 느낄수 있다. 하지만 static을 사용할 정적 메서드는 장점과 단점 모두 존재하기 때문에 잘 이해하고 사용해야 한다. 먼저 좋은 점으로는 ( 장점 ) 이름을 가질 수 있다. 생성자에 넘기는 매개변수와 생성자 자체만으로는 반환될 객체의 특성을 제대로 설명하지 못한다. ..
[자바/java] File 클래스 파일은 기본적이면서도 가장 많이 사용되는 입출력 대상이기 때문에 중요하다. 자바에서는 File클래스를 통해서 파일과 디렉토리를 다를 수 있도록 하고 있다. 그래서 File인스턴스는 파일 일 수도 있고 디렉토리 일 수도 있다. import java.io.File; public class FileExample { public static void main(String[] args) { File file = new File("/Users/mac/Desktop/Java/Java1/src/main/java/file/FileExample.java"); String fileName = file.getName(); int pos = fileName.lastIndexOf("."); System.out.println("경..
[자바/java] 표준입출력 System, RandomAccessFile 표준입출력은 콘솔(console)을 통한 데이터 입력과 콘솔의 데이터 출력을 의미한다. 자바에서는 표준 입출력을 위해 System.in, System.out, System.err 을 제공한다. 자바 어플리케이션의 실행과 동시에 사용할 수 있게 자동적으로 생성되기 때문에 스트림을 생성하는 코드를 작성하지 않고도 사용이 가능하다. System클래스의 소스에서 알 수 있듯이 in, out, err은 System클래스에 선언된 클래스변수(static 변수)이다. import java.io.IOException; public class SystemIOExample { public static void main(String[] args) { try { int input = 0; while((input = Syste..
[자바/java] 파일 입출력(I/O) , InputStream, OutputStream I/O 란 Input 과 Output의 약자로 입력과 출력, 간단히 줄여서 입출력이라고 한다. 입출력은 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것을 말한다. 스트림(stream) 자바에서 입출력을 수행하려면, 즉 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림(stream) 이라고 정의했다. 스트림은 단방향통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다. 그래서 입력과 출력을 동시에 수행하려면 입력을 위한 입력스트림(input stream) 과 출력을 위한 출력스트림(output stream) 2개 스트림이 필요하다. 스트림은 먼저 보낸 데이터를 먼저 받게 되어 있으며 중간에..
[자바/java] 스택(Stack) 과 큐(Queue) 자바에서 제공하는 Stack과 Queue에 대해 알아보기 이전에 스택(Stack)과 큐(Queue)의 기본 개념과 특징을 먼전 설명하겠습니다. 스택은 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO(Last In First Out)구조로 되어 있고, 큐는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out)구조로 되어 있다. 쉽게 얘기하자면 스택은 동전통과 같은 구조로 양 옆과 바닥이 막혀 있어서 한 방향으로만 뺄 수 있는 구조이고, 큐는 양 옆만 막혀 있고 위아래로 뚫려 있어서 한 방향으로는 넣고 한 방향으로는 빼는 파이프와 같은 구조로 되어 있다. 그렇다면 스택과 큐를 구현하기 위해서는 어떤 컬렉션 클래스를 사용하는 것이 좋을까요? 순차적으로 데이터를 추..