유튜브에 올라와 있는 Java 강의들과 요즘 핫한 UDEMY Java강의를 듣다가 온 나무소리의 Java강의 코딩하는 문장의 의미를 알 수 있어 오아시스와 같은 강의입니다. 처음 들어서 이해가 완벽하지는 않지만 반복해서 듣다보면 완전히 나의 것으로 소화할 수 있겠다는 확신을 심어주는 강의입니다. 나무소리 정말 감사합니다.
개발자 지망생입니다. 데이터 segment 와 code segment 부분이 계속 궁금했었는데 속 시원히 해결됬어요. 너무 감사합니다. 그러면 모든 클래스들의 필드들은 코드 세그먼트에 바이트 코드들로 올라갔다가 호출하게 되면 힙, 스택에 데이터형에 따라서 불러드리는거군요
static 영역의 Code segment에는 Byte Code 그 자체가 올라가는 것으로 이해하시면 됩니다. 클래스들의 필드들은 Heap 영역에 할당이 될것이고, static 키워드가 붙은 경우는 잘 아시는 것처럼 static 영역(Data segment)에 할당이 되고, 메소드 내에 선언되는 모든 지역 변수들은 stack 영역에 할당 됩니다.^^
Java 메모리 모델 Java의 JVM이 관리하는 메모리 공간은 크게 3가지 영역으로 나눌 수 있다. 스택 영역(Stack Area) : 지역 변수(Local Variable), 매개 변수(Parameter)가 할당되는 영역. 초기화가 진행되지 않음 힙 영역(Heap Area) : 배열과 모든 인스턴스 객체가 할당되는 영역. 자동 초기화 진행 ---> 모든 객체는 힙 영역에 할당된다. 스태틱 영역(Static Area) or 메소드 영역 : 메소드의 바이트 코드, static 변수 할당 + Static Area Data segment : Static 키워드가 붙은 데이터가 위치한다. Code segment : 클래스와 메서드를 정의했을 때 모든 코드는 여기에 들어간다. 프로그램 실행 시 여기의 코드를 읽어서 실행된다. 좋은 강의 감사합니다!
newAccount는 참조형 데이터 타입이기 때문에 4byte입니다. Account 클래스의 인스턴스 객체는 Heap 영역에 잡히는 객체로 다른 크기의 메모리를 할당 받습니다. 인스턴스 객체의 정보를 담는 참조형 변수로 선언된 newAccount 변수가 4byte라는 것입니다.^^
선생님 강의 잘듣고 있습니다. 감사합니다. 질문이 있어 문의드려요 public class question { public static void main(String[] args) { Person p1 = new Person("질문", 20); p1.getName(); getAge(); } public static void getAge() { Person p3 = new Person("질문2",30);
} } class Person{ String name; int age;
Person(String name, int age){ this.name = name; this.age = age;
}
public void getName() {
Person p2 = new Person("가나다",20); // Person2 생성 System.out.println(this.name);
} } 예를 들어 이런식으로 코드가 있다고 하면 질문 2개 여쭤봅니다 1. main쓰레드 안에 P1,P2가 같은 Heap영역안에 존재하는 건가요? 2. main쓰레드와 getAge()는 서로 각각 stack과 heap영역을 가지고 있는 건가요?
우선 간단히 설명드리면 new 동적 할당자를 이용해 생성된 인스턴스 객체는 모두 Heap 영역에 할당 됩니다. 따라서 질문 주신 p1, p2가 참조하는 인스턴스 객체는 Heap 영역에 할당 됩니다. 그리고 각 객체를 참조하는 p1, p2 참조 변수는 메소드 내에 선언된 지역 변수이기 때문에 stack에 잡히게 되겠죠.. 2번 질문의 의미를 제가 잘 이해하고 있는지 모르겠습니다. 다만, 제가 강의에서 메모리 영역에 대한 설명을 진행할 때 static, stack, heap 영역을 구분하는 그림을 그리고 설명드리는 부분은 이해를 돕기 위한 논리적인 설명입니다. 실제 특정 메소드가 각 메모리를 갖는다는 의미는 아닙니다. 특정 시점에 프로그램의 흐름에 따라 특정 메소드가 호출이 될 것이고, 그 메소드 내부에 지역 변수가 할당되어 있다면 그 변수는 stack에 할당 되어 있는 것이고, 인스턴스 객체는 모두 heap 영역에 잡혀 있겠죠. 인스턴스 객체의 참조 정보를 해당 메소드 내부에서 참조 하고 있다면 그 객체에 접근할 수 있게 되는 것이구요.
선생님 안녕하세요 좋은 강의 올려주신 덕분에 많은 도움이 되는 것 같습니다 다름이 아니라 질문을 드려도 되겠습니까? 익명클래스와 메모리 구조에 대한 질문입니다 ( 소스코드는 선생님의 함수형 프로그래밍 강의에서 가져왔습니다 ruclips.net/video/WzeqIkaETbs/видео.html ) 아래처럼 이렇게 익명클래스를 만들어서 익명객체를 1개 만들 경우에 result = service.searchCunstomers(new SearchFilter() {
익명클래스는 다시 사용되지 않기에 가비지 컬렉터가 메모리를 회수한다는데, 제가 이해하기로는 가비지 컬렉터가 회수하는 영역은 Heap 영역인 것으로 알고 있습니다 그렇다면 익명클래스가 말 그대로 클래스이기에 Static 영역까지 차지한다면, 가비지 컬렉터가 Static 영역까지 메모리 해제를 도와주는 것인지 궁금합니다
우선 우리가 작성하는 모든 코드 그 자체는 static 영역에 잡히게 됩니다. static 영역은 Code segment와 Data segment로 나뉘게 되는데 Data segment에는 static 키워드가 붙은 변수들이 잡히게 되는 것이죠.(상수는 당연히 static 영역에...) Code Segment에 바로 우리가 작성한 코드 그 자체가 담긴다고 이해하시면 되며, Heap 영역은 인스턴스 객체가 담기게 됩니다. 즉, 생성된 객체가 Heap 영역에 잡히게 되는 것이죠. 즉, 질문 주신 내용에 답은 작성된 모든 코드 자체는 static의 code segment 영역에 담겨 있고, 익명 클래스의 경우, 코드를 예로 들면 new SearchFilter() 코드가 호출되는 시점에 Heap 영역에 잡히게 됩니다.
유튜브에 올라와 있는 Java 강의들과 요즘 핫한 UDEMY Java강의를 듣다가 온 나무소리의 Java강의
코딩하는 문장의 의미를 알 수 있어 오아시스와 같은 강의입니다.
처음 들어서 이해가 완벽하지는 않지만 반복해서 듣다보면 완전히 나의 것으로 소화할 수 있겠다는 확신을 심어주는 강의입니다.
나무소리 정말 감사합니다.
stack과 heap 메모리의 차이에 대해서 잘 들었습니다. 감사합니다.
최고의 자바 강의입니다!
heap 자동초기화가 이루어짐,
훌륭한 강의 감사합니다
메모리 구조 강의 잘 들었습니다~!
개발자 지망생입니다. 데이터 segment 와 code segment 부분이 계속 궁금했었는데 속 시원히 해결됬어요. 너무 감사합니다. 그러면 모든 클래스들의 필드들은 코드 세그먼트에 바이트 코드들로 올라갔다가 호출하게 되면 힙, 스택에 데이터형에 따라서 불러드리는거군요
static 영역의 Code segment에는 Byte Code 그 자체가 올라가는 것으로 이해하시면 됩니다.
클래스들의 필드들은 Heap 영역에 할당이 될것이고, static 키워드가 붙은 경우는 잘 아시는 것처럼 static 영역(Data segment)에 할당이 되고, 메소드 내에 선언되는 모든 지역 변수들은 stack 영역에 할당 됩니다.^^
좋은 강의 감사드립니다.
강의 정말 좋습니다 감사합니다
Java 메모리 모델
Java의 JVM이 관리하는 메모리 공간은 크게 3가지 영역으로 나눌 수 있다.
스택 영역(Stack Area) : 지역 변수(Local Variable), 매개 변수(Parameter)가 할당되는 영역. 초기화가 진행되지 않음
힙 영역(Heap Area) : 배열과 모든 인스턴스 객체가 할당되는 영역. 자동 초기화 진행 ---> 모든 객체는 힙 영역에 할당된다.
스태틱 영역(Static Area) or 메소드 영역 : 메소드의 바이트 코드, static 변수 할당
+
Static Area
Data segment : Static 키워드가 붙은 데이터가 위치한다.
Code segment : 클래스와 메서드를 정의했을 때 모든 코드는 여기에 들어간다. 프로그램 실행 시 여기의 코드를 읽어서 실행된다.
좋은 강의 감사합니다!
무엇보다 중요한것
선생님 필드와 지역변수의 차이가, 클래스에 있으면 필드이고 메소드에 있으면 지역변수인건가요?
답이 많이 늦었습니다. 클래스의 속성으로 지정하는 변수를 필드(Field)라고 하고 메소드 내부에 정의하는 변수들을 지역변수(Local Variable)라고 합니다.
좋은 강의 감사합니다!.
혹시 질문을 드려도 될까요?
main에 newAccount 는 왜 4byte일까요? Account라는 클래스가 4byte인가요?
newAccount는 참조형 데이터 타입이기 때문에 4byte입니다. Account 클래스의 인스턴스 객체는 Heap 영역에 잡히는 객체로 다른 크기의 메모리를 할당 받습니다.
인스턴스 객체의 정보를 담는 참조형 변수로 선언된 newAccount 변수가 4byte라는 것입니다.^^
선생님 강의 잘듣고 있습니다. 감사합니다. 질문이 있어 문의드려요
public class question {
public static void main(String[] args) {
Person p1 = new Person("질문", 20);
p1.getName();
getAge();
}
public static void getAge() {
Person p3 = new Person("질문2",30);
}
}
class Person{
String name;
int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
public void getName() {
Person p2 = new Person("가나다",20); // Person2 생성
System.out.println(this.name);
}
}
예를 들어 이런식으로 코드가 있다고 하면
질문 2개 여쭤봅니다
1. main쓰레드 안에 P1,P2가 같은 Heap영역안에 존재하는 건가요?
2. main쓰레드와 getAge()는 서로 각각 stack과 heap영역을 가지고 있는 건가요?
우선 간단히 설명드리면 new 동적 할당자를 이용해 생성된 인스턴스 객체는 모두 Heap 영역에 할당 됩니다. 따라서 질문 주신 p1, p2가 참조하는 인스턴스 객체는 Heap 영역에 할당 됩니다. 그리고 각 객체를 참조하는 p1, p2 참조 변수는 메소드 내에 선언된 지역 변수이기 때문에 stack에 잡히게 되겠죠..
2번 질문의 의미를 제가 잘 이해하고 있는지 모르겠습니다. 다만, 제가 강의에서 메모리 영역에 대한 설명을 진행할 때 static, stack, heap 영역을 구분하는 그림을 그리고 설명드리는 부분은 이해를 돕기 위한 논리적인 설명입니다. 실제 특정 메소드가 각 메모리를 갖는다는 의미는 아닙니다.
특정 시점에 프로그램의 흐름에 따라 특정 메소드가 호출이 될 것이고, 그 메소드 내부에 지역 변수가 할당되어 있다면 그 변수는 stack에 할당 되어 있는 것이고, 인스턴스 객체는 모두 heap 영역에 잡혀 있겠죠. 인스턴스 객체의 참조 정보를 해당 메소드 내부에서 참조 하고 있다면 그 객체에 접근할 수 있게 되는 것이구요.
아 선생님 이해 되었어요 감사합니다ㅎㅎ
@@홍성우-j1x 도움이 되셨다니 다행입니다. 앞으로도 학습하시면서 궁금하신 내용 있으시면 언제든지 질문 주세요. 최선을 다해 답해드릴 수 있도록 노력하겠습니다.^^
굿 교수님보다 강의 잘하심
선생님 안녕하세요
좋은 강의 올려주신 덕분에 많은 도움이 되는 것 같습니다
다름이 아니라 질문을 드려도 되겠습니까?
익명클래스와 메모리 구조에 대한 질문입니다
( 소스코드는 선생님의 함수형 프로그래밍 강의에서 가져왔습니다
ruclips.net/video/WzeqIkaETbs/видео.html )
아래처럼
이렇게 익명클래스를 만들어서 익명객체를 1개 만들 경우에
result = service.searchCunstomers(new SearchFilter() {
@Override
public boolean isMatched(Customer customer) {
if(customer.getGender().equals(Gender.Male))
{
return true;
}
else {
return false;
}
}
});
Static 영역에 익명클래스 하나가 차지하고
Heap 영역에 익명객체를 하나 만든다고 이해해도 되나요?
아니면 익명클래스의 경우에는 Static 영역을 차지하지 않는지 질문드리고 싶습니다
익명클래스는 다시 사용되지 않기에 가비지 컬렉터가 메모리를 회수한다는데, 제가 이해하기로는 가비지 컬렉터가 회수하는 영역은 Heap 영역인 것으로 알고 있습니다
그렇다면 익명클래스가 말 그대로 클래스이기에 Static 영역까지 차지한다면, 가비지 컬렉터가 Static 영역까지 메모리 해제를 도와주는 것인지 궁금합니다
우선 우리가 작성하는 모든 코드 그 자체는 static 영역에 잡히게 됩니다. static 영역은 Code segment와 Data segment로 나뉘게 되는데 Data segment에는 static 키워드가 붙은 변수들이 잡히게 되는 것이죠.(상수는 당연히 static 영역에...)
Code Segment에 바로 우리가 작성한 코드 그 자체가 담긴다고 이해하시면 되며, Heap 영역은 인스턴스 객체가 담기게 됩니다. 즉, 생성된 객체가 Heap 영역에 잡히게 되는 것이죠. 즉, 질문 주신 내용에 답은 작성된 모든 코드 자체는 static의 code segment 영역에 담겨 있고, 익명 클래스의 경우, 코드를 예로 들면 new SearchFilter() 코드가 호출되는 시점에 Heap 영역에 잡히게 됩니다.
@@namoosori 선생님 상세하게 답변해주셔서 감사합니다
잡소리좀 하지말고 바로본론 설명부터좀해라 뭔 잡소리로시간오지게끄냐