카테고리 없음

참조 자료형

GaeGim 2022. 7. 2. 23:40
반응형
  • 배열

배열 : 동일한 타압의 데이터를 순차적으로 메모리에 확보할 수 있는 자료구조

장점 : (루프문을 이용해서) 일괄처리가 가능하다.

 

생성할 때 크기를 지정해야 하고, 한 번 크기를 지정하면 절대 변경할 수 없는 특징이 있다.

-> 배열 선언과 더불어 객체 생성에도 적용된다.

 

 

배열 선언) int [ ]arr;

배열 선언하면 스택 메모리에 변수 공간만 생성하고 그 안은 비운 채로 있다.

배열의 실제 데이터인 객체를 생성하지 않았기 때문이다.

따라서 빈 공간을 null로 둘 수 있다.

null은 힙 메모리 위치를 가리키고 있지 않다는 의미로 연결된 데이터가 없다는 뜻이다.

 

 

 

 

 

배열 선언 및 객체 생성, 대입) int [ ]arr = new int[4];

주소값을 표시한 것

reference variable arr에 int형 배열 4개짜리가 연결되었다.

배열을 생성할 때 배열 길이를 지정해야 한다.
자바에선 배열을 초기화를 안 하면 자동으로 0으로 초기화된다.
배열을 참조하는 변수는 배열의 크기를 알고있다.

 

힙 메모리는 객체가 위치하는 공간이고,

객체는 참조 변수가 가리키는 실제 데이터 정도로 알고 있자.

 

 

 

스택 메모리 공간은 값을 초기화하지 않으면 빈 공간으로 존재해서 변수를 출력할 때 오류가 발생한다.

반면 힙 메모리는 어떤 상황에서도 빈 공간이 존재하지 않기 때문에 값을 주지 않으면

컴파일러가 값을 강제로 초기화한다.

-> 기본 자료형일 때 숫자는 0(실수는 0.0), 불리언은 false, 모든 참조 자료형은 null로 초기화된다.

 

 

※ 객체 위치를 참조 변수에 저장하는 이유

new 키워드를 이용해 객체를 생성하면 JVM은 힙 메모리 내 비어 있는 공간에 객체를 생성한다.

힙 메모리에 비어 있는 공간을 때마다 다를 수 있어 객체 생성할 때마다 저장되는 위치가 다를 수 있다.

따라서 JVM은 객체 위치를 알아야 개발자가 해당 객체를 쓸 수 있는 것이다.

 

 

 

<right to left rules>

오른쪽부터 왼쪽으로 읽기 -> 정체와 용도 파악이 목적.

 

ex) int [ ]arr;                   -> 1, 2. 배열임을 확인

       3  2  1                     -> 3. int형임을 확인

                                      -> int형 1차원 배열인 것을 확인

 

 

인덱스 번호 : 0 ~ 배열길이-1

 

 

· 배열 객체에 값 대입

문법) 참조 변수명[인덱스] = 값; or 자료형[ ] 변수명 = {값, 값, ...};

 

· 배열 객체 값 읽어오기

문법) 참조 변수명[인덱스];

(없는 인덱스에 값을 대입하거나 읽을 때 예외가 발생해 프로그램이 종료된다.)

 

 

※ 선언과 객체 대입 분리 가능/불가능한 예시

int []a = new int[3];
a[0]=3;
a[1]=4;
a[2]=5;

int []a = new int[] {3, 4, 5};

int []a;
a = new int[] {3, 4, 5}; 

int []a = {3, 4, 5};

int a[];
a = {3, 4, 5};	    //불가능

 

 

기본 자료형이든 참조 자료형이든 모든 변수는 스택에 있기 때문에 모든 변수는 초기화 이후에만 출력 가능하다.

int a;
int []b;

System.out.println(a);	//오류 발생
System.out.println(b);	//오류 발생

 

 

※ 참조 자료형 배열의 특징

변수의 복사를 한다는 것은 변수에 포함된 스택 메모리 값을 복사한다는 뜻이다.

기본 자료형과 참조 자료형은 스택 메모리에 저장하는 값이 달라 차이가 발생한다.

 

기본자료형은 변수를 복사하면 실제 데이터 값이 1개 더 복사되며 복사된 값을 변경해도 원본 값은 아무 영향을 받지 않는다.

 

참조 자료형은 힙 메모리에 저장된 객체의 위치를 스택 메모리에 저장한다. 따라서 변수를 복사하면 실제 데이터의 위치값이 복사된다. 따라서 하나의 참조 변수를 이용해 데이터를 수정하면 다른 참조 변수가 가리키는 데이터도 수정된다.

 

· 배열의 길이 구하기

문법) 배열 참조 변수.length

-> 배열 참조 변수가 가리키는 곳엔 배열 객체가 있다. 그 배열의  칸 수를 가져오라는 의미다.

 

 

※ for-each문

배열, 컬렉션 등 집합 객체에서 원소들을 하나씩 꺼내 출력하는 과정을 반복하는 구문.

믄법) for(원소자료형 변수명 : 집합객체) {}

 

 

※ System.out.println(Arrays.toString(1차원 배열 참조 변수명));

-> 모든 배열 원소 출력됨

 

 

 

· 2차원 배열

-정방 행렬 배열

배열 선언) int [ ][ ]arr2 = new int[3][2];

인덱스 번호를 표시한 것

 

※ 메모리는 2차원 데이터를 바로 저장할 수 없다. 메모리는 1차원 형태의 데이터만 저장 가능하다.

2차원 배열은 1차원 배열을 원소로 포함하고 있는 1차원 배열.

 

 

2차원 배열 객체 생성 및 대입

- 행 성분만 먼저 생성하고 각 행 열 성분은 나중에 생성할 수 있다.

- 중괄호 추가해 대입할 값 바로 입력해서 생성할 수 있다.

int a[][] = new int [2][3];
a[0] = 1; 	// 이하 생략

int b[2][];
b[0] = new int [3];
b[0][0] = 1; //이하 생략

int [][]c = new int [][] {{1,2,3}, {4,5,6}};

int [][]d = {{1,2,3}, {4,5,6}};

int [][]d;
b = {{1,2,3}, {4,5,6}}; //불가

선언과 동시에 값을 대입할 순 있지만 선언과 값 대입 분리할 수는 없다.

 

 

 

-비정방 행렬 배열 객체 생성 및 대입

int [][]a = new int[2][];
a[0] = new int [2];
a[0][0] = 1;	//이하 생략

int [][]b = new int [][] {{1,2}, {3,4,5}};

int [][]c = {{1,2}, {3,4,5}};

int [][]d;
d = {{1,2}, {3,4,5}};	//불가

 

· 2차원 비정방 배열 출력

a[i].length 이용

for-each문 이용

int [][]a={{1,2}, {3,4,5}};

for(int i=0; i<a.length; i++) {
	for(int j=0; j<a[i].length; j++) {
    	System.out.println(a[i][j]);
    }
}

for(int []m:a) {
	for(int n:m) {
    	System.out.println(n);
    }
}

 

 

※ main() 메서드에서의 입력매개변수

public class A {
	public static void main(String[] args) {
    
    }
}

JVM은 자바 코드를 실행 시 가장 먼저 main() 메서드를 실행하는데 개발자는 이때 필요한 자료를 배열 타입으로 넘겨줄 수 있다.  입력매개변수의 각 원소는 공백문자로 구분되고 모든 원소는 입력매개변수가 String[]이므로 문자열로 인식한다.

 

 

· 타입 변환 메서드

문자열 -> 정수 : Integer.parseInt(문자열)

문자열 -> 실수 : Double.parseDouble(문자열)

정수 -> 문자열 : String.valueOf(정수)

실수 -> 문자열 : String.valueOf(실수)

 

 

 

  • 문자열 저장하는 String

문자열은 반드시 큰따옴표 안에 표기해야 한다.큰따옴표 안에 문자열이 안 들어와도 되지만 큰따옴표가 없는 건 안된다. 

 

String 객체를 생성하는 방법

1. new 키워드를 사용해 생성자의 입력매개변수로 저장할 문자열을 입력한다.

문법) String 참조변수명 = new String("문자열");

 

2. 문자열 리터럴만 입력하는 방법

문법) String  참조변수명 = "문자열";

 

 

String 객체의 특징

- 한 번 정의된 문자열은 변경할 수 없다.

만일 문자열을 변경하면 그것은 JVM이 기존의 문자열을 버리고 새 문자열을 포함하고 있는 객체 사용하는 것이다.

다른 클래스에서는 볼 수 없는 특징이다.

 

참조 자료형에서 2개의 참조 변수가 1개의 객체를 가리킬 때 하나의 참조 변수에 접근해 객체 값 변경하면, 다른 참조 변수가 가리키는 값도 달라진다. ex) 배열은 객체의 값 자체가 수정되어 참조 변수 복사 이후 하나의 변수에서 수정하면 나머지 변수에도 적용된다.

 

-문자열 리터럴을 바로 입력해 객체를 생성할 때 같은 문자열끼리 객체를 공유한다.

다른 클래스에서는 볼 수 없는 특징이다.

new 키워드로 객체 생성하면 동일한 문자열 객체가 있든 없든 무조건 새로운 객체를 생성한다. 문자열 리터럴로 객체 생성할 땐 힙 메모리에 리터럴로 생성된 동일 문자열을 포함하고 있는 객체가 있으면 그 객체를 공유한다.

 

 

· String 객체의 '+' 연산

1. 문자열 + 문자열 -> 문자열문자열(연결됨)

2. 기본 자료형 + 문자열

=> 기본 자료형 -> 문자열로 바뀜

-> 문자열+문자열 연산 수행

 

※ 기본 자료형 + 기본 자료형 + 문자열 ->기본 자료형 연산 + 문자열

연산은 앞에서부터 순차적으로 수행되므로 기본 자료형과 문자열을 여러 개 섞은 연산 시 주의해야 한다.

 

 

· 주요 메서드

length() : 문자열 길이 반환

charAt() : 문자열에서 특정 인덱스에 위치한 문자를 알아낸다

indexOf() : 문자열에서 특정 문자나 특정 문자열을 앞에서부터 찾아 위치값을 알아낸다

lastIndexOf() : 문자열에서 특정 문자나 특정 문자열을 뒤에서부터 찾아 위치값을 알아낸다

String.valueOf() : 기본 자료형을 문자열로 바꾸는 정적 메서드

concat() : 2개의 문자열을 연결한다. (+연산자와 동일한 기능)

getBytes() : 문자열을 byte 배열로 변환한다. 자바 입출력 과정에서 주로 사용.

toCharArray() : 문자열을 char 배열로 변환한다. 자바 입출력 과정에서 주로 사용

toLowerCase() : 영문 문자를 모두 소문자로 변환

toUpperCase() : 영문 문자를 모두 대문자로 변환

replace() : 일부 문자열을 다른 문자열로 대체

substring() : 문자열의 일부만을 포함하는 새로운 문자열 객체를 생성

split() : 특정 기호를 기분으로 문자열을 분리

trim() : 문자열의 좌우 공백을 제거

equals() : 두 문자열의 위치값이 아닌 실제 데이터 값을 비교(대소문자 구분함)

equalsIgnireCase() : 두 문자열의 위치값이 아닌 실제 데이터 값을 비교한다.(대소문자 구분 안 함)

반응형