JavaRush /Java Blog /Random-KO /커피 브레이크 #134. Java 코드를 작성할 때 피해야 할 사항. Java에서 final, fina...

커피 브레이크 #134. Java 코드를 작성할 때 피해야 할 사항. Java에서 final, finally 및 finalize가 사용되는 방법

Random-KO 그룹에 게시되었습니다

Java 코드 작성 시 피해야 할 사항

출처: 중간 개발자가 Java 코드를 작성할 때 저지르는 일반적인 실수를 나열한 기사를 알려드립니다. 커피 브레이크 #134.  Java 코드를 작성할 때 피해야 할 사항.  Java에서 final, finally 및 finalize가 사용되는 방법 - 1

Enum.values ​​사용

Enum.values를 정기적으로 사용했기 때문에 이것이 버그로 간주되었다는 사실은 나를 놀라게 했습니다 . 여기서 문제는 Enum.values()가 사양에 따라 변경 불가능한 목록으로 간주된다는 것입니다. 이를 위해서는 호출될 때마다 열거형 값이 포함된 배열의 새 인스턴스를 반환해야 합니다.
public enum Fruits {
    APPLE, PEAR, ORANGE, BANANA;

    public static void main(String[] args) {
        System.out.println(Fruits.values());
        System.out.println(Fruits.values());
    }
}
// output
// [Lcom.test.Fruits;@7ad041f3
// [Lcom.test.Fruits;@251a69d7
여기 메모리에는 두 개의 별도 개체가 있으므로 별 문제가 아닌 것처럼 보일 수도 있습니다. 그러나 요청을 처리할 때 Fruit.values()를 사용 하고 로드가 높으면 메모리 문제가 발생할 수 있습니다. 캐싱을 위한 전용 정적 최종 변수 VALUES를 도입하면 이 문제를 쉽게 해결할 수 있습니다 .

선택적 매개변수를 메소드 매개변수로 전달

다음 코드를 고려해보세요.
LocalDateTime getCurrentTime(Optional<ZoneId> zoneId) {
    return zoneId.stream()
        .map(LocalDateTime::now)
        .findFirst()
        .orElse(LocalDateTime.now(ZoneId.systemDefault()));
}
선택적 매개변수 zoneId를 전달 하고 그 존재 여부에 따라 시스템 시간대에 시간을 제공할지 아니면 지정된 시간대를 사용할지 결정합니다. 그러나 이는 Optional을 사용하는 올바른 방법이 아닙니다. 매개변수로 사용하는 것을 피하고 대신 메소드 오버로딩을 사용해야 합니다.
LocalDateTime getCurrentTime(ZoneId zoneId) {
  return LocalDateTime.now(zoneId);
}

LocalDateTime getCurrentTime() {
  return getCurrentTime(ZoneId.systemDefault());
}
위에 표시된 코드는 읽고 디버깅하기가 훨씬 쉽습니다.

스트링빌더 사용

Java의 문자열은 변경할 수 없습니다. 즉, 일단 생성되면 더 이상 편집할 수 없습니다. JVM은 문자열 풀을 유지 관리하고 새 풀을 만들기 전에 값에 해당하는 문자열 풀에서 인스턴스를 반환하는 String.intern() 메서드를 호출합니다. 요소를 연결하여 긴 문자열을 만들고 싶다고 가정해 보겠습니다.
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
최근에 우리는 이전 버전의 Java가 다음을 수행했기 때문에 이것이 매우 나쁜 생각이라는 말을 들었습니다.
  • 첫 번째 줄에서는 "start"라는 문자열이 문자열 풀에 삽입되고 longString 이 이를 가리킵니다.
  • 2행에서는 "startmiddle"이라는 문자열을 풀에 추가하고 longString 으로 이를 가리킵니다.
  • 3번째 줄에는 "startmiddlemiddle"이 있습니다.
  • 4번째 줄 - "startmiddlemiddlemiddle"
  • 마지막으로 5번째 줄에서 풀에 "startmiddlemiddlemiddleend"를 추가하고 이를 longString 으로 지정합니다.
이러한 행은 모두 풀에 남아 있으며 전혀 사용되지 않으므로 많은 양의 RAM이 낭비됩니다. 이를 방지하기 위해 StringBuilder를 사용할 수 있습니다.
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
StringBuilder는 toString 메서드가 호출될 때 하나의 문자열만 생성하므로 처음에 풀에 추가된 모든 중간 문자열을 제거합니다. 그러나 Java 5 이후에는 이 작업이 컴파일러에 의해 자동으로 수행되므로 "+"를 사용하여 문자열 연결을 사용하는 것이 더 좋습니다.

필요하지 않을 때 기본 래퍼 사용

다음 두 조각을 고려하세요.
int sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
Integer sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
첫 번째 예는 내 컴퓨터에서 두 번째 예보다 6배 빠르게 실행됩니다. 유일한 차이점은 Integer 래퍼 클래스를 사용한다는 것입니다. Integer가 작동하는 방식은 3행에서 런타임이 sum 변수를 기본 정수로 변환해야 하고(자동 unboxing) 추가가 완료된 후 결과가 새 Integer 클래스로 래핑된다는 것입니다. (자동 포장). 이는 우리가 100만 개의 Integer 클래스를 생성하고 200만 개의 패키징 작업을 수행한다는 것을 의미하며, 이는 극적인 둔화를 설명합니다. 래퍼 클래스는 컬렉션에 저장해야 하는 경우에만 사용해야 합니다. 그러나 향후 버전의 Java에서는 기본 유형 컬렉션을 지원하므로 래퍼가 더 이상 사용되지 않게 됩니다.

Java에서 final, finally 및 finalize가 사용되는 방법

출처: Newsshare 이 기사에서는 Finalize 키워드가 사용되는 위치, 시기, 이유와 Java에서 이 키워드를 사용할 가치가 있는지 알아보겠습니다. 또한 final, finally, finalize의 차이점도 배우게 됩니다.

finally 블록은 어디에 사용되나요?

Java의 finally 블록은 정리 코드, 파일 닫기 또는 연결 닫기와 같은 코드의 중요한 부분을 저장하는 데 사용됩니다. finally 블록은 예외가 발생했는지 또는 해당 예외가 처리되었는지 여부 에 관계없이 실행됩니다. A는 마지막으로 예외 발생 여부에 관계없이 모든 중요한 설명을 포함합니다.

Java에서 변수를 어떻게 마무리합니까?

최종 Java 변수를 초기화하는 방법에는 3가지가 있습니다.
  • 최종 변수가 선언되면 초기화할 수 있습니다. 이 접근 방식이 가장 일반적입니다.
  • 빈 최종 변수는 인스턴스 초기화 블록 또는 생성자에서 초기화됩니다.
  • 빈 최종 정적 변수는 정적 블록 내에서 초기화됩니다.

Java에서 finalize 메소드를 수동으로 호출할 수 있습니까?

finalize() 메서드는 필요하지 않으며 객체가 범위를 벗어날 때 호출하지 않는 것이 좋습니다. finalize() 메서드가 언제 실행될지(또는 실행할지 여부) 미리 알 수 없기 때문입니다 . 일반적으로 finalize는 특별히 필요한 경우가 아니면 사용하기에 가장 좋은 방법은 아닙니다. Java 9부터는 더 이상 사용되지 않습니다.

finalize 메서드는 언제 호출되나요?

가비지 수집 직전에 정리를 수행하기 위해 finalize() 메서드가 호출됩니다.

이들최종, 최종 및 최종의 차이점은 무엇인가요?

final, finally 및 finalize의 주요 차이점은 final은 액세스 수정자이고 finally는 예외 처리의 블록이며 finalize는 객체 클래스의 메서드라는 것입니다.

최종 메서드를 재정의할 수 있나요?

아니요, final로 선언된 메서드는 재정의하거나 숨길 수 없습니다.

catch 없이 try를 사용할 수 있나요?

예, final 블록을 사용하면 catch 블록 없이 try 블록을 가질 수 있습니다 . 아시다시피, try 블록에서 System 이외의 예외가 발생하더라도 마지막 블록은 항상 실행됩니다.

최종 방법이란 무엇입니까?

최종 메서드는 하위 클래스에 의해 재정의되거나 숨겨질 수 없습니다. 이는 클래스의 기능이나 일관성에 중요할 수 있는 메서드를 수정하는 하위 클래스의 예기치 않은 동작을 방지하는 데 사용됩니다.

생성자가 최종일 수 있나요?

생성자는 절대로 최종으로 선언될 수 없습니다. 컴파일러는 항상 "최종 수정자는 허용되지 않습니다."와 같은 오류를 발생시킵니다. 메서드에 적용될 때 Final은 해당 메서드가 하위 클래스에서 재정의될 수 없음을 의미합니다. 생성자는 일반적인 메서드가 아닙니다.

finally 키워드는 무엇에 사용되나요?

finally 키워드는 try 블록 다음에 코드 블록을 만드는 데 사용됩니다. finally 블록은 예외 발생 여부에 관계없이 항상 실행됩니다. finally 블록을 사용하면 보호된 코드에서 발생하는 상황에 관계없이 실행하려는 모든 해제 유형 문을 실행할 수 있습니다.

결국 무슨 소용이 있나요?

Java의 finally 블록은 연결 닫기 등 코드 일부를 실행하는 데 사용되는 블록입니다. Java의 finally 블록은 예외 처리 여부에 관계없이 항상 실행됩니다. 따라서 여기에는 예외 발생 여부에 관계없이 인쇄해야 하는 모든 필수 명령문이 포함되어 있습니다.

Finalize 메서드가 보호되는 이유는 무엇입니까?

finalize() 메서드 액세스 수정자가 보호되는 이유는 무엇입니까? 왜 공개할 수 없나요? JVM 이외의 다른 사람이 호출하면 안 되기 때문에 공개되지 않습니다. 그러나 해당 동작을 정의해야 하는 하위 클래스에 의해 재정의될 수 있도록 보호되어야 합니다.

finalize 메소드는 항상 Java에서 호출됩니까?

finalize 메소드는 객체가 가비지 수집되려고 할 때 호출됩니다. 이는 가비지 수집 대상이 된 이후 언제든지 발생할 수 있습니다. 객체가 가비지 수집되지 않을 수도 있습니다(따라서 finalize가 호출되지 않음).

이들던지다그리고 던지기의 차이점은 무엇인가요?

throw 키워드는 의도적으로 예외를 발생시키는 데 사용됩니다. throws 키워드는 하나 이상의 예외를 쉼표로 구분하여 선언하는 데 사용됩니다. throw를 사용하면 예외가 하나만 발생합니다.

try catch와 finally 키워드의 차이점은 무엇입니까?

이는 두 가지 서로 다른 개념입니다. 즉, try 블록에서 예외가 발생한 경우에만 catch 블록이 실행됩니다. finally 블록은 예외 발생 여부에 관계없이 항상 try(-catch) 블록 다음에 실행됩니다.

Java에서 try 없이 finally를 사용할 수 있나요?

finally 블록은 try 블록과 연결되어야 하며 try 블록 없이는 finally를 사용할 수 없습니다. 항상 실행되어야 하는 명령문을 이 블록에 배치해야 합니다.

최종 메소드를 상속받을 수 있나요?

최종 메서드가 상속되나요? 예, 최종 메서드는 상속되지만 재정의할 수는 없습니다.

재정의할 수 없는 방법은 무엇입니까?

메서드 재정의는 런타임 시 동적 연결을 기반으로 하고 정적 메서드는 컴파일 시 정적 연결을 사용하여 바인딩되므로 정적 메서드를 재정의할 수 없습니다. 따라서 정적 메서드를 재정의하는 것은 불가능합니다.

최종 메서드가 재정의되면 어떻게 되나요?

상위 클래스에 선언된 최종 메서드는 하위 클래스에서 재정의될 수 없습니다. 마지막 메서드를 재정의하려고 하면 컴파일러는 컴파일 타임에 예외를 발생시킵니다.

final 키워드와 finalize 메소드가 동일하게 작동합니까?

비슷한 이름을 제외하고는 기능에 유사점이 없습니다. final 키워드는 Java의 클래스, 메소드 또는 변수와 함께 사용할 수 있습니다. Java에서는 final 클래스를 확장할 수 없고 final 메서드를 재정의할 수 없으며 final 변수를 수정할 수 없습니다.

Java의 super 키워드는 무엇입니까?

Java의 super 키워드는 상위 클래스의 직접 객체를 참조하는 데 사용되는 참조 변수입니다. 하위 클래스를 인스턴스화할 때마다 참조 변수 super에 의해 참조되는 상위 클래스의 인스턴스가 병렬로 생성됩니다. super 키워드를 사용하면 상위 클래스의 메서드를 직접 호출할 수 있습니다.

정적 키워드와 최종 키워드의 차이점은 무엇입니까?

static 키워드와 final 키워드의 주요 차이점은 static 키워드가 해당 클래스의 개체와 독립적으로 사용할 수 있는 클래스 멤버를 정의하는 데 사용된다는 것입니다. Final 키워드는 상수 변수, 재정의할 수 없는 메서드, 상속할 수 없는 클래스를 선언하는 데 사용됩니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION