[Java] Reference Type

게맛살맛게·2021년 12월 3일
0

Java

목록 보기
5/18
post-thumbnail

Java Types

  • 자료형의 종류



JVM의 메모리 구조


※ 기본 자료형은 변수명(식별자)와 값 모두 Stack에 저장
※ 기본 메모리는 Stack 영역에 메모리 할당

※ 리터럴은 StringPool에서 관리
ex) String s1 = "Java" : 힙 안에 StringPool에 "Java"가 저장되며 s1이 그곳을 참조
c.f. String s2 = new String("Java") : String 객체가 Heap에 생성 되며 s2가 그곳을 참조
이때 String s3 = "Java" 라고 한다면 s1과 s3는 같은 같은(StringPool내 같은) 곳을 가리킨다
s1 == s3 : true | s1 == s2 : false | s2.equals(s1) : true ※ equals() : 값의 비교

참조변수의 == !=

  • 참조변수의 == !=는 값이 같은지 비교하는 것이 아니라 동일한 객체를 참조하는지 확인
  • null : 참조하는 객체가 없음을 나타내는 상태




Reference Type

String

  • String의 Format - printf
    ex)
	String fruit = "사과";
	int total = 10;
	int eat = 3;
		
	System.out.println(total + "개의 " + fruit + "중에서 " + eat + "개를 먹었다.");
		
	// 템플릿 문자열
	System.out.printf("%d개의 %s 중에서 %d개를 먹었다.%n", total, fruit, eat);
    
	// 현재 이자율은 1.2% 입니다.
	float rate = 1.2f;
	String str = String.format("현재 이자율은 %.2f%% 입니다.", rate);
	System.out.println(str);

enum (열거형)

public enum 열거타입명 { 열거 상수, ... }
  • 몇가지로 한정된 값만을 가지는 경우
    ex) 요일, 계절, 성별
    c.f. 열거 상수는 모두 대문자로 작성 / 여러 단어로 구성될 경우 _로 연결 ex) RESULT_SUCCESS

  • 열거 객체의 메소드

실습

열거(enum) 생성

  • Enum Type 소스코드 생성
    패키지의 새로만들기 중 Enum 선택 후 이름 지정
  • Enum 구현
  • Enum 객체를 불러와 사용



Array (배열)

- 동일한 자료 유형의 여러 값들로 이루어진 객체(Object)
- new로 생성되는 참조 자료형

  • 배열을 선언하는 두가지 방법
    • 타입[] 변수;
    • 타입 변수[];
	int[] intArray; // = int intArray[];
	double[] doubleArray; // = double doubleArray[];
	String[] stringArray; // = String stringArray[];

Stack에 배열의 식별자(변수명)을 저장하고 실제 데이터는 Heap 공간에 저장하여
변수명이 배열의 첫 주소를 가지고(참조하고) 있음

  • 배열의 초기화
    • 값 목록 존재 시 {}으로 값 목록을 직접 초기화 가능
      타입 배열명[] = { 값0, 값1, 값2, ... };
      ※ 선언과 동시에 해주어야 허용 됨
    • new연산자를 활용한 초기화
      타입[] 배열명; 배열명 = new 타입[] { ... };
	// 1. 직접 초기화
	String[] days = {"월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"};
    
	// 2. new 연산자를 활용한 초기화
	String[] days;
	days = new String[] {"월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"};
  • 배열의 특징
    - 배열은 객체
    • 배열의 첨자는 배열의 크기를 의미
    • 배열의 이름은 참조 값
    • 배열끼리의 할당은 참조 값 복사 (같은 객체를 가리킴)

배열 복사

  • 직접 복사
	int source[] = {1,2,3};
	int target[] = new int[10];
    
	// 배열 복사
	for (int i = 0; i < source.length; ++i) {
		target[i] = source[i];
	}
결과 : target == {1, 2, 3, 0, 0, 0, 0, 0, 0, 0}
  • 시스템을 통한 복사
	int source[] = {1,2,3};
	int target[] = new int[10];
	
	System.arraycopy(
		source,			// 원본 배열
		0,			// 시작 인덱스
		target,			// 복사 대상 배열
		0,			// 대상 배열 인덱스
		source.length);		// 복사 할 길이
결과 : target == {1, 2, 3, 0, 0, 0, 0, 0, 0, 0}
  • 배열 자체 Method 이용
    target 배열의 크기와 상관 없이 source 배열을 그대로 복사하여 target에 할당(덮어쓰기)
	int source[] = {1,2,3};
	int target[] = new int[10];
	target = source.clone();
결과 : target == {1, 2, 3}
  • Arrays를 활용한 복사
    추후 예정

2차원 배열

  • 생성
    타입[][] 변수 = { {...}, {...}, ... }
		// 2차원 배열 선언
		int twoDimen[][] = new int[5][10];		// 5행 10열 배열
		
		// 기본데이터가 있을 때
		int[][] table = {
				{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 },		// 1행
				{ 2, 3, 4, 5, 6, 7, 8, 9, 0, 1 },		// 2행
				{ 3, 4, 5, 6, 7, 8, 9, 0, 1, 2 },		// 3행
				{ 4, 5, 6, 7, 8, 9, 0, 1, 2, 3 }		// 4행
		};
		
		// 행 배열 확인 (0 ~ table.length-1)
		System.out.println("table.lenght:" + table.length);		// table.lenght:4
		// 열 배열 확인
		System.out.println("table[2].length:" + table[2].length);	// table[2].length:10
		
		int sum = 0;
		
		for (int row = 0; row < table.length; ++row) {
			for (int col = 0; col < table[row].length; ++col) {
				System.out.printf(table[row][col]+" ");
				sum += table[row][col];
			}
			System.out.println();
		}
		
		System.out.println("요소의 합:" + sum);
					/*
					1 2 3 4 5 6 7 8 9 0 
					2 3 4 5 6 7 8 9 0 1 
					3 4 5 6 7 8 9 0 1 2 
					4 5 6 7 8 9 0 1 2 3 
					요소의 합:180 */
profile
IT 기술블로그

0개의 댓글