자바기초(메모리구조, 문자열 관련...)

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"));
		

	}

}

좋은 웹페이지 즐겨찾기