2022.12.14-4 JAVA 복습 참조타입
5. 참조타입
5.1 데이터 타입분류
기본타입과 참조타입으로 분류
참조타입 자체를 이해할 필요가 있다. 참조타입이란 객체의 번지를 참조하는 타입이다.
기본타입과 참조타입의 차이점은 저장되는 값이다.
기본타입은 선언된 변수는 값 자체를 저장하고 있음.
참조타입으로 선언된 변수는 객체가 생성된 메모리 번지를 저장한다.
String = 참조타입 변수임. 직접 갑을 가지고 있지 않음.
String name = "신용권" 일때 name이 신용권을 직접 가지고 있는게아님.
변수들은 스택이라는 메모리 영역에 생성된다. 참조타입 변수는 힙 메모리 영역의 String 객체 번지를 저장하고 이 번지를 통해 String 객체를 참조한다.
이 번지를 통해 String객체를 참조한다.
5.2 메모리영역
메모리를 나눠서 한다.
5.3 참조타입변수의 == != 연산
참조타입 변수는 객체의 번지이므로 참조타입변수의 == !=연산자는 번지를 비교하는 것이다.
번지가 같다면 동일한 객체를 참조하는거 다르다면 다른 객체를 참조하는것
int[] arr1 = new int[] {1, 2, 3};
int[] arr2 = new int[] {1, 2, 3};
int[] arr3 = arr2;
둘이 값은 같지만 변수에 대입되는 번지가 달라 서로 다른 객체이므로 arr1 != arr2이다.
arr3과 arr2은 번지가 같으므로 arr2 == arr3이다.
5.4 Null과 NullPointerException
참조타이변수는 아직 번지를 저장하지 않다는 뜻으로 null값을 가질 수 있다.
null도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조변수는 스택영역에 생성된다.
null인상태에서 참조변수를 사용하려면 예외가 발생한다.
참조변수에 값을 대입한 후 null값을 대입하면 번지를 잃게 되므로 더이상 객체를 사용할 수 없게된다.
힙 메모리에는 있지만 주소를 잃어버려 사용할수 없게됨.
자바는 이런 객체를 '쓰레기'로 인식하고 '쓰레기 수집가'를 실행시켜 자동으로 제거한다.
자바는 객체를 직접 제거하는 방법을 제거하지 않는다 . 객체를 제거하는 유일한 방법은 모든 참조를 없애는 것임.
다른값으로 변경되어도 이전 객체는 쓰레기가 된다.
String hobby = "여행"; <---쓰레기객체
hobby = "영화";
5.5 문자열(String)타입
자바의 문자열은 String객체로 생성된다.
자바의 문자열은 String 객체로 생성된다. 문자열 리터럴이 대입되면 문자열은 String객체로 생성되고 객체의 번지가 각각 대입된다.
5.5.1 문자열비교
문자열 리터럴이 동일하다면 String객체를 공유하도록 설계되어 있다.
String name1 = "홍길동"; // 주소10번지
String name2 = "홍길동"; // 주소10번지
new연산자로 직접 Stirng객체를 생성하고 대입할수도 있는데 이는 다른 번지이다.
2회독에서 보니 클래스이름 변수 = new 생성자(); 사용한것임을 알 수 있다.
String name1 = new String("홍길동"); // 주소10번지
String name2 = new String("홍길동"); // 주소 20번지
비교연산자는 번지를 비교하는 것이기때문에 달라질 수 있다.
String name1 = "홍길동"; // 주소10번지
String name2 = "홍길동"; // 주소10번지
String name3 = new String("홍길동"); // 주소20번지
단순히 내부 분자열만을 비교할 때는 String객체의 equals()메소드 사용한다.
원본문자열.equals(비교문자열)
name1.equals(name3)
2회독에서 보니 참조변수.메소드 사용하는 거였다.
5.5.2 문자추출
문자열에서 특정 위치의 문자를 얻고 싶다면 charAt() 메소드를 이용할 수 있다.
charAt() 메소드는 매개값으로 주어진 인덱스의 문자를 리턴한다.
인덱스는 0부터 시작, 띄어쓰기포함
5.5.3 문자열의 길이
문자열에서 문자의 개수를 얻고싶다면 length()메소드를 사용한다.
역시나 공백포함
나중에 배열길이 등에서도 사용한다.
5.5.4 문자열대체
특정 문자열을 다른 문자열로 대체하고 싶다면 replace() 메소드를 사용
5.5.5 문자열 찾기
특정문자열의 위치를 찾고자할때는 indexOf()메소드를 사용한다.
indexOf()메소드는 주어진 문자열이 시작되는 인덱스를 리턴한다.
indexOf()메소드는 포함되어 있지 않으면 -1을 리턴한다.
단순히 포함되어있는지만 조사하고 싶다면 contains() 메소드를 사용하면 편리하다
5.5.6 문자열 분리
문자열이 구분자를 사용하여 여러개의 문자열로 구성되어 있을경우 이를 따로 분리해서얻고 싶다면 split()메소드를 사용한다.
String board = "번호, 제목, 내용, 글쓴이";
String[] arr = board.split(",");
board는 ,로 구분된 문자열을 가지고 있다.
split()메소드를 호출할때 ,를 제공하면 분리된 문자열로 구성된 배열array를 얻을 수 있다.
arr[0] "번호" arr[1] "제목" arr[2] "내용" arr[3] "글쓴이"
5.6 배열(Array) 타입
변수는 하나의 값만 저장할수 있다. 저장해야할 값의 수가 많아지면 그만큼 많은 변수가 필요해서 코드가 복잡해진다.
따라서 많은 양의 값을 다루는 좀더 효율적인 방법이 필요한데 이것이 배열이다.
배열은 연속된 공간에 값을 나열시키고 각 값에 인덱스를 부여해 놓은 자료구조이다.
배열의 특징 1.배열은 같은 타입의 값만 관리한다. 2. 배열의 길이는 늘리거나 줄일 수 없다.
5.6.1 배열변수 선언
타입[] 변수; | 타입 변수[]; 관례적으로 첫번째 방법 주로 사용
int[] intArray; | int intArray[];
String[] strArray; | String strArray[];
참조할배열이없다면 타입[] 변수 = null;로 초기화 가능
배열에 저장될 값의 목록이 있다면 다음과 같이 간단하게 배열을 생성할수 있다.
타입[] 변수 = {값0, 값1, 값2, 값3, ...}
배열변수를 미리 선언한 후에는 값 목록을 변수에 대입할 수 없으므로 new를 해줘야한다.
타입[] 변수;
변수 = new 타입[] 변수 {값0, 값1, 값2, 값3, ...}
5.6.2 new연산자로 배열생성
값 목록은 없지만 향후 값들을 저장할 목적으로 배열을 미리 생성할 수 있다.
타입[] 변수 = new 타입[길이];
int[] scores = new int[30]; 으로 생성하면 모두 0으로 초기화
String[] scores = new Stirng[30]; 으로 생성하면 모두 null로 초기화
2회독하니 나오는 점. 나중에 데이터 입출력에서 문자을 읽을때 문자열을 미리 만들어놓고 읽는데
char[] data = new char[100];이런식으로 배열길이 정해놓는 것이 있는데 여기서 나온거엿다.
5.6.3 배열길이
배열의 길이란 배열에 저장할수 있는 항목 수를 말한다. 코드에서 배열의 길이를 어등려면 도트(.)연산자를 사용해서 참조하는 배열의 length필드를 읽으면된다. 배열변수.length;
arr.length;
5.7 다차원배열
배열항목에 또 다른 배열이 대입될 수 있는데 이러한 배열을 다차원배열이라고 부른다.
다차원배열은 1차원배열을 서로 연결한 것이라고 볼 수 있다.
각차원의 항목에 접근하는 방법은 다음과 같다/ 변수[1차원인덱스][2차원인덱스]...[n차원인덱스]
타입[][] 변수 = {
{값1, 갑2, ...}, 1차원 배열의 0인덱스
{값1, 갑2, ...}, 1차원배열의 1 인덱스
};
타입[][] 변수 = new 타입[1차원수][2차원수];
내가 이전 c언어에서 했던 배열의 모양참조하면 이해 쉽게 가능하다.
5.8 객체를 참조하는 배열
기본타입 배열은 각 항목에 값을 직접 저장하지만 참조타입(클래스, 인터페이스)배열은 각 항목에 객체의 번지를 저장한다.
== != 연산자를 사용하면 배열항목이 참조하는 객체가 같은 객체인지 다른객체인지를 확인할 수 있고 문자열만 비교할때는 equals()메소드를 사용한다.
5.9 배열복사
배열은 한번 생성하면 길이를 변경할 수 없다. 더 많은 저장곤간이 필요하다면 더 큰 길이의 배열을 만들고 이전 배열로부터 항목들을 복사해야한다.
예를들어 3인배열의 항목을 길이 5인 배열로 다음과 같이 복사할수 있다.
가장 기본적인 복사 방법은 for문을 이용해서 항목을 하나씩 읽고 새로운 배열에 저장하는 것이다.
배열복사 더 간단한 방법 System의 arraycopy()메소드를 이용하면 한줄만 으로도 배열복사 가능
System.arraycopy(원본배열arr1 ,원본배열 복사 시작 인덱스0 , 새배열arr2 , 새배열 붙여넣기 시작인덱스0, 복사 항목수arr.length);
//길이3인 배열
String[] oldStrArray = {"java", "array", "copy"};
//길이 5인 배열 새로 생성
String[] newStrArray = new String[5];
System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
for(int i = 0; i < newStrArray.length; i++ )
{
System.out.print(newStrArray[i] + ", ");
}5.10 배열 항목 반복을 위한 향상된 for문
향상된 for 문은 배열, 컬렉션에서 사용함. 잊지말고 알고있자!!
for (2타입변수 : 1배열) {3실행문} 1배열에서 가저올 항목이 있을경우 2변수에 항목을 저장하고 3실행문을 실행한다.
//배열 변수 선언과 배열생성
int[] scores = {95,71,84,93,87};
//배열 항목 전체 합 구하기
int sum = 0;
for (int score : scores)
{
sum = sum + score;
}
System.out.println("점수 총합 = " + sum); //430
//배열 항목 평균 구하기
double avg = (double) sum / scores.length;
System.out.println("점수 평균 = " + avg); //86.05.12 열거 타입
데이터 중에는 몇가지로 한정된 값을 갖는 경우가 있다.
예를들어 요일은 월일 7개값 계절은 봄겨울 4개값을 가진다.
이와 같이 한정된 값을 갖는 타입을 열거타입이라고 한다.
열거타입을 사용하기 위해서는 먼저 열거타입이름으로 소스파일을 생성하고 한정된 값을 코드로 정의해야한다.
new 클래스가 아닌 new들어가서 enum으로 만들기
첫문자를 대문자로 하고 캐멀스타일로 지어주는 것이 관례
Week.java MemberGrade.java ProdutKind.java