아. 크롬 오류로 창이 꺼지면서 정리하던게 전부 날아갔다.. 범용 OS에서 사용하는 데드락 해결 방식이 무시이기 때문이겠지? 교착 상태 발생 결과에 대한 책임이 사용자에게 전가된다는 것을 여실히 느끼게 되어 상당히 슬프지만 다시 정리해보자.

가비지 컬렉션(Garbage Collection)은 메모리 관리를 위해 사용되는 프로세스로, 더 이상 필요하지 않은 객체들의 메모리를 해제하는 것을 의미합니다. 이 과정은 두 가지 주요 단계로 나눌 수 있습니다. => Minor GC와 Major GC(또는 Full GC).
Minor GC (Young Generation GC)
Minor GC는 새로 생성된 객체들의 메모리를 관리하는 과정입니다. 대부분의 객체는 생성 후에 빠르게 더 이상 참조되지 않는 상태로 남게 되는데, 이러한 객체들을 빠르게 수집하여 메모리를 회수하는 것이 목적입니다. 주로 Young Generation이라고 불리는 영역에서 발생합니다.Young Generation은 새로운 객체들이 할당되는 공간입니다. Minor GC는 Young Generation의 공간에서 더 이상 참조되지 않는 객체들을 체크하고 회수합니다. 남아 있는 객체들 중에 더 오래 생존할 것으로 예상되는 객체들은 Survivor 영역으로 이동합니다. 객체들이 여러 번의 Minor GC를 거치면서 Survivor 영역을 오가면서 계속 생존합니다. 일정 시간 이상 살아남은 객체들은 Old Generation으로 이동합니다.
Major GC (Old Generation GC 또는 Full GC)
Major GC는 오랫동안 살아남은 객체들의 메모리를 관리하는 과정입니다. Old Generation에 있는 객체들 중에서 참조되지 않는 객체를 찾아내어 메모리를 해제합니다.Old Generation에 있는 객체들을 검사하여 더 이상 참조되지 않는 객체들을 식별하고 회수합니다. Minor GC와 달리 비교적 오랜 주기로 발생하며, 더 큰 메모리 영역을 관리합니다. Major GC가 발생하면 일시적으로 프로그램 실행이 중지될 수 있으며, 따라서 잘 계획된 시점에 수행하는 것이 중요합니다. Minor GC와 마찬가지로 메모리 회수 후 객체들을 적절한 세대로 이동시킵니다. Minor GC와 Major GC는 서로 다른 영역에서 발생하며, 주로 Young Generation과 Old Generation을 관리하는데 사용됩니다. 이렇게 구분하여 가비지 컬렉션을 수행함으로써 메모리 관리 효율성을 높일 수 있습니다.
자바의 경우, 항상 call by value로 값을 넘깁니다. C/C++와 같이 변수의 주소값 자체를 가져올 방법이 없으며, 이를 넘길 수 있는 방법 또한 없습니다.
reference type(참조 자료형)을 넘길 시에는 해당 객체의 주소값을 복사하여 이를 가지고 사용합니다. 따라서 원본 객체의 프로퍼티까지는 접근이 가능하나, 원본 객체 자체를 변경할 수는 없습니다.
++<call by value / call by reference>
Call by value
- 데이터 값을 복사해서 함수로 전달하기 때문에 원본의 데이터가 변경될 가능성이 없다.
- 인자를 넘겨줄 때마다 메모리 공간을 할당해야해서 메모리 공간을 더 잡아먹는다.
Call by reference
- 메모리 공간 할당 문제는 해결했지만, 원본 값이 변경될 수 있다는 위험이 존재한다.
JUnit은 자바 언어 단위테스트(Unit Test) 프레임워크입니다. 유닛 테스트는 소프트웨어 개발에서 개별 코드 조각이 의도한 대로 작동하는지를 검증하는 프로세스입니다. JUnit은 이러한 유닛 테스트를 작성하고 실행하기 위한 도구로 사용됩니다.
++<JUnit의 주요 특징>
Test Class (테스트 클래스): JUnit 테스트는 테스트 클래스 안에 작성됩니다. 테스트 클래스는 일반적으로 테스트 대상 클래스의 메소드를 테스트 메소드로 포함하며, 테스트 메소드는 해당 코드 조각의 동작을 검증하는 코드를 포함합니다.
Annotations (어노테이션): JUnit에서 테스트를 정의하기 위해 어노테이션을 사용합니다. @Test 어노테이션은 테스트 메소드를 정의할 때 사용되며, 해당 메소드가 테스트의 일부임을 나타냅니다.
Assertions (어서션): 어서션은 테스트 메소드 내에서 예상 결과와 실제 결과를 비교하는 역할을 합니다. 예를 들어, 예상되는 값과 실제 값을 비교하여 두 값이 일치하는지 확인할 수 있습니다.
Test Suites (테스트 스위트): 여러 테스트 클래스를 묶어서 동시에 실행할 수 있는 단위를 테스트 스위트라고 합니다. 테스트 스위트는 테스트 클래스의 집합을 구성하며, 클래스의 실행 순서를 지정하고 전체 테스트 결과를 보고하는 역할을 합니다.
Lifecycle Methods (라이프사이클 메소드): JUnit은 테스트 수명 주기에 관련된 메소드를 지원합니다. @Before와 @After 어노테이션을 사용하여 각 테스트 메소드 실행 전과 후에 실행할 코드를 정의할 수 있습니다.
Parameterized Tests (매개변수화 테스트): JUnit은 매개변수화된 테스트를 지원하여 같은 테스트 메소드를 다양한 입력 값으로 반복 실행할 수 있습니다.
Object 클래스는 자바의 모든 클래스의 최상위 클래스로, 모든 클래스가 상속하게 되는 기본 클래스입니다. Java의 모든 객체는 Object 클래스에서 상속받아 생성됩니다(실제로 컴파일러는 아무런 클래스도 상속하지 않으면 자동으로 extends Object를 삽입하여 Object 클래스를 상속). Object 클래스에는 모든 객체가 공통으로 가지는 메소드와 기능들이 정의되어 있습니다.
++<Object 클래스의 주요 메소드와 역할>
equals(Object obj): 객체의 내용을 비교하여 두 객체가 동등한지 여부를 판단합니다. 이 메소드를 오버라이딩하여 객체의 내용 비교 로직을 재정의할 수 있습니다.
hashCode(): 객체의 해시 코드를 반환합니다. hashCode 값은 해시 테이블과 같은 자료 구조에서 객체의 고유한 식별자로 사용됩니다.
toString(): 객체의 문자열 표현을 반환합니다. 주로 디버깅이나 로깅 목적으로 사용됩니다. 이 메소드를 오버라이딩하여 객체의 원하는 문자열 표현을 생성할 수 있습니다.
getClass(): 객체의 클래스 정보를 가져옵니다. getClass 메소드를 사용하여 객체의 클래스 타입을 확인할 수 있습니다.
clone(): 객체를 복제하여 새로운 객체를 생성합니다. 단순한 복제일 경우 객체의 필드는 얕은 복사(shallow copy)되며, 복잡한 객체일 경우 깊은 복사(deep copy)를 구현해야 할 수 있습니다.
finalize(): 객체의 소멸 과정에서 호출되는 메소드입니다. 하지만 이 메소드는 Java 9부터는 deprecated되었으며, 객체의 자원 해제는 보통 AutoCloseable 인터페이스나 try-with-resources 문을 통해 수행됩니다.
정적 바인딩 (Static Binding)
정적 바인딩은 컴파일 시간에 메소드 호출과 실제 실행될 메소드를 결정하는 것을 의미합니다. 컴파일러는 변수 또는 참조의 타입을 기반으로 어떤 메소드가 호출되어야 하는지를 미리 결정합니다. 정적 바인딩은 주로 오버로딩된 메소드들의 호출에서 발생합니다.
동적 바인딩 (Dynamic Binding)
동적 바인딩은 실행 시간에 메소드 호출과 실제 실행될 메소드를 결정하는 것을 의미합니다. 동적 바인딩은 다형성과 관련이 있으며, 객체의 실제 타입을 확인하고 해당 객체에 맞는 메소드를 호출합니다.정적 바인딩은 컴파일 시간에 메소드 호출을 결정하므로 성능 면에서 빠르지만, 실행 중에 객체의 실제 타입에 따라 메소드가 결정되지 않습니다. 동적 바인딩은 실행 시간에 실제 객체의 타입을 확인하여 메소드를 호출하므로 다형성을 지원하고 객체의 동작을 런타임에 변경할 수 있습니다. 상속과 다형성을 활용하는 객체 지향 프로그래밍에서 주로 사용됩니다.
사용하고 있는 데이터를 파일 저장 혹은 데이터 통신에서 파싱할 수 있는 유의미한 데이터를 만들기 위해 사용하는 기술로, 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술입니다.
직렬화를 하게 되면 각 주소 값이 가지는 데이터를 값 형식 데이터로 변환해 줍니다. 직렬화가 된 데이터는 언어에 따라서 텍스트 또는 바이너리 등의 형태가 되는데, 이러한 형태가 되었을 때 저장하거나 통신할 때 파싱이 가능한 유의미한 데이터가 됩니다.
직렬화된 데이터들은 모두 Primitive Type(기본형)이 되고, 이는 파일 저장이나 네트워크 전송 시 파싱이 가능한 유의미한 데이터가 됩니다. 따라서, 전송 및 저장이 가능한 데이터로 만들어주는 것이 바로 직렬화(Serialization)라고 할 수 있습니다.
컬렉션 클래스에 저장되는 인스턴스 타입을 제한하여 런타임에 발생할 수 있는 잠재적인 모든 예외를 컴파일 타임에 잡아 낼 수 있어서 사용합니다.
- 순환참조를 예방하기 위함입니다. (JPA로 개발할 때, 양방향 참조를 사용했다면 순환참조를 조심해야한다.)
- 엔티티 내부 구현을 캡슐화 할 수 있기 떄문입니다.
- 계층 간 역할을 분리 하기 위함입니다.
1. 소스파일을 작성한다. (*.java) 2. 자바 컴파일러를 통해 컴파일 하여, 바이트파일(*.class)을 생성한다. 1. 바이트파일이 뭔가요 ? 1. 기계가 읽기 편하도록 만든 파일입니다. 2. 이 파일을 JVM 이 읽어서 기계어로 바꾸고 나서, 실행합니다. 3. (*.class) 파일은 최종적으로 실행되는 파일은 아니다. 3. 프로그램 실행에 필요한 클래스 (*.class) 를 로드한다. 1. ClassLoader 를 **동적 로딩**을 통해 (*.class) 파일들을 JVM 에 올린다. 2. JVM 에 있는 .class 파일들을 Execution Engine 이 명령어 단위로 하나씩 실행하는데, 이 때 내부적으로는 Interpreter와 JIT Complier 를 통해 해석한다. 3. 해석된 바이트 코드는 Runtime Data Areas 에 배치되어 실질적인 수행이 이루어진다. 4. 지정된 클래스에서 main(String[] args) 를 호출한다. 5. main 메서드의 첫 줄부터 코드가 실행되고, 마지막 코드까지 실행되면 프로그램이 종료되고, 사용된 자원들은 반환이 된다.
음.. 크롬 브라우저의 각각의 탭은 하나의 프로세스로 이루어져 있기 때문에 그나마 다른 탭은 안전했겠네요 ㅎㅎ Internet Explorer 아니었어서 다행..