4. JVM의 메모리 구조

JVM은 메모리를 용도에 따라 5개의 부분으로 나누어 관리함.
- Register
- 프로그램의 실행 포인터에 대한 정보를 저장하고 관리.
- 프로그램에서 건드릴 수 없는 영역.
- Runtime Constant Pool
- 상수 값이 들어가는 pool
- Method area
- Class 자체에 대한 정보가 들어가 있는 공간. ex) Method에 대한 정보가 들어가 있음
- Class안에 정의된 Method에 대한 실행 코드도 들어가 있다.
- (Class가 처음 사용되는 시점. 딱 1번 실행되는 순간 메모리에 올라감)
- Heap area
- Instance가 생성되는 메모리 공간. instance variable의 공간이 생성됨
- Method를 호출할 수 있는 실행 Pointer도 있다.
- Call stack
- Stack은 메소드가 호출되면 stack 영역에 해당 메소드를 위한 공간이 생성된다
- Ex) 메서드 안의 지역 변수
- Method가 끝나면 해당 영역은 pop되어 없어지고, 안에 있는 지역 변수 역시 공간이 날아간다.
static
: class variable.- 공간 자체가 method area에 만들어져, class 자체에서 사용할 수 있다.
- 인스턴스를 만들지 않고도 사용할 수 있다.
- 모든 instance가 공유할 수 있다. 하지만 나중에 수정할 때 어려움이 있다.

- class에 대한 정보가 올라감. static을 파악. → 1번 출력
- main을 찾음 → 4번 출력 , 5번 출력
- 생성자 호출 ( 인스턴스의 초기화를 한다 → 공간이 필요 →class 정보를 들고와서 instance variable을 만듬 ) b 공간 만듬 , 2번 출력, 3번 출력
- 만들고 결과값을 넣어야 함.
this : 현재 자신이 사용하고 있는 레퍼런스
5. Method Overloading
- 사용하는 방법에 따라 기능이 달라짐.
+
: 숫자를 더하는 기호“문자열”+10
⇒ 문자열을 연결하는 기호로 의미가 변한다.
- Method의 이름이 똑같다. 하지만 사용하는 방법이 다르다 → 인자가 다르다. 다른 메서드로 구별
생성자 오버로딩
- 이 규칙이 생성자에도 동일하게 적용됨. 따라서 하나의 클래스 안에는 여러개의 생성자가 존재할 수 있다.
- 여러개의 생성자를 이용하는 이유는 각기 다른 방식으로 인스턴스를 초기화할 필요가 있기 때문에.
6. package 와 import
- package는 클래스를 용도별로, 종류별로 묶어주는 논리적인 단위. 유지보수와 재활용성을 높이기 위해서 서로 관련있는 클래스를 묶어서 관리함. 물리적으로는 package이름으로 되어있는 폴더를 만들어서 그 안에 클래스를 저장한다.
- 다른 package안에 있는 클래스를 가져다 쓸 때
import
- 자바코드는 맨 위에 거의 예외없이 package구문이 나온다.
- 만약 package구문을 사용하지 않으면 클래스는 default package라는 걸로 묶이게 된다.
- package는 계층구조로 사용할 수 있다. 이 계층 구조를 표현할 때
.
을 이용한다.
7. Access Modifier (접근 제어자)
public
: 이 키워드는 필드 앞, Method 앞, 생성자 앞, Class 앞에 붙을 수 있다.- package에 상관 없이 자유롭게 access 할 수 있다.
private
: field , method, constructor 앞에 붙을 수 있다.- 해당 요소를 같은 class 안에서만 접근 가능하도록 선언
- constructor앞에 private를 붙힌다 → single ton 패턴으로 만들 때.
- 필드는 대부분 private으로 잡는다.
- default access modifier : 키워드가 적혀있지 않은 접근 제어자.
- 같은 패키지의 다른 클래스에 의해서만 사용할 수 있다.
protected
class는 객체가 가지고 있는 특징, 기능을 하나의 단위로 묶어 놓은 개념.
→ 캡슐화 (Encapsulation) class가 encapsulation한 결과.
이런 클래스 안에는 값과 기능이 들어있다.
다른 클래스에서 정보를 건드리지 못하게 하는 개념 → 정보은닉 information hiding
⇒ 클래스 내부에서만 값을 수정할 수 있고, 외부에서 변경할 수 없도록 데이터를 보호.
- 자바 언어에서는 이 개념을 access modifier로 구현해 놓고 있다.
- 외부에서 private로 설정된 값을 알아가거나 설정하기 위해서 특수한 형태의 method를 이용하게 되는데 getter setter라고 한다.
8. static block
- class가 로드된 후 바로 수행되는 코드 block. main보다 먼저 실행된다.
- 프로그램에 필요한 리소스를 땡겨올 때 사용
9. Inheritance (상속)
- 상속은 부모 클래스가 가지고 있는 내용을 자식 class가 물려받는 개념.
- 그래서 매번 class를 작성할 때 처음부터 작성하는 것이 아니라, 기존 클래스를 확장해서 작성하는 개념이다.
- 클래스에 계층 구조도가 생긴다
- 부모 class, parent class, upper class, super class
- 자식 클래스, child class, sub class
- 확장시키기 때문에 자식 클래스가 더 크다.

- 코드 중복이 많이 일어난다 → 공통의 코드를 parent class로 만든다.

- 상속받은 클래스 방향으로 화살표
- 상속 표현
- keyword :
extends
- keyword :
- 자바는 단일 상속만 지원한다. ( 한번에 여러개의 클래스로부터 상속받지 못한다 )
- 상속은 항상 좋은가? ⇒ 클래스간의 밀접도가 올라간다. → 클래스를 재활용 할 때 문제.
package test;
public class SuperClass {
int a = 100;
String b = "여기는 super class";
public SuperClass() {
}
public void myFunc(){
System.out.println("super");
}
}
package test;
public class SubClass extends SuperClass{
// private은 상속에 안들어간다.
// 생성자도 상속에 안들어감.
int c = 500;
public SubClass() {
super();
}
}
- java에서 나오는 모든 클래스는 상속관계에 있다.
- Object 클래스를 상속함
상속
- Object 클래스를 상속함
- 인스턴스를 만들면 상위 클래스의 인스턴스부터 만든다 . →
super
사용. 상위 클래스의 constructor 호출- Object까지 다 만든다.
is-a relationship
- Sub Class is a Super Class
Polymorphism
다형성. 여러가지 형태로 이용할 수 있다. - ⇒ sub class는 super class와 같으니까 sub class를 써야하는 자리에 super class를 사용할 수 있다.
- ex) 포유류, 사람
- 사람 is a 포유류 ( O )
- 포유류 is a 사람( X )
같은 객체를 reference variable 의 type을 변경시킴으로 인해 다른 형태로 객체를 사용하는 방법.
10. Overriding (method)
- 상속해서 다시 정의해서 쓰는것.
- 하위 클래스에서 상속받은 상위클래스의 method를 재정의해서 사용하는 방법
- field를 재정의시 공간을 따로 만들어 사용. (Over shadow)
- method는 오버라이딩 되어있을 경우 오버라이딩 된 걸로 찾아간다.
dynamic binding
- field는 그렇지 않다.^^
11. this, super, this(), super()
this
: 현재 사용하고 있는 객체에 대한 referencesuper
: 현재 사용하고 있는 객체에 대한 reference . type은 상위 타입.
super()
: 상위 클래스의 생성자를 호출하는 구문this()
: 내가 가진 해당 클래스의 다른 생성자( 인자의 개수나 타입이 다른 ) 를 호출.
12. Quiz
- 다음 코드의 출력 순서를 맞춰보시오.

- 상위 클래스를 먼저 호출 → SuperClass의 static 호출 →
2번문장
- 이후 int d →
7번 문장
- main 메서드 동작 →
10번 문장
- Exam01의 생성자 호출 → 상위 클래스의 생성자 호출 → 상위 클래스의 인스턴스 초기화를 위해 필드 호출 →
1번 문장
- super(100)이 있으니 SuperClass(100)으로 들어감. → this() →
3번 문장
,4번 문장
- 상위 생성자 호출 후 인스턴스 초기화 → int c
6번문장
- staticCall
8번문장
- super.myFunc → 오버라이딩 되어있으나 아직 Exam01의 객체가 완성이 되지 않음. → 해당 인스턴스의 메서드가 만들어지지 않은 상태임 → super의 myFunc를 불러옴 →
5번 문장
- obj.myFunc에서 @Override되어 있으니
9번 문장
정답 : 2-7-10-1-3-4-6-8-5-9
'Java' 카테고리의 다른 글
Java 기본 Class (0) | 2024.04.04 |
---|---|
Java 객체지향 3 (0) | 2024.04.04 |
JAVA 예외처리, Thread (0) | 2024.04.04 |
인프런 워밍업 클래스 5일차 과제 (0) | 2024.02.23 |
Lambda란 무엇일까? (0) | 2024.02.22 |
4. JVM의 메모리 구조

JVM은 메모리를 용도에 따라 5개의 부분으로 나누어 관리함.
- Register
- 프로그램의 실행 포인터에 대한 정보를 저장하고 관리.
- 프로그램에서 건드릴 수 없는 영역.
- Runtime Constant Pool
- 상수 값이 들어가는 pool
- Method area
- Class 자체에 대한 정보가 들어가 있는 공간. ex) Method에 대한 정보가 들어가 있음
- Class안에 정의된 Method에 대한 실행 코드도 들어가 있다.
- (Class가 처음 사용되는 시점. 딱 1번 실행되는 순간 메모리에 올라감)
- Heap area
- Instance가 생성되는 메모리 공간. instance variable의 공간이 생성됨
- Method를 호출할 수 있는 실행 Pointer도 있다.
- Call stack
- Stack은 메소드가 호출되면 stack 영역에 해당 메소드를 위한 공간이 생성된다
- Ex) 메서드 안의 지역 변수
- Method가 끝나면 해당 영역은 pop되어 없어지고, 안에 있는 지역 변수 역시 공간이 날아간다.
static
: class variable.- 공간 자체가 method area에 만들어져, class 자체에서 사용할 수 있다.
- 인스턴스를 만들지 않고도 사용할 수 있다.
- 모든 instance가 공유할 수 있다. 하지만 나중에 수정할 때 어려움이 있다.

- class에 대한 정보가 올라감. static을 파악. → 1번 출력
- main을 찾음 → 4번 출력 , 5번 출력
- 생성자 호출 ( 인스턴스의 초기화를 한다 → 공간이 필요 →class 정보를 들고와서 instance variable을 만듬 ) b 공간 만듬 , 2번 출력, 3번 출력
- 만들고 결과값을 넣어야 함.
this : 현재 자신이 사용하고 있는 레퍼런스
5. Method Overloading
- 사용하는 방법에 따라 기능이 달라짐.
+
: 숫자를 더하는 기호“문자열”+10
⇒ 문자열을 연결하는 기호로 의미가 변한다.
- Method의 이름이 똑같다. 하지만 사용하는 방법이 다르다 → 인자가 다르다. 다른 메서드로 구별
생성자 오버로딩
- 이 규칙이 생성자에도 동일하게 적용됨. 따라서 하나의 클래스 안에는 여러개의 생성자가 존재할 수 있다.
- 여러개의 생성자를 이용하는 이유는 각기 다른 방식으로 인스턴스를 초기화할 필요가 있기 때문에.
6. package 와 import
- package는 클래스를 용도별로, 종류별로 묶어주는 논리적인 단위. 유지보수와 재활용성을 높이기 위해서 서로 관련있는 클래스를 묶어서 관리함. 물리적으로는 package이름으로 되어있는 폴더를 만들어서 그 안에 클래스를 저장한다.
- 다른 package안에 있는 클래스를 가져다 쓸 때
import
- 자바코드는 맨 위에 거의 예외없이 package구문이 나온다.
- 만약 package구문을 사용하지 않으면 클래스는 default package라는 걸로 묶이게 된다.
- package는 계층구조로 사용할 수 있다. 이 계층 구조를 표현할 때
.
을 이용한다.
7. Access Modifier (접근 제어자)
public
: 이 키워드는 필드 앞, Method 앞, 생성자 앞, Class 앞에 붙을 수 있다.- package에 상관 없이 자유롭게 access 할 수 있다.
private
: field , method, constructor 앞에 붙을 수 있다.- 해당 요소를 같은 class 안에서만 접근 가능하도록 선언
- constructor앞에 private를 붙힌다 → single ton 패턴으로 만들 때.
- 필드는 대부분 private으로 잡는다.
- default access modifier : 키워드가 적혀있지 않은 접근 제어자.
- 같은 패키지의 다른 클래스에 의해서만 사용할 수 있다.
protected
class는 객체가 가지고 있는 특징, 기능을 하나의 단위로 묶어 놓은 개념.
→ 캡슐화 (Encapsulation) class가 encapsulation한 결과.
이런 클래스 안에는 값과 기능이 들어있다.
다른 클래스에서 정보를 건드리지 못하게 하는 개념 → 정보은닉 information hiding
⇒ 클래스 내부에서만 값을 수정할 수 있고, 외부에서 변경할 수 없도록 데이터를 보호.
- 자바 언어에서는 이 개념을 access modifier로 구현해 놓고 있다.
- 외부에서 private로 설정된 값을 알아가거나 설정하기 위해서 특수한 형태의 method를 이용하게 되는데 getter setter라고 한다.
8. static block
- class가 로드된 후 바로 수행되는 코드 block. main보다 먼저 실행된다.
- 프로그램에 필요한 리소스를 땡겨올 때 사용
9. Inheritance (상속)
- 상속은 부모 클래스가 가지고 있는 내용을 자식 class가 물려받는 개념.
- 그래서 매번 class를 작성할 때 처음부터 작성하는 것이 아니라, 기존 클래스를 확장해서 작성하는 개념이다.
- 클래스에 계층 구조도가 생긴다
- 부모 class, parent class, upper class, super class
- 자식 클래스, child class, sub class
- 확장시키기 때문에 자식 클래스가 더 크다.

- 코드 중복이 많이 일어난다 → 공통의 코드를 parent class로 만든다.

- 상속받은 클래스 방향으로 화살표
- 상속 표현
- keyword :
extends
- keyword :
- 자바는 단일 상속만 지원한다. ( 한번에 여러개의 클래스로부터 상속받지 못한다 )
- 상속은 항상 좋은가? ⇒ 클래스간의 밀접도가 올라간다. → 클래스를 재활용 할 때 문제.
package test;
public class SuperClass {
int a = 100;
String b = "여기는 super class";
public SuperClass() {
}
public void myFunc(){
System.out.println("super");
}
}
package test;
public class SubClass extends SuperClass{
// private은 상속에 안들어간다.
// 생성자도 상속에 안들어감.
int c = 500;
public SubClass() {
super();
}
}
- java에서 나오는 모든 클래스는 상속관계에 있다.
- Object 클래스를 상속함
상속
- Object 클래스를 상속함
- 인스턴스를 만들면 상위 클래스의 인스턴스부터 만든다 . →
super
사용. 상위 클래스의 constructor 호출- Object까지 다 만든다.
is-a relationship
- Sub Class is a Super Class
Polymorphism
다형성. 여러가지 형태로 이용할 수 있다. - ⇒ sub class는 super class와 같으니까 sub class를 써야하는 자리에 super class를 사용할 수 있다.
- ex) 포유류, 사람
- 사람 is a 포유류 ( O )
- 포유류 is a 사람( X )
같은 객체를 reference variable 의 type을 변경시킴으로 인해 다른 형태로 객체를 사용하는 방법.
10. Overriding (method)
- 상속해서 다시 정의해서 쓰는것.
- 하위 클래스에서 상속받은 상위클래스의 method를 재정의해서 사용하는 방법
- field를 재정의시 공간을 따로 만들어 사용. (Over shadow)
- method는 오버라이딩 되어있을 경우 오버라이딩 된 걸로 찾아간다.
dynamic binding
- field는 그렇지 않다.^^
11. this, super, this(), super()
this
: 현재 사용하고 있는 객체에 대한 referencesuper
: 현재 사용하고 있는 객체에 대한 reference . type은 상위 타입.
super()
: 상위 클래스의 생성자를 호출하는 구문this()
: 내가 가진 해당 클래스의 다른 생성자( 인자의 개수나 타입이 다른 ) 를 호출.
12. Quiz
- 다음 코드의 출력 순서를 맞춰보시오.

- 상위 클래스를 먼저 호출 → SuperClass의 static 호출 →
2번문장
- 이후 int d →
7번 문장
- main 메서드 동작 →
10번 문장
- Exam01의 생성자 호출 → 상위 클래스의 생성자 호출 → 상위 클래스의 인스턴스 초기화를 위해 필드 호출 →
1번 문장
- super(100)이 있으니 SuperClass(100)으로 들어감. → this() →
3번 문장
,4번 문장
- 상위 생성자 호출 후 인스턴스 초기화 → int c
6번문장
- staticCall
8번문장
- super.myFunc → 오버라이딩 되어있으나 아직 Exam01의 객체가 완성이 되지 않음. → 해당 인스턴스의 메서드가 만들어지지 않은 상태임 → super의 myFunc를 불러옴 →
5번 문장
- obj.myFunc에서 @Override되어 있으니
9번 문장
정답 : 2-7-10-1-3-4-6-8-5-9
'Java' 카테고리의 다른 글
Java 기본 Class (0) | 2024.04.04 |
---|---|
Java 객체지향 3 (0) | 2024.04.04 |
JAVA 예외처리, Thread (0) | 2024.04.04 |
인프런 워밍업 클래스 5일차 과제 (0) | 2024.02.23 |
Lambda란 무엇일까? (0) | 2024.02.22 |