참조타입

서현서현·2022년 2월 21일
0

JAVA

목록 보기
8/27
post-thumbnail

📌 참조타입

📌 참조타입과 참조변수

  • 자바의 타입은 기본타입과 참조타입으로 분류된다.
  • 참조타입이란 객체의 번지를 참조하는 타입을 의미한다
  • 종류로는 배열, 열거, 인터페이스, 클래스가 있다
int age = 25;
double price = 100.5;
String name = "홍길동";
String hobby = "독서";

위와같이 기본타입(int,double)과 참조타입(String) 변수에 값을 주면,

기본타입변수는 값을 직접 스택에 저장한다.

그러나 참조타입의 경우 힙 영역에 데이터가 번지수와 함께 들어있고, 스택에서는 그 번지를 참조하기만 하는 형태로 존재한다!

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

  • 참조변수에서 ==,!=의 의미는 같은 주소를 참조하는가? 이다.
  • 결국은 번지가 같아야 같다고 할 수 있는것!

예시를 통해 이해해보자

public class StringExample {
	public static void main(String[] args) {
		String name1 = new String("홍길동");
		String name2 = new String("홍길동");
		
		
		if(name1==name2) {
			System.out.println("같음");
		}
		else {System.out.println("다름");}
	}

다름이 왜 나와? >> new를 이용해 따로 선언했으니까! 힙과 스택에도 서로 다른 주소가 생겨서 각자 참조했으니 다름,,, 주소가 다르면 다른값으로 인식한다는것 잊지말기

그렇다면 어떻게 해결해야 하는가?

public class StringExample {
	public static void main(String[] args) {
//		String name1 = new String("홍길동");
//		String name2 = new String("홍길동");
		
		String name1 = "홍길동";
		String name2 = "홍길동";
		
		if(name1==name2) {
			System.out.println("같음");
		}
		else {System.out.println("다름");}
	}

new를 사용하지 않고 선언! 참조타입은 원래 new를 이용해 선언해야 하나 String은 jdk1.5이상부턴 같은글자면 같은 주소를 참조하게끔 만들었다. ( 원래거는 주소가 두배이므로 효율안좋음! )

동일한 String객체이건 다른 객체이건 상관없이 내부문자열을 비교하고 싶을때는 String객체의 equals()메소드를 사용해야함!

📌 null과 NullPointExeption

  • 참조타입변수는 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있다.
  • NullPointExeption는 가장 자주 발생하는 오류이다.
int[] array = null;
array[0] = 10;

array는 배열이므로 참조변수이고, 참조변수는 null로 초기화가 가능하다. 이상태에서 10을 [0]위치에 저장하려고 시도하면 NullPointExeption이 발생한다.

즉, array변수가 참조하는 배열객체가 없어서 발생하는것!

또다른 예시로는

String str = null;
System.out.println("총 문자수: "+str.length());

String은 참조타입이며, null로 초기화가 가능하다. 이때 String객체의 length()라는 메소드를 호출하면 NullPointExeption 발생한다. str변수가 참조하는 객체가 없기때문!

📌 배열

배열의 선언

  • 같은타입 데이터를 연속된 공간에 나열하고 인덱스를 부여해놓은 자료구조
score[인덱스]
  • 배열은 같은타입의 데이터만 저장 할 수있으며 한번 생성되면 길이 변환은 불가능 하다
  • 배열은 예를들어 다음과같이 선언한다
    int intrArray[];
    int[] intArray;
  • 배열은 참조변수로, 힙영역에 생성되고 배열변수가 이를 참조하는 형태이다.
🚨 **Nullpoint Exception** 만약 위와 같이 참조할 배열객체가 없다면 null로 초기화하면 된다
타입[]변수 = null;

그런데 이 null로 초기화된 변수를 변수[인덱스]로 값을 읽거나 저장하게 되면

Nullpoint Exception이 발생한다

→ 그럼 배열에 값을 저장하려면 어떻게 해야 하는가?

배열의 생성

  1. 처음부터 중괄호를 이용해 값을 넣어준다
변수 = new 타입[] {값01,2, ...};
  1. 이미 배열변수를 선언한 경우, 다른실행문에서 중괄호 불가능
타입[] 변수;
변수 = {0,1,2,3 ...}; //error!

그럼 어떻게 값을 넣는가? → new 연산자를 이용한다!

String[] names = null;
names = new String[] {"신용권", "홍길동", "감자바"}

NEW 연산자로 배열생성

값의 목록을 가지고있지 않지만, 향후 값을 저장할 배열을 미리 만들고 싶다면?

타입[] 변수 = new 타입[길이];
int[] intArray = new int[5]; << 5개 인덱스 생김!
모두 null값으로 초기화 된다.

배열 복사

  • 자바 배열은 크기 변경이 불가능 ⇒ 되는것처럼 보이기위해 복사를 이용
public class ArrayCreateExample {
	public static void main(String[] args) {
		int[] scores = {95,71,84,93,87};
		int sum =0;
		//향상된 for문
		for(int score : scores){
			sum+=score;
		}
		System.out.println("sum= " +sum);
	}}

인덱스가 필요할땐 못씀 밑에같은거

public class ArrayCreateExample {
	public static void main(String[] args) {
		int[] scores = {95,71,84,93,87};
		int sum =0;
		
		for(int i = 0; i<scores.lenght;i++) {
			System.out.println("scores["+i+"]:"+scores[i]);
			
			if(i%2==0) {System.out.println("점");}
			else {System.out.println();}
		for (int score : scores) {System.out.println(score);}
		}}
	}

0개의 댓글