OutOfMemoryError(메모리 부족 오류)는 JVM(Java Virtual Machine)이 새로운 객체를 할당할 충분한 메모리가 없을 때 발생하는 오류입니다. Java의 예외 클래스 계층 구조에서 OutOfMemoryError는 Exception이 아닌 Error 카테고리에 속하며, 이는 애플리케이션 코드에서 정상적인 복구가 어려운 심각한 문제임을 의미합니다. OutOfMemoryError 재현하기 OutOfMemoryError를 직접 발생시켜 보면 오류의 동작 방식을 이해하는 데 큰 도움이 됩니다. 재현 과정은 다음과 같
핵심 요약 protected 접근 제어자는 같은 패키지 내에서 접근할 수 있을 뿐만 아니라 서브클래스(하위 클래스)에서도 접근할 수 있습니다. 반면 default(접근 제어자 미지정)는 패키지 레벨 접근 제어자로, 같은 패키지 안에서만 접근이 허용됩니다. protected 접근 제어자란? protected는 같은 패키지 내부에서는 public처럼, 패키지 외부에서는 private처럼 동작합니다. 단, 패키지 외부라도 서브클래스 객체에 대해서는 public처럼 접근을 허용합니다. 최상위(top-level) 클래스나 인터페이스에는
java.lang.ArithmeticException은 Java에서 발생하는 대표적인 비검사 예외(unchecked exception)입니다. 비검사 예외란 RuntimeException을 상속하는 예외로, 컴파일러가 반드시 처리하도록 강제하지 않는 예외를 의미합니다. 가장 흔하게 접하는 사례는 java.lang.ArithmeticException: / by zero로, 두 수를 나누려 할 때 분모가 0이면 발생합니다. ArithmeticException 객체는 JVM에 의해 생성될 수 있습니다.예제 1public class Ari
NumberFormatException은 비검사 예외(unchecked exception)의 하나로, parseXXX() 메서드가 문자열을 숫자로 변환(format)하지 못할 때 발생합니다.이 예외는 java.lang 패키지에 속한 여러 클래스의 메서드나 생성자에 의해 던져질 수 있습니다. 대표적인 메서드들은 다음과 같습니다.public static int parseInt(String s) throws NumberFormatExceptionpublic static Byte valueOf(String s) throws NumberFo
java.lang.ArrayStoreException은 비검사(unchecked) 예외로, 특정 타입의 배열에 서로 다른 타입의 객체를 저장하려고 시도할 때 발생합니다. 실무에서는 java.lang.ArrayStoreException: java.lang.Integer 형태의 오류 메시지를 가장 흔하게 접하게 되는데, 이는 String 배열이나 float 배열처럼 다른 타입으로 선언된 배열에 Integer 값을 넣으려고 할 때 나타나는 대표적인 사례입니다. 예제 1: 예외 발생 상황 public class ArrayStoreExcep
네, 메소드 로컬 내부 클래스(method local inner class)는 지역 final 변수에 접근할 수 있습니다. 그 이유는 final 변수가 힙(heap) 영역에 저장되기 때문에, 해당 변수를 참조하는 내부 클래스 객체가 살아 있는 동안 변수의 값도 함께 유지되기 때문입니다. 메소드 로컬 내부 클래스란? 로컬 내부 클래스의 인스턴스는 메소드의 인수로 전달하거나 반환값으로 사용할 수 있으며, 유효한 스코프(범위) 안에서만 사용할 수 있습니다. 메소드 로컬 내부 클래스의 가장 큰 제약은, 내부 클래스에서 참조하는 지역 변수
결론부터 말하면, 불가능합니다. 자바에서 최상위(top-level) 클래스는 private이나 protected로 선언할 수 없습니다. 사용할 수 있는 접근 수준은 public과 default(접근 제어자 생략) 두 가지뿐이며, 접근 제어자를 명시하지 않으면 기본적으로 default(패키지) 접근 권한을 갖게 됩니다. 기본 문법 // 최상위 클래스 public class TopLevelClassTest { // 클래스 본문 } 핵심 포인트 정리 최상위 클래스를 private으로 선언하면 컴파일러가 modifier pri
네, 가능합니다. 자바에서는 하나의 try-catch 블록 안에 또 다른 try-catch 블록을 선언할 수 있으며, 이를 중첩 try-catch 블록(Nested Try-Catch Block)이라고 부릅니다. 중첩 try-catch 블록의 동작 원리 내부(inner) try 블록에서 발생한 특정 예외에 대해 일치하는 catch 문이 존재하지 않으면, 제어권은 다음 try 블록의 catch 핸들러로 넘어갑니다. 이 과정은 어느 한 catch 문이 성공적으로 실행되거나, 모든 중첩 try 문의 검사가 끝날 때까지 반복됩니다. 만약
Java에서 length는 배열(array)의 인스턴스 변수이고, length()는 String 클래스의 메서드(method)라는 점에서 서로 다릅니다. 두 기능 모두 길이를 구한다는 공통점이 있지만, 적용 대상과 동작 방식이 다르기 때문에 정확한 이해가 필요합니다. length — 배열의 길이를 구하는 변수 배열은 동일한 타입의 값을 고정된 개수만큼 저장하는 객체(object)입니다. 배열의 length 변수는 배열에 저장된 요소(element)의 개수, 즉 배열의 길이를 반환합니다. 배열은 한 번 초기화되면 크기를 변경할 수
자바에서는 클래스 내부에 또 다른 클래스를 정의할 수 있으며, 이렇게 정의된 클래스를 중첩 클래스(Nested Class)라고 부릅니다.접근 제어자 사용 범위는 다음과 같습니다.내부 클래스(Inner Class): private, public, protected, default 모두 사용 가능외부 클래스(Outer Class): default 또는 public만 사용 가능자바의 중첩 클래스는 크게 두 가지 유형으로 나뉩니다.정적 중첩 클래스(Static Nested Class)비정적 중첩 클래스(Non-Static Nested Cl
java.lang.ClassCastException은 Java에서 대표적인 비검사형(unchecked) 예외 중 하나입니다. 프로그램 실행 중 한 클래스 타입의 객체를 서로 다른 클래스 타입으로 강제 형변환(casting)하려고 시도할 때 발생합니다. 컴파일 시점에는 오류가 감지되지 않고, 런타임에 예외가 던져지기 때문에 주의가 필요합니다. ClassCastException이 발생하는 경우 부모 클래스 객체를 자식 클래스 타입으로 캐스팅하려고 할 때 발생합니다. 실제 객체가 부모 클래스 인스턴스라면 자식 타입으로 변환하는 것은 허
Java에서 부모 클래스의 메서드를 오버라이딩(재정의)할 때, 해당 메서드가 예외를 던진다면 반드시 지켜야 할 몇 가지 규칙이 있습니다. 이 규칙은 다형성(polymorphism)과 깊은 관련이 있는데, 부모 타입의 참조 변수로 메서드를 호출하는 코드가 자식 클래스에서 선언된 더 넓은 범위의 예외를 처리하지 못하는 상황을 방지하기 위함입니다.오버라이딩 시 예외 처리 규칙1. 부모 클래스 메서드가 예외를 던지지 않는 경우부모 클래스 메서드가 어떤 예외도 던지지 않는다면, 자식 클래스에서 오버라이딩한 메서드는 체크드 예외(checked
StringIndexOutOfBoundsException은 자바에서 대표적인 비검사 예외(unchecked exception) 중 하나입니다. 문자열(String)은 여러 개의 문자(character)가 모여 이루어진 집합으로, String 객체가 허용하는 유효 인덱스 범위는 [0, 문자열 길이]입니다. 따라서 실제 문자열의 범위를 초과하는 인덱스로 문자에 접근하려고 하면 이 예외가 발생합니다.StringIndexOutOfBoundsException이란?이 예외는 java.lang 패키지에 속하며, IndexOutOfBoundsEx
슈퍼클래스에서 final로 선언된 메소드는 서브클래스에서 재정의(오버라이드)할 수 없습니다. 만약 슈퍼클래스의 final 메소드를 강제로 재정의하려고 하면 Java 컴파일러는 오류를 발생시킵니다.메소드 오버라이딩 구현 규칙재정의하려는 메소드의 선언부(메소드 이름, 매개변수, 반환 타입)는 원본 메소드와 동일해야 합니다.오버라이딩을 시도하기 전에 서브클래스가 반드시 다른 클래스(슈퍼클래스)를 상속(extends)하고 있어야 합니다.서브클래스는 슈퍼클래스의 final 메소드를 절대 재정의할 수 없습니다.예제 코드class Car {
네, 가능합니다. 자바에서는 생성자를 private으로 선언할 수 있습니다. 생성자를 private으로 선언하면 클래스 외부에서 해당 클래스의 객체를 직접 생성할 수 없게 됩니다. 이러한 특성 때문에 private 생성자는 싱글턴(Singleton) 디자인 패턴 구현 시 유용하게 활용됩니다.private 생성자의 주요 특징과 조건private 생성자를 가진 클래스는 상속(서브클래싱)할 수 없습니다.클래스 외부에서 객체를 생성할 수 없으며, 객체 생성은 오직 클래스 내부에서만 가능합니다.클래스의 모든 메서드가 유틸리티 성격의 메서드라
네, 가능합니다. Java에서는 클래스 이름과 동일한 이름의 메서드를 정의하는 것이 허용됩니다. 이 경우 컴파일 타임이나 런타임에 오류가 발생하지 않습니다. 다만 Java 코딩 표준 관례상 이러한 방식은 권장되지 않습니다. 일반적으로 Java에서는 생성자의 이름과 클래스 이름이 항상 동일하기 때문에, 클래스와 같은 이름의 메서드를 정의하면 코드를 읽는 사람에게 혼란을 줄 수 있습니다.예제 코드public class MethodNameTest { private String str = Welcome to TutorialsPoin
자바에서 정적 블록(static block)과 생성자(constructor)는 모두 특정 시점에 자동으로 실행되는 코드 블록이지만, 실행되는 시점과 용도가 완전히 다릅니다. 이 글에서는 두 개념의 차이점을 예제 코드와 함께 자세히 살펴보겠습니다. 정적 블록(Static Block)이란? 정적 블록은 클래스가 로딩(class loading)되는 시점에 실행됩니다. main() 메서드가 실행되기 전에 먼저 호출됩니다. 정적 블록은 이름이 없으며, 별도의 프로토타입(선언부)을 가지지 않습니다. 클래스 로딩 시점에 반드시 수행해야 하는
결론부터 말씀드리면, 자바에서는 열거형(Enum)을 확장할 수 없습니다. 자바의 모든 열거형은 컴파일 시점에 java.lang.Enum 클래스를 암묵적으로 상속합니다. 자바는 다중 상속을 지원하지 않기 때문에, enum 타입은 이미 java.lang.Enum을 상속하고 있는 시점에서 다른 클래스를 추가로 확장할 수 없습니다. Enum 클래스의 선언 구조 public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializa
네, 가능합니다. Java에서는 public static void main()의 선언 순서를 static public void main()으로 바꾸어도 컴파일 타임이나 런타임 오류가 전혀 발생하지 않습니다. Java에서는 접근 제한자(접근 제어자)를 어떤 순서로든 선언할 수 있으며, 메서드 이름은 항상 마지막에, 반환 타입은 그 바로 앞에 위치해야 하고 나머지 한정자들은 자유롭게 배치할 수 있습니다. 다만 Java 코딩 표준에 따르면 접근 제한자(public, private, protected)를 가장 앞쪽에 두는 것이 권장됩니다.
Java에서 String 클래스의 intern() 메서드는 문자열 중복 문제(string duplication problem)를 처리할 때 활용할 수 있습니다. intern()을 사용하면 내용이 같은 중복 문자열 인스턴스가 불필요하게 차지하는 메모리를 크게 절약할 수 있습니다.문자열 중복이란?어떤 문자열이 다른 문자열과 동일한 내용을 가지면서도 서로 다른 메모리 위치에 저장되어 있다면, 그 문자열은 중복되었다고 말할 수 있습니다. 내용은 같은데 객체가 여러 개 존재하는 상황이죠.JVM의 문자열 풀(String Pool) 동작 방식J