자바기초(메모리구조, 문자열 관련...)
3월 24일 내용정리
1.자바는 JVM 이 운영체제로 부터 메모리관리를 할당 받았다. Runtime Data Area 영역을 할당받음.
2.이안에는 5개의 영역이 있음
-클래스(또는 메소드 영역)영역
-스택영역
-힙영역
-native 메소드영역
-pc레지스터 영역
이중 클래스(또는 메소드 영역)영역,스택영역, 힙영역에 대해서 설명 들음
-클래스(또는 메소드 영역)영역은 클래스파일의 바이트코드가 로드 되는곳
-스택영역은 기본형 값과 지역변수 값 및 참조변수의 주소값이 저장되는 곳으로 작은영역을 일시적으로 저장 될때 사용되는곳
-힙영역은 참조변수의 진짜 값이 저장 되며, 배열 문자열등 큰단위영역을 저장할때 쓰이는곳이다.
이때,주소값을 저장하는 스택영역과 연결이 끊어지면 힙 영역부분 저장된 참조변수값이 가비지컬렉터가 옴뇸뇸 먹어버려서 메모리정리당함.
-객체생성 "new" 를 쓸때 힙영역에 객체가 생성된다.
예)"new Scanner"를 쓸때 힙영역에 Scanner 객체가 생성됨.
package study_0324;
public class study_0324 {
public static void main(String[] args) {
//참조타입은 자동적으로 null값으로 초기화 됨 아직 참조할 객체가 없다 라는 뜻, 배열또한 자동적으로 0으로 초기화 됨
// String 변수 = new String("문자열"); 원래 String은 객체를 생성하는 클래스메서드임
// String 변수 ="문자열"; 이와 같은 형식으로 단축형으로 많이 쓰임.
/* String name1="홍길동";
* String name2="홍길동";
* String name3=new String("홍길동");
*
* boolean result1=(name1==name2); ->true
* boolean result2=(name1==name3); ->false
*
* 참조형에서'=='참조하고 있는 주소가 같은가, 참조하는 객체가 같은가
* 기본형에서'=='값이 같은가
* name1.equals(name2) name1 객체안의 값과 name2객체안의 값이 같은지 값비교를 함
*
* 참조타입은 자동적으로 null값으로 초기화 됨 아직 참조할 객체가 없다 라는 뜻
* String name; //자동적으로 null값 들어감->아직 참조할 객체가 없음
* name = new String("홍길동") //->new를 만나면서 객체생성 주소생겨서 참조객체연결
*
*/
String name1="홍길동";
String name2="홍길동";
String name3=new String("홍길동");
boolean result1=(name1==name2);
boolean result2=(name1==name3);
System.out.println(result1);
System.out.println(result2);
if(name1==name2) {
System.out.println("참조하는 객체가 같습니다.");
}else {
System.out.println("참조하는 객체가 다릅니다.");
}
if(name2==name3) {
System.out.println("참조하는 객체가 같습니다.");
}else {
System.out.println("참조하는 객체가 다릅니다.");
}
if(name2.equals(name3)) {
System.out.println("참조하는 객체가 같습니다.");
}else {
System.out.println("참조하는 객체가 다릅니다.");
}
}
}
위에 그림 코드는 아래와 같음
String name1="홍길동";
String name2="홍길동";
변수명은 다르나 문자열의 리터럴이 같으면 주소값을 공유한다.
String name3= new String("김기자");
String name4= new String("김기자");
같은 리터럴 이지만 new를 만나면서 힙영역에 각각 객체를 생성하여 주소값으로 연결했음.
2.문자열 관련 메소드 정리
package study_0324;
public class study_0324_01 {
public static void main(String[] args) {
/* 배열.length , 문자열.length() ->문자의 길이를 나타내는 것
* 변수명.charAt(인덱스번호) 원하는 인덱스번호의 글자를 뽑아낼때 쓰임.
* 변수명.substring(시작인덱스,끝인덱스-1 까지표현) 시작 부터 끝까지 지정문자 출력
* 변수명.toLowerCase(원하는 인덱스 또는 공백) 소문자 바꾸기
* 변수명.toUpperCase(원하는 인덱스 또는 공백) 대문자 바꾸기
* 변수명.indexOf("찾는 문자")찾는 문자의 인덱스 반환
* 변수명.valueOf(7)->"7" int 7을 문자"7"로 바꿔줌
*/
String s1 = new String("Hi,");
String s2 = new String(" Java");
System.out.println("문자열 길이(s1):"+s1.length());
System.out.println(s1.charAt(1));
s1=s1.concat(s2);
System.out.println(s1.concat(s2)+"!");
System.out.println(s1.toLowerCase()+"!");
System.out.println(s1.substring(4,8)+"!");
String s3=" ";
System.out.println(s3.isEmpty());
System.out.println(s3.isBlank());
String s4="";
System.out.println(s4.isEmpty());
System.out.println(s4.isBlank());
String s5="*-*";
System.out.println(s5.repeat(10));
System.out.println(s2.trim().indexOf("v"));
}
}
Author And Source
이 문제에 관하여(자바기초(메모리구조, 문자열 관련...)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@cbn1218/자바기초스택영역-과-힙영역-메소드-영역저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)