Study Java

형변환과 배열

SangJune238 2025. 1. 14. 21:59

형변환

형변환은 자료형을 다른 자료형으로 변경해주는 것으로 자동형변환과 명시적형변환(강제형변환)으로 나뉜다.

 

자동형변환

자동형변환은 두 개 이상의 자료형을 연산할 때 하나의 자료형으로 일치시켜야 연산이 가능하기 때문에 데이터 손실이 적은 방향으로 컴파일러가 직접 형변환을 해주는 것을 말한다.  자동형변환은 주로 작은 범위의 타입을 큰 타입으로 변환시켜서 데이터 손실이 없게 만든다.

 

byte a = 12;
short b = a;
int c = b;
long d = c;
System.out.println(d); // -> 12

 

위 코드와 같이 값은 12로 동일하게 나오는데 자료형의 크기가 1byte, 2byte, 4byte, 8byte로 자료형의 크기가 큰것으로 변환이 된다.

 

문자형인 char은 정수 타입인 int로 자동형변환이 가능합니다.

char ch = 'A';
int charNum = ch;

System.out.println(charNum); // -> 65

문자형인 char을 정수 타입인 int로 자동형변환을 진행하면 문자형의 ASCII(아스키코드)를 기준으로 자동형변환이 진행됩니다.

 

명시적형변환(강제형변환)

명시적형변환은 값의 범위가 큰 자료형을 값의 범위가 작은 자료형으로 변환할 때 컴파일러가 자동으로 이를 수행해주지 않기 때문에 프로그래머가 데이터 손실을 감수하고 강제로 직접 형변환을 진행시켜주는 것을 말한다. 

int num1 = 34;
double doubleNum = a;
double num2 = 3.14;
int intNum = (int)num2;

System.out.println(doubleNum); // -> 34.0 
System.out.println(intNum); // -> 3

 

doubleNum은 자동형변환을 진행하였고 intNum은 명시적형변환을 진행하였습니다.

doubleNum타입은 실수형이기 때문에 34.0으로 출력되고 int타입은 정수형이기 때문에 3으로 출력이 되었습니다.

//강제형변환
타입 변수명 = (변경하려는 타입)변수명

 

 

배열

변수는 하나의 공간에 하나의 값을 담을 수 있지만 배열은 하나의 공간에 여러개의 '같은 자료형의 값'을 담을 수 있는 개념이다. 정확하게 얘기하자면 배열의 각 인덱스 자리에 실제 값이 담긴다.

그렇다면 배열은 왜 사용할까?

변수만을 사용하게 되면 대량의 데이터를 보관하고자 할 때 각각의 변수를 만들어서 따로 보관하기 때문에 많은 변수가 필요하고 코드도 길어지게 된다. 변수도 적게 하고 코드도 줄이기 위해서 배열을 사용한다.

 

/*
* 1. 배열선언(여러개의 값들을 보관할 배열을 만든다. -> 참조변수 선언)
* 자료형[] 배열이름;
* 자료형 배열이름[];
*/
         
int[] arr;
		
/*
* 2. 배열 할당 (해당 배열에 몇개의 값들을 보관할 것인지 메모리 크기를 지정하는 과정)
* 배열명 = new 자료형[크기(길이)];
*/
arr = new int[5];

 

public static void main(String[] args) {
		// int형 변수 5개를 만들어서 0~4의 값을 각각 할당해보자
		int num1 = 0;
		int num2 = 1;
		int num3 = 2;
		int num4 = 3;
		int num5 = 4;
		
		int[] arr1 = new int[5];
		arr1[0] = 0;
		arr1[1] = 1;
		arr1[2] = 2;
		arr1[3] = 3;
		arr1[4] = 4;
		
		int[] arr2 = {0,1,2,3,4};
        
		/*
		 * 값을 대입하고 가져와서 사용
		 * -> index를 이용해서 접근하면 된다.
		 */
		
		arr[0] = 10;
		arr[1] = 20;
		arr[2] = 30;
		arr[3] = 40;
		arr[4] = 50;
		
		for(int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		
		//for loop
		for(int num : arr) {
			System.out.println(num);
		}
  	    int i = 10;
		int[] iArr = new int[5];
		System.out.println(iArr.hashCode());
		
		double[] dArr = new double[3];
		System.out.println(dArr.hashCode());
		
		/*
		 * 실제 리터럴값을 곧바로 담을 수 있는 변수를 일반변수
		 * 주소값을 담고있는 변수는 참조변수(래퍼런스 변수)라고 표현
		 * 
		 * 기본자료형(원시타입) : int, double, float, char, long...
		 *  => 실제 리터럴값을 바로 담을 수 있음
		 *  
		 *  그외 자료형(String, Scanner, int[], double[], char[]...) -> 참조변수
		 *   => 메모리크기가 가변적이기 때문에
		 */
		
		for(int j = 0; j < iArr.length; j++) {
			System.out.println(iArr[j]);
		}
		for(int j = 0; j < dArr.length; j++) {
			System.out.println(dArr[j]);
		}
		
		//내가 각 인덱스의 초기화를 하지 않아도 값들이 담겨있음
		// heap이라는 메모리 공간은 절대 빈공간을 허용하지 않는다.
		// => 공간이 만들어질 때 JVM이 기본값으로 모두 초기화 함.
		
		System.out.println(iArr); //자료형 + @ + 주소값의 16진수 해시코드
		System.out.println(iArr.hashCode()); //주소값의 10진수 형태
		
		int[] arr = null; //아무것도 참조하고 있지 않음
		System.out.println(arr);
		
//		arr.hashCode(); 
		
		/*
		 * arr.hashCode();
		 * null을 가지고 있는 참조변수에 접근해서 다른 정보를 구하고자하면 (함수를 실행하면)
		 * 항상 오류가 발생한다.
		 * 
		 * 
		 * NullPointerException => 참조변수가 가지고있는 주소값이 없음
		 */
		
		arr = new int[5];
		/*
		System.out.println(arr[5]);
		배열에 부적절한 인덱스를 제시하면 발생하는 에러
		ArrayIndexOutOfBoundsException
		*/
		
		//배열의 가장 큰 단점
		// - 한번 지정된 배열의 크기는 변경이 불가
		// -> 배열의 크기를 변경하고자 한다면 다시 만들어야한다.
		System.out.println(arr.hashCode());
		
		arr = new int[10];
		System.out.println(arr.hashCode());
		//주소값이 변경된다 -> 새로운 공간을 할당한다.
		
		/*
		 * 연결이 끊어진 기존 배열은 Heap영역에 둥둥 떠다닌다. (어떤 변수에도 참조되지 않는 상태, 불러올 수 없는 메모리)
		 * => 일정시간이 지나면 "GC(가비지컬렉터)"가 알아서 회수한다.
		 * => 자바에서의 "자동메모리관리" 특징 => 개발자가 코드에만 집중할 수 있다.
		 * 
		 */
		
		arr = null;
		//배열을 강제로 삭제시키고자한다면 null을 대입해주면 된다.
		
		int[] arr2 = {1,1,1,1,1};
		int[] arr3 = {1,1,1,1,1};
		System.out.println(arr2 == arr3);
		//false -> 각 참조변ㅅ는 ==를 통해서 비교시 주소값을 비교하기 때문
		
		arr3 = arr2;
		System.out.println(arr2 == arr3);
		//true
		arr3[0] = 100;
		arr2[1] = 200;
		
		System.out.println(arr2[0] + ", " + arr3[1]);
   
	}

 

배열의 복사

 

        Scanner sc = new Scanner(System.in);
		/*
		int[] origin = {1, 2, 3, 4, 5};
		
		System.out.println("==원본배열 출력==");
		for(int value : origin) {
			System.out.print(value + " ");
		}
		System.out.println(); //개행
		//단순하게 origin을 다시 대입시켜 copy배열 생성
		int[] copy = origin;
		System.out.println("==복사본배열 출력==");
		for(int value : copy) {
			System.out.print(value + " ");
		}
		copy[2] = 99;
		System.out.println("\n복사본 값 변경");
		
		System.out.println("==원본배열 출력==");
		for(int value : origin) {
			System.out.print(value + " ");
		}
        
        
        
        //copy의 값만을 수정해도 원본의 값이 함께 변경된다.
		//왜? origin과 copy가 같은 메모리를 참조하고 있기 때문(참조변수의 주소값이 동일)
		//얕은 복사 : 주소값 복사

		//배열복사 방법
		/*
		 * 1. for문을 활용한 방법
		 * 새로운 배열을 만들어서 반복문을 통해 원본 배열의 값들을 새로운 배열에 대입
		 */
		

		int[] origin = {1, 2, 3, 4, 5};
		int[] copy = new int[origin.length];
		
		for(int i = 0; i < origin.length; i++) {
			copy[i] = origin[i];
		}
		copy[2] = 99;
		
		System.out.println("==원본배열 출력==");
		for(int value : origin) {
			System.out.print(value + " ");
		}
		
		System.out.println("\n==복사본배열 출력==");
		for(int value : copy) {
			System.out.print(value + " ");
		}

 

 

2차원 배열

2차원 배열은 자료형이 같은 1차원 배열의 묶음으로 배열안에 다른 배열이 존재합니다

1차원 배열크기 :m , 1차원 배열의 개수 :n
자료형[][] 배열명 = new 자료형[n][m]
	/*
	 * 2차원 배열
	 * 자료형이 같은 1차원배열의 묶음으로 배열안에 다른배열이 존재한다.
	 * 2차원 배열은 할당된 공간마다 인덱스번호를 두개 부여
      	 * (앞번호는 몇번째 1차원배열인지(행), 뒷번호는 1차원배열의 몇번째 index인지(열)) 
	 */
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		/*
		 * 1, 2차원 배열 선언(1차원 배열의 묶음을 참조하는 2차원 배열 참조변수 만들기)
		 * 자료형[][] 배열명;
		 * int[][] arr;
		 */
		
		/*
		 * 2. 배열할당(실제 m크기의 1차원배열 n개를 만들어서 참조)
		 * 배열명 = new 자료형[n][m];
		 * 
		 * 1차언배열의 참조변수들을 먼저 생성할 수 있다.
		 * 배열명 = new 자료형[n][];
		 * arr[0] = new 자료형[m];
		 * arr[1] = new 자료형[m];
		 * arr[2] = new 자료형[m];
		 */
		
		//배열의 선언과 동시에 할당
		int[][] arr = new int[3][2];
		
		arr[0][0] = 3;
		arr[0][1] = 2;
		arr[1][0] = 7;
		arr[1][1] = 4;
		arr[2][0] = 6;
		arr[2][1] = 1;
		
		//전체 출력
		//for문을 중첩하면 편리하게 전체를 출력할 수 있음
		for(int i = 0; i < arr[0].length; i++) {
			System.out.print(arr[0][i]);
		}
		
		for(int i = 0; i < arr[1].length; i++) {
			System.out.print(arr[1][i]);
		}
		
		for(int i = 0; i < arr[2].length; i++) {
			System.out.print(arr[2][i]);
		}
		
		for(int j=0; j < arr.length; j++) {
			for(int i = 0; i < arr[j].length; i++) {
				System.out.print(arr[j][i]);
			}
		}
	}

'Study Java' 카테고리의 다른 글

접근제한자  (5) 2025.01.16
메서드, 클래스  (3) 2025.01.15
Java 프로젝트 생성  (2) 2025.01.07
Java, eclipse 설치  (5) 2025.01.07