멀티캠퍼스 백엔드 과정 13일차[6월 19일] - JAVA 참조타입

GoldenDusk·2023년 6월 21일
0

참조타입

1. 데이터 타입 분류

참조 타입

  • 객체의 번지를 참조하는 타입
    • 참조타입 변수 : 주소값을 저장하고 있음, 객체가 생성된 메모리 번지 저장
      • 배열, 열거, 클래스, 인터페이스
    • 기본 타입 변수 : 자체 저장
      • 정수 타입, 실수 타입, 논리형 타입
  • 배열, 열거, 클래스, 인터페이스 타입
  • 객체(object) = 데이터(필드) + 메소드

2. 메모리 사용 영역

메모리, 힙, 스택 영역

  • JVM은 운영체제에 할당받은 메모리 영역을 메소드 영역, 힙 영역, 스택 영역 구분해서 사용
    • 메소드 영역
      • static 영역, 계속 유지되는 영역
      • 바이트 코드 파일을 읽은 내용이 저장되는 영역
    • 힙 영역
      • 객체가 생성되는 영역
      • 객체의 번지는 메소드 영역과 스택 영역의 상수와 변수에서 참조
    • 스택영역
      • 메소드 호출시 생성되는 프레임 저장되는 영역

3. 참조 타입 변수의 ==, != 연산

==, != 연산자

  • ==, !=연산자는 객체의 번지를 비교해 변수의 값이 같은지, 아닌지 조사
  • 번지가 같다면 동일한 객체 참조, 다르다면 다른 객체 참조
  • 이 그림을 코드로 보자면 이런 느낌
    • 주소 값이 다름

    • 다른 객체를 가르침

      import java.util.Scanner;
      
      public class Ex01
      {
      
      	public static void main(String[] args)
      	{
      		Scanner in1 = new Scanner(System.in); // in 변수
      		Scanner in2 = new Scanner(System.in); // in 변수
      		Scanner in3 = new Scanner(System.in); // in 변수
      		
      		System.out.println(in1.hashCode()); // 2137211482
      		System.out.println(in2.hashCode()); // 920011586
      		System.out.println(in3.hashCode()); // 920011586
      
      	}
      
      }
  • 그림과 코드

import java.util.Scanner;

public class Ex1
{

	public static void main(String[] args)
	{
		int[] arr1;
		int[] arr2;
		int[] arr3;
		
		arr1 = new int[] {1,2,3}; //배열 {1, 2, 3}을 생성하고  arr1 변수에 대입
		
		// 배열 {1, 2, 3} 생성하고 arr2 변수에 대입
		arr2 = new int[] {1, 2, 3};
		
		// 배열 변수 arr2의 값을 배열 변수 arr3에 대입 코드
		arr3 = arr2;
		System.out.println(arr1==arr2); // 주소값이 같은지를 비교 false
		 System.out.println(arr2==arr3); //true 주소값이 같음
	}

}

4. null과 NullPointerException

null

  • null 값 : 참조 타입 변수는 아직 번지를 저장하고 있지 않다는 뜻
  • null도 초기값으로 사용 가능하기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성

NullPointerException

  • 변수에 null인 상태에서 객체의 데이터나 메소드 사용 시 발생하는 에러
  • 참조변수가 객체를 정확히 참조하도록 번지 대입해야 해결됨
// 기본 타입 변수
String refVar2 = null;
System.out.println("refVar2 : "+refVar2.hashCode()); //NullPointerExpection

// 참조 타입 변수
int[] arr1 = null; //초기화로 사용 가능

5. 문자열 타입

String 타입

  • 재사용이 가능
Scanner in = new Scanner(System.in);
		 
String name=in.next(); // 계속 재사용 가능
String hobby = in.next();
System.out.println(name+"의 취미는 "+hobby);
  • == 은 String의 주소값을 비교하는 느낌
// 자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 설계 (리터럴 풀)
		
		String str1 = "자바";
		String str2 = "자바";
		
		// 등록된 값이 같다면... 새로운 공간을 만들지 않기에
		System.out.println(str1 == str2); // true가 나옴
		System.out.println(str1.hashCode()+" "+str2.hashCode()); //1631876 1631876
  • 만약 String을 따로 운영하고 싶다면 new로 연산자(객체 생성 연산자)로 직접 String 객체를 생성/대입 가능
// 따로 운영을 하고 싶다면
		String str3 = new String("자바");
		String str4 = new String("자바");
		System.out.println(str3 == str4); //false
		// 주소값 비교시 똑같지만 위가 false new로 인해 따로 운영가능
		System.out.println(str1.hashCode()+" "+str2.hashCode() );
  • 내부 문자열이 같은지 확인하는 법 : equals
// 내부 안에 문자열이 같은지 확인하는 법 equals
		
		boolean result = str1.equals(str4);
		boolean result2 = !str1.equals(str3);
		
		System.out.println("result : "+result); //문자열이 같은지 검사(대소문자 검사)

문자열 추출

  • charAt() 메소드
    • 문자열에서 매개값으로 주어진 인덱스의 문자를 리턴해 특정 위치의 문자를 얻을 수 있음
      • index는 항상 0부터 시작
      • 공백을 포함함

문자열의 길이

  • length() 메소드
    • 길이
// 주민등록번호에서 성별에 해당하는 7번째 문자를 읽어서 남자 또는 여자인지 판단하여 출력
		
		String ssn = "950624123012";
		
		char gender = ssn.charAt(6); // index는 항상 0부터 시작하므로 6번째 문자 지정
		int len = ssn.length(); //공백을 포함하여 세는 전체 길이 문자열 길이
		System.out.println("ssn 문자열의 길이 :"+len);
		
		switch(gender) {
		case '1' :
		case '3':
			System.out.println("남자");
			break;
		case '2':
		case '4':
			System.out.println("여자");
			break;
		default:
			break;
		}

문자열 대체

  • replace() 메소드
    • 기존 문자열은 그대로 두고, 대체할 새로운 문자열을 리턴
    • 갈아 엎는게 아니라 일부만 리턴
// 문자열 대체 : replace() 기존 문자열은 그대로 두고 새로운 문자열을 리턴한다.
		String oldStr = "자바 프로그래밍";
		String newStr = oldStr.replace("자바", "Java");
		System.out.println(newStr);
		System.out.println(oldStr == newStr); //false

문자열 잘라내기

  • subString() 메소드
    • 문자열에서 특정 위치의 문자열을 잘라내어 가져 오기
    • subString(int beginindex)
    • subString(int beginindex, int endindex)
public class String03
{

	public static void main(String[] args)
	{
		// 문자열 잘라내기 subString() : 특정 위치의 문자열을 잘라내어 가져온다.
		
		//subString(int beginindex)
		//subString(int beginindex, int endindex)
		
		String ssn ="960123-1057819";
		
		int len = ssn.length();
		System.out.println(len);
		// 나눌 공간 필요
		String firstNum = null;
		String secondNum = null;
		
		firstNum = ssn.substring(0, 6); //0부터 6까지를 잘라서 넣겠다
		secondNum = ssn.substring(7, len); //시작값만 주기
		
		System.out.println(firstNum);
		System.out.println(secondNum);
	}

}

문자열 찾기

  • indexOf()
    • 문자열에서 특정 문자열의 위치를 찾고자 할 때
**public class String04
{

	public static void main(String[] args)
	{
		// 문자열 찾기 기능 : 문자열에서 특정 문자열의 위치를 찾고자 할 때 indexOf() 사용
		// indexOf()는 주어진 문자열이 시작되는 인덱스 리턴
		
		String subject = "자바 프로그래밍은 재미있습니다. 유용하며 활용도가 높습니다. ";
		int index = subject.indexOf("유용");
		
		if(index == -1) { //index는 0부터 시작이니까
			System.out.println("해당 문자열이 존재하지 않습니다.");
		}
		else {
			// 원하는 문자열부터 끝까지 추출, substring(begining값) 검색어 추출
			String result = subject.substring(index);
			System.out.println(result); // 유용하며 활용도가 높습니다. 
		}
	}

}**

단순히 포함여부

  • contains()
// 주어진 문자열이 단순히 포함되어 있는지 없는지 여부 조사 : contains()
		
		boolean result2 = subject.contains("프로그래밍");
		System.out.println(result2); //true

문자열 분리

  • split()
    • 구분자가 있는 여러 개의 문자열을 분리할 때

      public class String05_split
      {
      
      	public static void main(String[] args)
      	{
      		String board ="1, 자바 학습,,참조타입, String을 학습중입니다., 홍길동";
      		
      		// 문자열 분리 ,를 기준으로 분리
      		String[] tokens = board.split(",");
      		
      		//인덱스별로 읽기
      		
      		System.out.println("번호 :"+tokens[0]);
      		System.out.println("제목 :"+tokens[1]);
      		System.out.println("내용1 :"+tokens[2]);
      		System.out.println("내용2 :"+tokens[3]);
      		System.out.println("성명 :"+tokens[4]);
      		
      		for(int i=0; i<tokens.length; i++) { // 일반 for문
      			System.out.println(tokens[i]);
      		}
      		
      		for(String string : tokens) { //foreach문
      			System.out.println(string);
      		}
       	}
      
      }

6. 배열(Array) 타입

배열

  • 연속된 공간에 값을 나열시키고, 각 값에 인덱스를 부여해 놓은 자료구조
  • 인덱스는 대괄호 [ ]와 함께 사용하여 각 항목의 값을 읽거나 저장하는데 사용

배열 변수 선언

  • 두가지 형태나 첫 번째가 관례적인 표기
타입[] 변수;
타입 변수[];
  • 배열은 힙 영역에 생성되고 배열 변수는 힙 영역배열 주소 저장
  • 참조할 배열이 없다면 배열 변수도 null로 초기화 수 있다

값 목록으로 배열 생성

  • 배열에 저장될 값의 목록이 있다면, 다음과 같이 간단하게 배열을 생성할 수 있음
타입[] 변수 = {0,1,2,3...};
  • score배열을 5개의 값을 저장할 수 있도록 인스턴스
    • =힙이라는 메모리 영역에 실제 값 할당
  • 배열 변수를 선언하는 시점과 목록이 대입되는 시점이 다르면 new 타입[]중괄호 앞에 붙여줌
    • 타입은 배열 변수 선언 시 사용하는 타입과 동일하게 지정

      변수 = new 타입[]{1,2,3,4...};

new 연산자로 배열 생성

  • 값의 목록은 없으나 미리 생성
타입[] 변수 = new 타입[길이];
  • new 연산자로 배열 처음 생성시 기본값으로 초기화

배열의 길이

  • length
배열이름.length;
  • 배열의 항목값 읽기
for(String str:season) {
			System.out.println(str);
		}

메서드 분리하여 내가 필요할 때마다 main 메서드로 부르기

  • 구조

  • 코드
public class StringArrayTest
{

	public static void main(String[] args)
	{
		// 문자열 배열 season 변수 선언과 배열 생성 초기값 
		// String[] season = new String[4];
		String[] season = {"Spring", "Summer", "Fail", "Winter"}; //메모리 생성 + 초기화
		
		//  인덱스 1번 항목의 값을 "여름"으로 변경하고 변경된 내용 출력
		season[1] ="여름";
		
		System.out.println(season[1]);
		printSeason(season);
	}
	
	public static void printSeason(String[] s) {
		// 배열의 항목값 읽기
				for(String str:s) {
					System.out.println(str);
				}
	}

}

7. 다차원 배열

다차원 배열

  • 배열 항목에는 또 다른 배열이 대입된 배열

    ws.com/secure.notion-static.com/8f524a14-c2a3-4355-bc5d-d66375992ff8/Untitled.png)
public class MultiArray01
{

	public static void main(String[] args)
	{
		// 예시 : 두 반의 학생의 점수를 저장하는 배열 선언
		//반 : 1차원배열, 해당 반의 학생점수
	
		int [][] scores = {{80,90,96}, {76,88}};
		
		// 1반의 1번 학생의 점수
		System.out.println(scores[0][0]);
		// 1반의 2번 학생의 점수
		System.out.println(scores[0][1]);
		// 1반의 3번 학생의 점수
		System.out.println(scores[0][2]);
		
		//2반의 1번 학생의 점수부터 차례로 출력
		System.out.println(scores[1][0]);
		System.out.println(scores[1][1]);
		
		// 반의 수 :
		System.out.println(scores.length);
		
		//1반의 학생의 수
		System.out.println(scores[0].length);
		//2반의 학생의 수
		System.out.println(scores[1].length);

	}

}

new 연산자로 다차원 배열 생성

  • new 연산자로 다차원 배열을 생성하려면
타입[][] 변수 = new 타입[1차원수][2차원수];

8. 배열 복사

배열 복사하기

  • 배열은 한 번 생성하면 길이를 변경할 수 없음
    • 더 많은 저장 공간이 필요하다면 더 큰 길이의 배열을 새로 만들고 이전 배열로부터 항목들을 복사해야 함
  • 예시1
public class ArrayCopy01
{

	public static void main(String[] args)
	{
		// 길이가 3인 정수형 배열
		int[] oldIntArray = {1, 2, 3};
		
		// 길이가 5인 정수형 배열
		int[] newIntArray = new int[5];
		
		// 배열 항목 복사
		for(int i =0; i<oldIntArray.length; i++) {
			newIntArray[i] = oldIntArray[i];
		}
		
		for(int num : newIntArray) {
			System.out.print(num + " ");
		}

	}

}
> ```

- 예시 2

```java
// 배열 항목 복사
		System.arraycopy(oldIntArray, 0, newIntArray, 0, oldIntArray.length);

9. 열거 타입(Enum)

한정된 값으로 이루어진 Enum 타입

  • 요일, 계절처럼 한정된 값을 갖는 타입
  • 먼저 열거 타입 이름으로 소스 파일 생성 후 한정된 값을 코드로 정의
  • 열거 타입 이름
    • 첫 문자 대문자
    • 캐멀 스타일

Quiz






회고

배열은 반복문과도 관련이 있는데 이 둘을 정확히 이해 하지 못하면 연관짓기는 힘들 것 같다. 멀티캠퍼스는 처음 배우시는 분들도 부트캠프에 꽤 많은데 나는 학교에서 배워서 알고 있는데 처음 배우면 여기서 부터 막힐 것 같다는 생각을 했다. 그래도 나는 학교에서 배울 때 C보다는 자바가 더 재미있고 좋더라.
자바 하나 떼고 나면 디자인 패턴이랑 알고리즘을 연관시켜서 공부하고 싶다. 나는 욕심이 많아서 이것저것 해보고 싶은게 많다. 어느정도 백엔드에 익숙해지면 백엔드랑 게임서버도 완전 다르지는 않다는데 꼭... 게임업계도 도전해보고 싶다. 어쩌다가 일본 8년차 게임 개발자를 알게 됐는데 너무 멋있더라. 나도 능력 있는 사람이 되도록 하루 하루 노력하자!!

profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다. gitbook에도 정리중 ~

0개의 댓글