목록programing-languages/Java (9)
yeonuel-tech

JVM에는 String Pool이 존재하고 거기에 등록된 값들을 공유하는 구조이다. 즉, Flyweight 패턴이 적용됐다고 볼 수 있다. String은 기본형 데이터 타입이 아니다. 참조형 데이터 타입이다. 이 말은 String 또한 인스턴스이고 new 연산자를 통해 인스턴스를 생성해야한다. 하지만, String은 예외적으로 리터럴을 할당하더라도 해당 값을 갖는 인스턴스가 생성된다. 즉, String을 생성하는 방식은 크게 두 가지가 있다. 첫 번째로 new 연산자를 사용하는 방법과 두 번째는 리터럴을 할당하는 방법이다. 더 좋은 방식은 당연히 후자이다. 왜냐하면 new 연산자로 String을 생성하게 되면 매번 새로운 인스턴스가 생성되기 때문이다. 하지만, 리터럴로 할당하는 방식을 사용하면 매번 새로..
상속을 지양하고 포함관계와 다형성을 활용하기 위해 등장했다 자바에서는 상속이 있다. 상속이란? 코드를 재사용하기 위함, 하위 클래스가 상위 클래스의 코드를 재활용하는 것 하지만, 상속에는 다음과 같은 문제점이 있다. 하위 클래스에서 상위 클래스의 멤버를 사용하는 경우 상위 클래스의 정보를 정확하게 인지해야한다. 이는 하위 클래스를 통해 상위 클래스로 접근할 수 있는 경로를 만들기 때문에 캡슐화 파괴 발생 가능하다 물론, 단순하게 확장만 하기위해 상속을 사용하는 경우에는 위의 문제와 관련이 없다. 예를들어서, Template Method 패턴이 있다. 또 이 문제를 방지하기 위해 등장한 클래스 타입 Sealed Class가 있다. Sealed Class란? 자손의 개수를 제한하는 클래스이다. 즉, 외부에서..

Runable 은 전략패턴, Thread는 템플릿 메서드 패턴 각 패턴 정의 탐구 결론

오늘 학원에서 자바스크립트 수업 듣다가 원장님께서 자바스크립트에서는 인터페이스가 없지만, 인터페이스와 유사한 프로토콜이 있다고 했다. 그 와중에 생각 났던 것이 인터페이스의 장점 중 하나는 클래스 간의 관계를 맺어 줄 수 있어서 유연한 설계를 할 수 있는 것이다. 나는 자바스크립트에서도 프로토콜이 자바의 인터페이스 처럼 클래스 간의 관계를 맺어 줄 수 있는지 궁금했고 질문을 했다. 결과는 프로토콜은 클래스 간의 관계를 맺어 줄 수 없다. 그 과정에서 인터페이스나 추상 클래스로 프로그래밍 하는 것의 장점을 생각해보게 되었다. 1. 변경에 유리한 코드 작성, 코드 재활용 촉진인터페이스나 추상 클래스로 프로그래밍을 하면 변경에 유리한 코드를 짤 수 있다. 이 말은 변경 사항이 발생해도 코드의 변경 범위가 작다..

jdk 1.7부터 try-with-resources 문이 추가되었다. 이는 try-catch-finally 문에서 입출력(I/O) 관련 클래스를 사용할 때 발생하는 문제점 때문에 추가되었다. 일단, try-catch-fianlly 문에서 입출력(I/O) 관련 클래스를 사용할 때의 문제점부터 살펴보자. 1. 코드가 난잡해진다 try { // 입출력(I/O) 클래스 fis = new FileInputStream("fileName.text"); dis = new DataInputStream(fis); } catch (IOException e) { e.printStackTrace(); } finally { // 사용한 자원 반환하기 try { if (dis != null) { // close() 호출하여 사용한..

자바에서 Integer 클래스의 int compare()가 어떻게 구현됐는지 확인해보면 -를 써서 비교하는게 아니라 < 를 사용한 것을 확인할 수 있다. 왜 그럴까? 그 이유는 바로 성능때문이다. 컴퓨터의 모든 데이터는 이진수로 저장된다 그 말은 우리가 비교하려는 데이터도 결국엔 이진수로 저장되어있다는 뜻이다 예를들어, 자바에서는 문자를 저장할 때 char 타입의 경우 내부적으로는 유니코드가 저장된다 따라서 형변환을 사용하지 않아도 데이터 타입을 변환할 수 있다 int number = '1' - '0'; // 1 본론으로 돌아와서, -와 < 에는 왜 성능차이가 발생할까? 이진수끼리 -를 계산하면 각 자리수끼리 일일이 뺀다. 하지만 로 비교하는 것이 더욱 빠른 성능을 보임을 알 수 있다

@SafeVarargs 우리가 자바의 코드를 보면 가끔 볼 수 있는 @SafeVarargs가 있다 정확한 의미가 무엇이고 언제 사용하는 것일까?? safe와 varargs의 각 의미를 보면 '안전한'과 '인자'이다 즉, @SafeVarargs의 의미는 "해당 인자는 안전한 타입입니다."를 의미한다 컴파일 시점을 기준으로 타입이 제거되는 것을 non-reifiable이라고하고 제거되지 않는 것을 reifiable이라고 한다 non-reifiable의 대표적으로 지네릭스가 있다(지네릭스는 '컴파일 시점에 타입 체크하는 것'을 의미하고 타입 안전성을 보장하며 형변환을 생략하여 코드를 간결하게 만들 수 있는 기능이다) 즉, @SafeVarargs는 "non-reifiable한 인자에 대해 타입 안전성이 보장되기..

Comparable은 해당 클래스의 기본 정렬을 의미하고 Comparator는 기본 정렬 이외의 정렬 기준을 의미하여, 정렬 알고리즘을 분리해 놓은 것이다. 즉 Strategy 패턴이 적용됨 1. Comparable, 기본 정렬 2. Comparator, 기본 정렬 이외의 정렬 기준(Strategy 패턴) Comparable를 상속받아서 구현하면 해당 메서드를 구현해야하는데 그 메서드는 인스턴스 자기 자신의 변수값과 다른 인스턴스의 변수값을 비교한다 그래서 sort 메서드를 호출하면 해당 기준으로 정렬된 결과값을 얻을 수 있다 하지만, Comparator는 기본 정렬 기준 이외의 기준으로 비교한다 따라서 sort 메서드를 호출하면 정렬 대상과 정렬 기준을 넣어주어 해당 정렬 기준에 따른 결과 값을 얻을 ..