본문 바로가기
👨‍🏫Study/JAVA

[JAVA] 05 참조 타입

by 코푸는 개발자 2021. 8. 4.
728x90
참조 타입과 참조 변수

자바의 타입은 크게 기본타입과 참조 타입으로 분류됩니다.

참조 타입 - 번지를 통해 객체를 참조

 

메모리 사용 영역

메모리 영역은 메소드 영역, 힙 영역, JVM 스택으로 구분됩니다.

 

메소드 영역은 JVM이 시작될 때 생성되는 모든 스레드가 공유하는 영역입니다. 코드에서 사용되는 클래스들을 정적 필드/상수, 메소드 코드, 생성자 코드로 분류하여 저장합니다.

힙 영역은 객체와 배열이 생성되는 영역입니다.(쓰레기 수집기가 따로 있어 제거는 별도로 필요x)

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

 

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

NullPointerException - 참조 변수가 null을 가지고 있을 경우에는, 참조 객체가 없으므로 참조 변수를 통해 객체를 사용할 수 없습니다. 만약 null인 참조 변수를 통해 있지도 않은 객체의 필드나 메소드를 사용하면 NullPointerException이 발생합니다.

 

new 연산자 - 힙 영역에 새로운 객체를 만들 떄 사용하는 연산자(객체 생성 연산자)

 

String name1 = "허재경";
String name2 = "허재경";
String name3 = new String("허재경");
name1 == name2;//true
name1 == name3;//false

//문자열 비교 메소드
boolean result = name1.equals(name2);//true

 

배열

배열이란?

같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조를 의미합니다.

형식

//타입1
int[] value;

//타입2
int value[];

*보통 형식1을 주로 사용

 

생성 방법

//방법1
타입[] 변수명 = {값0, 값1, 값2,...};
int[] array = {0,1,2};

int[] hello;
hello = {0,1,2,3}; // 컴파일 에러

//방법2
int[] hello;
hello = new int[] {1,2,3}; // 선언 이후에 값의 목록으로 배열 생성을 원한다면 new 키워드 사용
// 자바는 new int[] {1,2,3} 을 배열로 만들고 그 번지를 hello에 저장해준다.

타입[] 변수명 = new 타입[크기];
int[] scores = new int[30]; // 기본적으로 배열 안에는 0이 저장되어 있다.

*기본적으로 목록을 통해 생성하지 않은 경우에는 String에는 null, int에는 0값이 들어있습니다.

*.length를 이용하면 배열의 길이를 확인할 수 있습니다.

 

명령 라인 입력

main() 메소드의 String[] args 매개변수
실행할 때 명령라인 매개값을 주지 않았을 경우 길이가 0인 String 배열 생성 후 main()메소드가 호출되는 것입니다. 그렇다면 매개값을 주고 사용해보겠습니다. 아래 코드를 실행하기 전에 Run - Run configurations - Arguments - Program arguments 에서 공백을 기준으로 값을 주고 Run 해주면 값이 들어갑니다.

package sec02.exam01;

public class SignOperatorExample {

	public static void main(String[] args) {
		int x = -100;
		int result1 = -x;
		int result2 = -x;
		System.out.println("result1=" + result1);
		System.out.println("result2=" + result2);
		
		byte b = 100;
		//byte result3 = -b; // 결과 값 타입이 일치x
		int result3 = -b;
		System.out.println("result3="+result3);
		
	}

}

 

다차원 배열
//타입[][] 변수명 = new 타입[크기][크기];
int[][] scores = new int[2][3];

//타입[][] 변수 = {{값1,값2,....}, {값1,값2,,....}};
int[][] scores = {{95,80},{92,96}};
int score = scores[0][0] // 95

 

객체를 참조하는 배열

참조 타입 배열은 요소에 값(정수, 실수, 논리값)을 저장하지 않고, 객체의 번지를 가지고 있습니다.

String[] strarray = new String[3];
strarray[0] = "java";
strarray[1] = "java";
strarray[2] = new String("java");

strarray[0] == strarray[1] // true
strarray[0] == strarray[2] // false
strarray[0].equals(strarray[2]) // true

각각의 인덱스에 대입

 

배열 복사
  • for문을 이용해서 요소 하나 하나 복사하는 방법
  • System.arraycopy()를 이용해 복사하는 방법
//System.arraycopy(원본배열,원본배열시작인덱스,대상배열,대상배열시작인덱스,복사개수);

String[] oldStrArray = {"java","array","copy"};
String[] newStrArray = new String[5];
System.arraycopy(oldStrArray,0,newStrArray,0,oldStrArray.length);

 

부가적 사용팁

기존식
for(int i=0;i<10;i++>){

}

향상된 for문
for (타입 변수명 : 배열){

}

int[] scores = {100,95,92,96};
for (int x : scores) 
	System.out.printf("%d " ,x);
728x90

댓글