☭DEVELOPER/#2 웹개발(자바기반 풀스택)

[BACKEND]JAVA_ECLIPSE09 참조 타입

조반짝 2023. 8. 21. 15:48
728x90
반응형


기본타입과 참조타입

기본타입과 변수 참조타입 변수의 차이점

변수의 차이점은 저장되는 값

기본타입 변수는 실제 값을 변수 안에 저장하지만, 참조타입 변수는 메모리의 번지를 변수 안에 저장, 번지(주소값)을 통해 객체를 참조

 

기본타입으로 선언된 변수 : 실제값을 변수 안에 저장

참조타입으로 선언된 변수 : 메모르의 번지를 변수 안에 저장 

 

int타입 변수인 age와 double 타입 변수는 price는 직접 값으 저장하지만

string 클래스 변수인 name, hobby는 힙영역의 string 객체 번지 값을 가지고 있다.

 


메모리 사용 영역

자바버추얼머신이 사용하는 운영체제에서 할당받은 메모리 영역을 구분해서 사용한다.

메소드영역

JVM이 시작될 때 생성되고 모든 스레드가 공유하는 영역.

메소드 영역에는 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스 별로 정적필드(STATIC FIELD)와 상수(constant), 메소드 코드(method code), 생성자(constructor) 코드등을 분류해서 저장

 

  • 다중 작업 환경에서 운영 체제가 여러 프로그램을 병행하여 처리할 때 효율적인 처리를 위하여 분할한 처리 단위.

JVM(Java Virtual Machine)이란?

자바 가상 머신 JVM(Java Virtual Machine)은 자바 프로그램 실행환경을 만들어 주는 소프트웨어

자바 코드를 컴파일하여 .class 바이트 코드로 만들면 이 코드가 자바 가상 머신 환경에서 실행된다.

JVM은 자바 실행 환경 JRE(Java Runtime Environment)에 포함되어 있다. 

현재 사용하는 컴퓨터의 운영체제에 맞는 자바 실행환경 (JRE)가 설치되어 있다면 자바 가상 머신이 설치되어 있다는 뜻

 

힙영역

힙영역은 객체배열이 생성되는 영역.

인스턴스를 생성할 때 생성되는 메모리 형식

"new"를 사용하여 객체를 만들 때 저장됨

여기에 생성된 객체와 배열은 JVM스택 영역의 변수나 다른 객체의 필드에서 참조,

만일 참조하는 변수나 필드가 없다면 의미없는 객체가 되기 때문에 JVM이 이것을 쓰레기 취급하고 쓰레기 수집기를 실행시켜 자동으로 제거.

 

 

JVM 스택 영역

JVM스택은 메소드를 호출할 때마다 frame을 push 추가하고 메소드가 종료되면 해당 프레임을 제거pop 하는 동작 수행

스택영역에 쌓이듯이 메모리가 형성됨

스택 영역은 int, long, boolean 등 기본 자료형을 생성할 때 저장하는 공간으로, 임시적으로 사용되는 변수나 정보들이 저장되는 영역

메소드가 호출될 때마다 생성하고, 메소드 실행이 끝나면 pop되어 제거된다!

 

[ ] : 배열 인덱스

int scores1 = 10;

int scores2 = 20;

int scores3 = 30;

똑같은 데이터 타입인데 값만 조금씩 다름. 일련의 데이터형이 비슷한 것을 array(배열)

 

array(배열)

int[ ] scores = {10,20,30};

 


참조변수의 ==, != 연산

==, != 메모리를 비교할 수있다.

참조 타입 변수의 값은 힙 영역의 객체 주소이므로 ==, != 연산은 결국 번지값을 비교하는 것

동일한 객체 값을 갖고 있다 > 동일한 객체를 참조한다.

동일한 객체를 참조하고 있을 경우 == 는 true

동일한 객체를 참조하고 있지 않을 경우 != false

 

refVar1 == refVar2 같다 >> 결과 false : 메모리 비교, 객체가 다르다.

refVar1 != refVar2 다르다 >> 결과 true : 객체가 다르다. 

refVar2 == refVar3 같다 >> 결과 true : 객체가 같다.

 

if문에서 == 와 != 연산자의 활용

==와 != 연산자로 객체를 비교하는 코드는 일반적으로 if문에서 많이 사용됨

 

 


null 과 NullPointerException

참조 타입 변수는 힙영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다.

null 값도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조변수는 스택영역에 생성됨


Exception 예외

자바를 실행하는 도중에 발생하는 오류

참조변수가 null을 가지고 있을 경우에는 참조객체가 없으므로 변수를 통해 객체를 사용할 수 없다.

만약 null상태에서 있지도 않은 객체의 데이터(필드) 나 메소드르 사용하는 코드를 실행하면 NullPointException이 발생한다.

null: 데이터가 없다.

intArray[0] = 10; >> NullPointerException 배열객체가 없는데 배열을 저장할 공간이 없다.

 

NullPointerException 해결 방법

참조변수를 추적해서 객체를 참조하도록 수정하는 것이다.


String 타입

자바는 문자열을 String 변수에 저장하기 때문에 String 변수를 우선 선언해야한다.

String 변수에 문자열을 저장하려면 큰 따옴표로 감싼 문자열 리터럴을 대입한다.

자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어있다.

 

데이터는 같은데 변수명이 다를 때

String name1 = "신용권";

String name2 = "신용권";

 

 

new 연산자는 힙영역에 객체를 새롭게 만든다. >>  객체 생성 연산자

string name = new String("신용권");

string hobby = new String("자바");

동일한 문자열 리터럴로 String 객체를 생성했을 경우 == 연산의 결과는 true가 나오지만 

new 연산자로 String 객체를 생성했을 경우 == 연산의 결과는 false

 

동일한 String객체이건 다른 String객체이건 상관없이 내부 문자열을 비교 하고 싶을 때에는 String의 객체의 

equals() 메소드를 사용한다.

boolean result = str1.equals(str2);

 


String Equals

 

 

package chapter05.sec01.exam01;

//문자열 비교 이해 자바프로그램 소스 코딩입니다. equals() 메서드 활용
public class StringEqualsExample {

	public static void main(String[] args) {
		
		String strVar1 = "장나라";
		String strVar2 = "장나라";
		
		if(strVar1 == strVar2) {
			// 메모리 비교
			System.out.println("strVar1과 strVar2는  참조 데이터가 같음!");
		}else {
			System.out.println("strVar1과 strVar2는 참조 데이터가 다름!");
		}
		
		if(strVar1 == strVar2){
			System.out.println("strVar1과 strVar2는 문자열이 같음!");
		}
		
		String strVar3 = new String("김희선");
		String strVar4 = new String("김희선");
		if(strVar3 == strVar4) {
			// 메모리 비교
			System.out.println("strVar3과 strVar4는  참조 데이터가 같음!");
		}else {
			System.out.println("strVar3과 strVar4는 참조 데이터가 다름!");
		}
		
		if(strVar1 == strVar2){
			System.out.println("strVar3과 strVar4는 문자열이 같음!");
		}
	}
}

 

String 변수는 참조 타입으로 초기값으로 null을 대입할  수  있다.

이때 null은 String변수가 참조하는 String 객체가 없다는  뜻이다.

 

728x90
반응형