-
💡 Java의 특징
-
💡 Java의 단점
-
💡 Java의 실행과정과 JVM 구조
-
💡 Java의 실행과정
-
💡JVM의 구조 (Class Loader, Runtime Data Area, Execution Engine)
-
💡 Java ByteCode란?
-
💡Java 버전 별 차이점
-
💡 JDK와 JRE
-
💡 동일성과 동등성
-
💡 equals()와 ==의 차이점
-
💡 equals()와 hashcode()
-
💡 toString()이란?
-
💡 자바에서 메인 메서드는 왜 static으로 정의 되어 있을까?
-
💡 상수(Constant)와 리터럴(Literal)
-
💡 Primitive Type(원시 타입)과 Reference Type(참조 타입)
-
💡 Java 직렬화
-
💡 오버로딩과 오버라이딩
-
💡 다형성이란?
-
💡 상속이란?
-
💡 조합이란?
-
💡 interface vs abstract class
-
💡 final 키워드
💡 Java의 특징
1. 객체지향 언어이다.
2. 모든 객체를 new 하여 사용하고, 이 생성된 객체를 가비지 컬렉터가 별도의 로직을 거쳐 쓰지 않는 객체를 수거해간다.
3. Call By Value로 동작한다. ➔ 포인터 개념이 없음
4. 멀티스레드를 지원한다. ➔ 파이썬 같은 경우는 GIL 때문에 멀티스레드를 이용하도록 코드를 작성해도 실제로는 싱글스레드로 동작한다.
5. JVM(Java Virtual Machine) 위에서 실행되기 때문에 다양한 운영 체제에서 동일한 코드로 작동할 수 있음
💡 Java의 단점
1. 느리다.
(이유)
모든 객체를 new 하고, 이를 GC가 관리하는데 GC가 사용될 때 Stop the world가 발동한다
* Stop the world란? GC가 동작할때 GC를 제외한 모든 스레드가 동작을 멈추는 것
💡 Java의 실행과정과 JVM 구조

💡 Java의 실행과정
1. 자바 프로그램을 실행하면 OS로 부터 JVM이 메모리 할당 받음
2. 자바 컴파일러(javac)가 자바 소스 코드(.java)를 자바 Byte 코드(.class)로 컴파일한다.
3. Class Loader는 동적 로딩을 통해 필요한 클래스들을 로딩, 링크하여 Runtime Data Area(실질적인 메모리를 할당 받아 관리하는 공간)에 올린다.
4. Runtime Data Area에 올라간 바이트 코드는 Execution Engine(실행 엔진)가 해석한다.
5. 실행 과정 속에서 JVM은 필요에 따라 GC와 같은 관리 작업을 수행한다.
* 컴파일이란? 코드를 기계어(101000)로 변환하는것
* 동적 로딩이란? 프로그램이 실행 중에 필요한 클래스나 리소스를 메모리에 필요한 시점에 동적으로 로딩하는 방식
* 링크란? 클래스 파일을 사용하기 위해 검증하는 과정

💡JVM의 구조 (Class Loader, Runtime Data Area, Execution Engine)
1. Class Loader : JVM으로 클래스를 로드하고, 링크를 통해 배치 (Loading → Linking → Initialization)
1. Loading : 런타임 데이터 영역에 클래스를 저장
(종류)
- Bootstrap Class Loader : 최초로 실행되는 클래스 로더로 자바 클래스를 로드 할수 있는 최소한의 자바 클래스를 로드
(java.lang.Object, java.lang.Class등..)
- Extension Class Loader : 확장 자바 클래스를 로드
- Application Class Loader : 우리가 만든 .class 확장자 파일을 로드
2. Linking : 클래스 파일을 검증, 준비, 해석
3. Initialization : 클래스 변수 값들을 적절한 값으로 초기화
2. Execution Engine : 실행 엔진은 클래스 로더를 통해 런타임 데이터 영역에 배치된 바이트 코드를 명령어 단위로 읽어서 실행
- 인터프리터 방식 : 바이트 코드 명령어를 하나씩 읽고, 바로 실행
- JIT (Just In Time) 방식 : 자주 사용되는 코드의 바이트 코드 전체를 컴파일하여 Native Code 로 변경하고, 이를 인터프리팅 하지 않고 네이티브 코드로 직접 실행
- GC : Heap 메모리 영역에서 더이상 사용하지 않는 메모리를 자동 회수
☕ 가비지 컬렉션 동작 원리 & GC 종류 💯 총정리
Garbage Collection(GC) 이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객
inpa.tistory.com
3. Runtime Data Area : JVM의 메모리 영역

* Method Area, Heap Area 는 모든 쓰레드(Thread)가 공유하는 영역, Stack Area, PC Register, Native Method Stack 은 각 쓰레드 마다 생성되는 개별 영역
- Method Area : JVM에서 읽은 상수 풀, 메서드 코드, 필드, Static 변수와 같은 정적인 데이터, 클래스 구조 저장
- Heap Area : 객체와 배열이 저장, 동적으로 생성된 데이터 저장, GC가 사용되지 않는 객체 정리, 힙 영역은 크게 Young Generation, Old Generation, Permanent Generation으로 나뉨
- Stack Area : 메서드 호출 시 임시적으로 생성되는 지역 변수, 매개 변수, 리턴 값 등을 저장
- PC Register : 현재 실행 중인 JVM 명령어의 주소를 저장.
- Native Method Stack : 자바 외부 언어(예: C, C++)로 작성된 네이티브 코드를 실행할 때 사용되는 스택.
💡 Java ByteCode란?
자바 바이트 코드 (.class)는 자바 컴파일러(javac)가 .java 파일을 컴파일 하여 만든 코드로 기계가 바로 수행할수 있는 언어가 아닌 가상 머신이 이해할 수 있는 중간 레벨로 컴파일 된 코드이다.
💡Java 버전 별 차이점
Java 8
- 람다 표현식 제공 : 함수형 스타일 코드 작성 가능
- Stream API 제공 : 컬렉션 데이터를 함수형으로 처리 가능
- Optional : NPE 문제 감소
- LocalDateTime
Java 11
- var 키워드 : 지역변수에 대해 타입 추론 가능
- String 클래스 개선 : isBlank(), strip() 추가
- 파일 처리 개선 : writeString(), readString() 추가
Java 17
- Record 클래스 : 불변 데이터를 객체간 전달 하는 작업을 용이하게 만듬
- Sealed 클래스 : 클래스 계층 구조를 제한 ➔ 특정 클래스만 상속 가능하게 제한
- 텍스트 Block 기능 : 여러 줄의 문자열을 간단히 표현
String json = """
{
"name": "Alice",
"age": 30
}
""";
💡 JDK와 JRE
JDK (Java Develop Kit) : Java 프로그램을 개발하기 위해 필요한 도구 모음 ➔ Java 컴파일러, 디버깅 도구, JVM
JRE (Java Runtime Env) : Java 프로그램을 실행하기 위한 환경 ➔ 코드를 실행하려고만 한다면 JRE만 설치하면 됨
💡 동일성과 동등성
동일성 : 정확히 동일한 객체인지를 판단하는 개념 (객체가 메모리상에서 같은 주소)
동등성 : 값이나 내용이 동일한지 (내용이 같은지를 확인)
💡 equals()와 ==의 차이점
오버라이딩 된 equals()는 객체끼리의 값을 비교하고 ==는 주소를 비교한다.
equals()를 오버라이딩 한 대표적인 예시 (String)
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); // TRUE
System.out.println(str1==str2); // FALSE
➔ str1, str2는 각각 다른 객체로 다른 주소값을 가지므로 값이 같음에도 불구하고 ==로 비교를 하면 False가 출력된다.
* But String은 equals 메서드를 오버라이딩 하였기 때문에 위와 같은 결과가 나온다. 아무것도 처리 하지 않으면 주소를 비교한다.
💡 equals()와 hashcode()
(equals)
- 객체의 equals() 메서드를 재정의 하여 비교 로직을 처리하고, 객체끼리의 값을 비교할때 equals()로 비교한다.
- equals()는 Object 클래스에 있는 메서드로 모든 객체가 가지고 있는 메서드이다.
(hashcode)
- hashcode란 객체를 식별하는 고유한 정수 값
- hashcode()는 object 클래스의 메서드로 모든 객체가 가지고 있는 메서드다.
(equals() 외에 hashCode() 도 같이 재정의 해야하는 이유)
- 객체의 동등성과 해시 기반 컬렉션의 일관성을 보장하기 위함
- equals만 재정의 하면 equals() 비교 할땐 같은 객체라고 하는데, ==는 다른 객체라고 함
➔ HashTable 같은 자료구조에서 그 객체를 put한 상태에서 해당 객체가 저장된 버킷을 찾을 수 없다 (Hash 값을 Key로 잡기 때문)
💡 toString()이란?
- 객체에서 오버라이딩 하여 별도의 로직을 처리하고, 해당 객체를 출력했을때 별도의 로직이 실행되어 출력된다.
- Default로는 쓰레기 값이 출력된다. (클래스이름@16진수해시코드)
💡 자바에서 메인 메서드는 왜 static으로 정의 되어 있을까?
- static 키워드를 추가하면 메서드가 힙 영역이 아닌 메서드 영역에 저장된다.
- main 메서드는 자바 프로그램의 시작점인데, 프로그램의 실행 직후에는 어떠한 객체도 존재 하지 않는다. 그래서 static이 붙지 않는다면 런타임 시작 시점에 메서드를 실행할 객체가 없어서 메서드 실행(run)이 불가능하다.
public class ZarinattaCrawlerApplication {
// 시작 시점엔 이 클래스가 생성되기 전인 것
public static void main(String[] args) {
SpringApplication.run(ZarinattaCrawlerApplication.class, args);
}
}
💡 상수(Constant)와 리터럴(Literal)
- 상수는 변하지 않는 변수 (final)
- 리터럴은 변하지 않는 데이터
final int i = 10; // i는 상수
String str = "JunHyuk"; // 여기서 "JunHyuk"은 리터럴
💡 Primitive Type(원시 타입)과 Reference Type(참조 타입)
(원시 타입)
- int, long, double, float, boolean, byte, short, char과 같은 기본 자료형
- Stack 영역에 저장됨
- null을 담을수 없음- 제네릭에 사용 불가능- 조금 더 빠름
(참조 타입)
- 문자열, 배열과 같은 Java에서 최상위 클래스인 java.lang.Object 클래스를 상속하는 모든 클래스
- 힙 메모리에 객체를 저장하고 스택 메모리에는 그 참조를 저장
- 복잡한 데이터 구조와 대규모 데이터 처리에 유리하게 사용
💡 Java 직렬화
- 직렬화란 외부 시스템에서 사용할 수 있도록 바이트 형태로 데이터를 변환하는 기술 (객체 ➔ Json)
- 그렇다면 Java 직렬화는 자바언어에서 사용되는 Object를 다른 컴퓨터의 자바 시스템에서 사용할수 있도록 바이트 형태로 바꿈
- 바이트 형태로 바꾸어 파일, 네트워크를 통해 전송
💡 오버로딩과 오버라이딩
- 오버로딩은 같은 이름의 메서드를 한 클래스에서 여러개 정의 하는 것
- 오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의 하는 것 (흔히 보는 @Override)
💡 다형성이란?
- 하나의 부모 객체에 여러가지 자식 객체 타입을 대입할수 있는것
- 코드 재 사용성이 증가하고, 새로운 클래스가 추가되어도 기존 코드를 수정할 필요가 없다
- 다형성은 부모 - 자식 관계일때 부모를 상속받은 클래스가 많을 때 그 빛을 발함
// Animal 클래스와 각 동물 클래스가 상속관계가 있을때 배열 예제
Animal[] animalArr = new Animal[10];
animalArr[0] = new Tiger();
animalArr[1] = new Dog();
animalArr[2] = new Lion();
animalArr[3] = new Elephant();
💡 상속이란?
- 객체 들간의 관계를 구축하는것, 상위 클래스의 메서드나 필드를 하위 클래스에서 재사용 혹은 오버라이딩 가능
- IS-A 관계
- 클래스간 종속성이 생겨 유지보수가 힘들다.
- 잘 정의 된 상위 클래스의 메서드를 오버라이딩 하면 캡슐화가 깨진다
💡 조합이란?
- 객체가 다른 객체를 자신의 필드로 포함하는 것
- HAS-A 관계
- 상속보다 느슨한 결합
- 다형성과는 관계 X
💡 interface vs abstract class
- interface는 다중 상속이 가능하지만, abstract class는 다중 상속이 불가하다.
- interface는 모든 메서드가 암묵적으로 public이지만, abstract class는 접근 제어자를 자유롭게 사용할 수 있습니다
💡 final 키워드
- 변수에 붙일 경우, 1번만 초기화를 보장합니다.
- 메서드에 붙일 경우, 오버라이딩이 불가합니다.
- 클래스에 붙일 경우, 상속이 불가합니다.
(참고)
☕ JVM 내부 구조 & 메모리 영역 💯 총정리
저번 포스팅에서는 JRE / JDK / JVM에 대해서 간략하게 알아보는 시간을 가졌다면, 이번 포스팅에서는 JVM의 내부 구조에 대해 좀 더 자세하게 알아보도록 할 예정이다. JVM(자바 가상 머신)은 자바 언
inpa.tistory.com
'Java' 카테고리의 다른 글
[JAVA] 가비지 컬렉션 (2) | 2025.01.30 |
---|---|
[JAVA] 동시성 프로그래밍 (0) | 2025.01.24 |
[JAVA] 컬렉션 총정리 (0) | 2025.01.13 |
[JAVA] 문자열, 예외, 제네릭, 람다, 스트림, 어노테이션, 리플렉션 (0) | 2025.01.06 |
💡 Java의 특징
1. 객체지향 언어이다.
2. 모든 객체를 new 하여 사용하고, 이 생성된 객체를 가비지 컬렉터가 별도의 로직을 거쳐 쓰지 않는 객체를 수거해간다.
3. Call By Value로 동작한다. ➔ 포인터 개념이 없음
4. 멀티스레드를 지원한다. ➔ 파이썬 같은 경우는 GIL 때문에 멀티스레드를 이용하도록 코드를 작성해도 실제로는 싱글스레드로 동작한다.
5. JVM(Java Virtual Machine) 위에서 실행되기 때문에 다양한 운영 체제에서 동일한 코드로 작동할 수 있음
💡 Java의 단점
1. 느리다.
(이유)
모든 객체를 new 하고, 이를 GC가 관리하는데 GC가 사용될 때 Stop the world가 발동한다
* Stop the world란? GC가 동작할때 GC를 제외한 모든 스레드가 동작을 멈추는 것
💡 Java의 실행과정과 JVM 구조

💡 Java의 실행과정
1. 자바 프로그램을 실행하면 OS로 부터 JVM이 메모리 할당 받음
2. 자바 컴파일러(javac)가 자바 소스 코드(.java)를 자바 Byte 코드(.class)로 컴파일한다.
3. Class Loader는 동적 로딩을 통해 필요한 클래스들을 로딩, 링크하여 Runtime Data Area(실질적인 메모리를 할당 받아 관리하는 공간)에 올린다.
4. Runtime Data Area에 올라간 바이트 코드는 Execution Engine(실행 엔진)가 해석한다.
5. 실행 과정 속에서 JVM은 필요에 따라 GC와 같은 관리 작업을 수행한다.
* 컴파일이란? 코드를 기계어(101000)로 변환하는것
* 동적 로딩이란? 프로그램이 실행 중에 필요한 클래스나 리소스를 메모리에 필요한 시점에 동적으로 로딩하는 방식
* 링크란? 클래스 파일을 사용하기 위해 검증하는 과정

💡JVM의 구조 (Class Loader, Runtime Data Area, Execution Engine)
1. Class Loader : JVM으로 클래스를 로드하고, 링크를 통해 배치 (Loading → Linking → Initialization)
1. Loading : 런타임 데이터 영역에 클래스를 저장
(종류)
- Bootstrap Class Loader : 최초로 실행되는 클래스 로더로 자바 클래스를 로드 할수 있는 최소한의 자바 클래스를 로드
(java.lang.Object, java.lang.Class등..)
- Extension Class Loader : 확장 자바 클래스를 로드
- Application Class Loader : 우리가 만든 .class 확장자 파일을 로드
2. Linking : 클래스 파일을 검증, 준비, 해석
3. Initialization : 클래스 변수 값들을 적절한 값으로 초기화
2. Execution Engine : 실행 엔진은 클래스 로더를 통해 런타임 데이터 영역에 배치된 바이트 코드를 명령어 단위로 읽어서 실행
- 인터프리터 방식 : 바이트 코드 명령어를 하나씩 읽고, 바로 실행
- JIT (Just In Time) 방식 : 자주 사용되는 코드의 바이트 코드 전체를 컴파일하여 Native Code 로 변경하고, 이를 인터프리팅 하지 않고 네이티브 코드로 직접 실행
- GC : Heap 메모리 영역에서 더이상 사용하지 않는 메모리를 자동 회수
☕ 가비지 컬렉션 동작 원리 & GC 종류 💯 총정리
Garbage Collection(GC) 이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객
inpa.tistory.com
3. Runtime Data Area : JVM의 메모리 영역

* Method Area, Heap Area 는 모든 쓰레드(Thread)가 공유하는 영역, Stack Area, PC Register, Native Method Stack 은 각 쓰레드 마다 생성되는 개별 영역
- Method Area : JVM에서 읽은 상수 풀, 메서드 코드, 필드, Static 변수와 같은 정적인 데이터, 클래스 구조 저장
- Heap Area : 객체와 배열이 저장, 동적으로 생성된 데이터 저장, GC가 사용되지 않는 객체 정리, 힙 영역은 크게 Young Generation, Old Generation, Permanent Generation으로 나뉨
- Stack Area : 메서드 호출 시 임시적으로 생성되는 지역 변수, 매개 변수, 리턴 값 등을 저장
- PC Register : 현재 실행 중인 JVM 명령어의 주소를 저장.
- Native Method Stack : 자바 외부 언어(예: C, C++)로 작성된 네이티브 코드를 실행할 때 사용되는 스택.
💡 Java ByteCode란?
자바 바이트 코드 (.class)는 자바 컴파일러(javac)가 .java 파일을 컴파일 하여 만든 코드로 기계가 바로 수행할수 있는 언어가 아닌 가상 머신이 이해할 수 있는 중간 레벨로 컴파일 된 코드이다.
💡Java 버전 별 차이점
Java 8
- 람다 표현식 제공 : 함수형 스타일 코드 작성 가능
- Stream API 제공 : 컬렉션 데이터를 함수형으로 처리 가능
- Optional : NPE 문제 감소
- LocalDateTime
Java 11
- var 키워드 : 지역변수에 대해 타입 추론 가능
- String 클래스 개선 : isBlank(), strip() 추가
- 파일 처리 개선 : writeString(), readString() 추가
Java 17
- Record 클래스 : 불변 데이터를 객체간 전달 하는 작업을 용이하게 만듬
- Sealed 클래스 : 클래스 계층 구조를 제한 ➔ 특정 클래스만 상속 가능하게 제한
- 텍스트 Block 기능 : 여러 줄의 문자열을 간단히 표현
String json = """
{
"name": "Alice",
"age": 30
}
""";
💡 JDK와 JRE
JDK (Java Develop Kit) : Java 프로그램을 개발하기 위해 필요한 도구 모음 ➔ Java 컴파일러, 디버깅 도구, JVM
JRE (Java Runtime Env) : Java 프로그램을 실행하기 위한 환경 ➔ 코드를 실행하려고만 한다면 JRE만 설치하면 됨
💡 동일성과 동등성
동일성 : 정확히 동일한 객체인지를 판단하는 개념 (객체가 메모리상에서 같은 주소)
동등성 : 값이나 내용이 동일한지 (내용이 같은지를 확인)
💡 equals()와 ==의 차이점
오버라이딩 된 equals()는 객체끼리의 값을 비교하고 ==는 주소를 비교한다.
equals()를 오버라이딩 한 대표적인 예시 (String)
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); // TRUE
System.out.println(str1==str2); // FALSE
➔ str1, str2는 각각 다른 객체로 다른 주소값을 가지므로 값이 같음에도 불구하고 ==로 비교를 하면 False가 출력된다.
* But String은 equals 메서드를 오버라이딩 하였기 때문에 위와 같은 결과가 나온다. 아무것도 처리 하지 않으면 주소를 비교한다.
💡 equals()와 hashcode()
(equals)
- 객체의 equals() 메서드를 재정의 하여 비교 로직을 처리하고, 객체끼리의 값을 비교할때 equals()로 비교한다.
- equals()는 Object 클래스에 있는 메서드로 모든 객체가 가지고 있는 메서드이다.
(hashcode)
- hashcode란 객체를 식별하는 고유한 정수 값
- hashcode()는 object 클래스의 메서드로 모든 객체가 가지고 있는 메서드다.
(equals() 외에 hashCode() 도 같이 재정의 해야하는 이유)
- 객체의 동등성과 해시 기반 컬렉션의 일관성을 보장하기 위함
- equals만 재정의 하면 equals() 비교 할땐 같은 객체라고 하는데, ==는 다른 객체라고 함
➔ HashTable 같은 자료구조에서 그 객체를 put한 상태에서 해당 객체가 저장된 버킷을 찾을 수 없다 (Hash 값을 Key로 잡기 때문)
💡 toString()이란?
- 객체에서 오버라이딩 하여 별도의 로직을 처리하고, 해당 객체를 출력했을때 별도의 로직이 실행되어 출력된다.
- Default로는 쓰레기 값이 출력된다. (클래스이름@16진수해시코드)
💡 자바에서 메인 메서드는 왜 static으로 정의 되어 있을까?
- static 키워드를 추가하면 메서드가 힙 영역이 아닌 메서드 영역에 저장된다.
- main 메서드는 자바 프로그램의 시작점인데, 프로그램의 실행 직후에는 어떠한 객체도 존재 하지 않는다. 그래서 static이 붙지 않는다면 런타임 시작 시점에 메서드를 실행할 객체가 없어서 메서드 실행(run)이 불가능하다.
public class ZarinattaCrawlerApplication {
// 시작 시점엔 이 클래스가 생성되기 전인 것
public static void main(String[] args) {
SpringApplication.run(ZarinattaCrawlerApplication.class, args);
}
}
💡 상수(Constant)와 리터럴(Literal)
- 상수는 변하지 않는 변수 (final)
- 리터럴은 변하지 않는 데이터
final int i = 10; // i는 상수
String str = "JunHyuk"; // 여기서 "JunHyuk"은 리터럴
💡 Primitive Type(원시 타입)과 Reference Type(참조 타입)
(원시 타입)
- int, long, double, float, boolean, byte, short, char과 같은 기본 자료형
- Stack 영역에 저장됨
- null을 담을수 없음- 제네릭에 사용 불가능- 조금 더 빠름
(참조 타입)
- 문자열, 배열과 같은 Java에서 최상위 클래스인 java.lang.Object 클래스를 상속하는 모든 클래스
- 힙 메모리에 객체를 저장하고 스택 메모리에는 그 참조를 저장
- 복잡한 데이터 구조와 대규모 데이터 처리에 유리하게 사용
💡 Java 직렬화
- 직렬화란 외부 시스템에서 사용할 수 있도록 바이트 형태로 데이터를 변환하는 기술 (객체 ➔ Json)
- 그렇다면 Java 직렬화는 자바언어에서 사용되는 Object를 다른 컴퓨터의 자바 시스템에서 사용할수 있도록 바이트 형태로 바꿈
- 바이트 형태로 바꾸어 파일, 네트워크를 통해 전송
💡 오버로딩과 오버라이딩
- 오버로딩은 같은 이름의 메서드를 한 클래스에서 여러개 정의 하는 것
- 오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의 하는 것 (흔히 보는 @Override)
💡 다형성이란?
- 하나의 부모 객체에 여러가지 자식 객체 타입을 대입할수 있는것
- 코드 재 사용성이 증가하고, 새로운 클래스가 추가되어도 기존 코드를 수정할 필요가 없다
- 다형성은 부모 - 자식 관계일때 부모를 상속받은 클래스가 많을 때 그 빛을 발함
// Animal 클래스와 각 동물 클래스가 상속관계가 있을때 배열 예제
Animal[] animalArr = new Animal[10];
animalArr[0] = new Tiger();
animalArr[1] = new Dog();
animalArr[2] = new Lion();
animalArr[3] = new Elephant();
💡 상속이란?
- 객체 들간의 관계를 구축하는것, 상위 클래스의 메서드나 필드를 하위 클래스에서 재사용 혹은 오버라이딩 가능
- IS-A 관계
- 클래스간 종속성이 생겨 유지보수가 힘들다.
- 잘 정의 된 상위 클래스의 메서드를 오버라이딩 하면 캡슐화가 깨진다
💡 조합이란?
- 객체가 다른 객체를 자신의 필드로 포함하는 것
- HAS-A 관계
- 상속보다 느슨한 결합
- 다형성과는 관계 X
💡 interface vs abstract class
- interface는 다중 상속이 가능하지만, abstract class는 다중 상속이 불가하다.
- interface는 모든 메서드가 암묵적으로 public이지만, abstract class는 접근 제어자를 자유롭게 사용할 수 있습니다
💡 final 키워드
- 변수에 붙일 경우, 1번만 초기화를 보장합니다.
- 메서드에 붙일 경우, 오버라이딩이 불가합니다.
- 클래스에 붙일 경우, 상속이 불가합니다.
(참고)
☕ JVM 내부 구조 & 메모리 영역 💯 총정리
저번 포스팅에서는 JRE / JDK / JVM에 대해서 간략하게 알아보는 시간을 가졌다면, 이번 포스팅에서는 JVM의 내부 구조에 대해 좀 더 자세하게 알아보도록 할 예정이다. JVM(자바 가상 머신)은 자바 언
inpa.tistory.com
'Java' 카테고리의 다른 글
[JAVA] 가비지 컬렉션 (2) | 2025.01.30 |
---|---|
[JAVA] 동시성 프로그래밍 (0) | 2025.01.24 |
[JAVA] 컬렉션 총정리 (0) | 2025.01.13 |
[JAVA] 문자열, 예외, 제네릭, 람다, 스트림, 어노테이션, 리플렉션 (0) | 2025.01.06 |