티스토리 뷰

 

자료형

-기본 자료형(8) : byte, short, int, long, float, double, char, boolean

-참조 자료형(∞) : String, 배열, 열거, 클래스/인터페이스

 

참조형 변수

선언할 때 크기를 알 수 없음. 데이터를 대입하기 전까진.

참조형 변수 크기는 무조건 4byte. 왜냐하면 참조형 변수는 배열의 값이 있는 주소를 갖기 때문에.

int[] a;
a = new int[10];
String str;

위 3개의 크기는 전부 4 byte. 주소값.

package test0126;
public class ArrayTest01 {
	static void sum(int[] a, int[] b) { // 배열의 주소값 가져옴
		for(int i=0; i<a.length; i++) {
			a[i] += b[i]; // a[i] = a[i] + b[i];
			System.out.print(a[i]+" ");
		}
	}//static void sum
	public static void main(String[] args) {    //각 배열 선언 및 초기화
		int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
		int[] b = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
		
		// 두 개를 더하거나 빼는 메소드
		sum(a, b);
		System.out.println();
		for(int i=0; i<a.length; i++) {
			System.out.print(a[i]+" ");
		}
	} //public
}

 


1. 배열

연속된 공간에 데이터 저장. 같은 형의 데이터가 여러 개 있을 때 한번에 처리하기 위해 배열 사용.

동일한 자료형만 묶어서 저장 가능. 생성 시 크기를 지정하면 이후 크기 변경 불가.

 

(1) 선언

자료형[] 변수명;   //Java 방식
자료형 변수명 [];  //C 방식

 

(2) 메모리

class 영역
static 영역
final 영역

Method 영역
stack Heap
변수 공간이 만들어지는 곳
실제 배열 값이 들어있는 주소 저장.
동적 메모리
실제 배열 값 저장되는 공간.

2. 1차원 배열

(1) 배열 객체 생성

int[] a = new int[n];

└배열 객체 생성할 때 크기를 설정해야 함.

└Stack 영역 : 배열변수 a 공간 할당. 실제 배열 객체가 저장된 공간의 첫번째 주소(indext[0]) 저장.

└Heap 영역 : 실제 배열값을 저장할 수 있는 공간 할당.

Stack Heap
배열변수 a
실제 배열 객체가 저장되는 주소 저장.
a[0]
a[ ] = { ... }

-new : heap 메모리에 넣어라

-index 번호는 a가 가리키는 곳으로부터 얼마나 떨어져 있는가. a[0], a[1], a[2], …, a[n-1]

 

(2) 배열 객체 생성과 값 대입

*stack 메모리는 초기값을 부여하지 않으면 출력 불가능.

*heap 메모리는 초기값을 부여하지 않으면 default값(숫자는 0, boolean은 false, 참조 자료형은 null)

 

-type_1 : 배열 객체 생성 + 값 대입

int[] a = new int[3]; 
a[0]=3; // stack 영역은 초기화해주지 않으면 값 안 들어감.
a[1]=4; 
a[2]=5;
        
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);

 

-type_2 : 초기값 세팅. 배열 길이(크기 생략)

//int[] b = new int[3] {10, 20, 30}; // 오류 : 배열크기와 초기값 모두 입력
int[] b = new int[] {10, 20, 30};

System.out.println(b[0]);
System.out.println(b[1]);
System.out.println(b[2]);

 

-type_3 : 선언 시 반드시 값 입력

int[] c = {5, 6, 7};

System.out.println(c[0]);
System.out.println(c[1]);
System.out.println(c[2]);

 

-type_4 : 참조 자료형 변수 복사

배열 값이 있는 위치(번지) 복사(*기본 자료형의 변수 복사는 '값'을 복사)

int[] a = {5,3,6};
int[] d;  //지역변수 선언만 한 상태. 값 초기화 안 되면 오류. 읽기 불가
//d = new int[3]; // 값 초기화1
d = a; // 값 초기화2. a와 같은 배열을 가리킴. 배열의 주소를 가리키는 변수. 참조변수.
d[0] = 100;
a[1] = 50;
        
System.out.println(d[0]);  //100
System.out.println(d[1]);  //50
System.out.println(d[2]);  //6

 

-type_5 : 반복문

for문을 이용해 데이터 입력

_예제) 1 ~ 100까지 데이터를 가진 배열 선언과 데이터 입력

int[] a = new int[100]; //선언

for(int i=0; i<a.length; i++){ //i는 인덱스
    a[i] = i+1;  // 배열 값
    System.out.printf("a[%d] = %d", i, a[i]);
}

 

_예제) 0~99까지 수 10개를 랜덤하게 뽑아 배열값으로 입력

int[] score = int[10];
for(int i=0; i<score.length; i++){
    score[i] = (int)(Math.random()*100);
    System.out.printf("a[%d] = %d\n", i, score[i]);
}

└Math.random() : 0.0 이상 ~ 1.0 미만 사이의 실수 값을 랜덤으로 반환하는 함수

└(int)(Math.random) : 랜덤 값을 정수 자료형을 변환

 

_예제) 배열 객체 요소 중 유효한 것만 출력하기

배열 값이 있는 것만 출력한다는 뜻

double[] data1 = new double[5];
int size = 0;
		
data[0] = 10.0; size++;
data[1] = 20.0; size++;
data[2] = 30.0; size++;
		
for(int i=0; i<size; i++) {
    System.out.println(data[i]);
}

 

_예제) 알파벳  A ~ Z까지 저장 후 정수 값(아스키 코드값)으로 출력

char[] apb = new char[26];
char ch = 'A'; // 알파벳
for(int i=0; i<apb.length; i++, ch++) {
    apb[i] = ch;
    System.out.print("apb["+i+"] = "+apb[i]+" ");
    System.out.println((int)apb[i]);
}

3. 2차원 배열

1차원 배열을 여러 개 모아놓은 것(묶어놓은 것). 메모리 데이터를 1차원으로만 저장 가능.

2차원 데이터를 저장하기 위해서는 1차원(행 단위)로 나누어 저장(1차원 배열을 원소로 가지는 1차원 배열)

 

(1) 정방행렬 대입

-정방행렬 : 가로 및 세로 방향으로 정렬된 배열

-type_1 : 배열 객체 생성 및 값 대입

int[][] a = new int[2][2];

a[0][0] = 1;
a[0][1] = 2;
a[1][0] = 3;
a[1][1] = 4;

 

-type_2 : 배열 객체의 행 성분(1차원 배열)만 생성

int[][] a = new int[2][];
a[0] = new int[3]; //1행에 열 3개인 배열
a[0][0] = 1; a[0][1] = 2; a[0][2] = 3; 

a[1] = new int[3]; //2행에 열 3개인 배열
a[1][0] = 4; a[1][1] = 5; a[1][2] = 6;

 

-type_3 : 값 대입

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

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

for(int i=0; i<c.length; i++ ) {//행(인덱스)의 크기만큼
    for(int j=0; j<c[i].length; j++) { //열의 크기만큼
        System.out.print(c[i][j]+" ");
    }
    System.out.println();
}

_예제) 2차원 배열에 데이터 입력

int[][] a = new int[2][3];
		
int value=1;
for(int i=0; i<a.length; i++ ) {//행(인덱스)의 크기보다
    for(int j=0; j<a[i].length; j++) { //열의 크기보다
        a[i][j] = value++;
        System.out.print(a[i][j]+" ");
    }
    System.out.println();
}

 

(2) 비정방행렬

행마다 열의 개수가 다름

-type_1 : 2차원 배열 객체의 행 성분(1차원 배열)만 생성 → 각 행에 열 성분(1차원 배열) 생성

//1
int[][] a = new int[2][];
a[0] = new int[2];
a[0][0] = 1; a[0][1] = 2; 

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

//2
int[][] b = new int[2][];
b[0] = new int[] {1, 2, 3};
b[1] = new int[] {4, 5, 6, 7};

 

-type_2 : 대입 값만 입력

//1
int[][] c = {{1, 2}, {3, 4, 5}, {7, 8, 9, 10}};

//2
int[][] d = new int[][]{{1, 2, 3}, {4}, {5, 6, 7, 8, 9}};

 

-type_3 : for문 이용해 입력

정방행렬이 아닐 경우 주로 사용. 1차원 크기가 각각 다를 때

int[][] b = new int[3][];
b[0] = new int[7];
b[1] = new int[3];
b[2] = new int[4];
int value=1;
		
for(int i=0; i<b.length; i++ ) {//행(인덱스)의 크기만큼
    for(int j=0; j<b[i].length; j++) { //열의 크기만큼
        b[i][j] = value++;
        System.out.print(b[i][j]+" ");
    }
    System.out.println();
}

3. 행렬의 곱셈

2차원 배열. (A행렬의 열 == B행렬의 행)이어야 곱셈을 할 수 있음.

1 2 3
4 5 6
1 2
3 4
5 6

A x B = (1행1열 : 1*1 + 2*3 + 3*5 / 1행2열 : 1*2 + 1*4 + 1*6)

           (2행 1열 : 4*1 + 4*3 + 4*5 / 2행 2열 : 4*2 + 4*4 + 4*6)

int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] b = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
		
// 두 개를 더하거나 빼는 메소드
sum(a, b);
System.out.println();
for(int i=0; i<a.length; i++) {
    System.out.print(a[i]+" ");
}

_예제) 입력받은 두 행렬을 곱하여 출력

Scanner sc7 = new Scanner(System.in);
int[][] mtx1 = new int[3][3];
int[][] mtx2 = new int[3][3];
		
System.out.println("첫번째 행렬의 값, 총 9개 입력");
for(int i=0; i<mtx1.length; i++) {
    for(int j=0; j<mtx1.length; j++) {
        mtx1[i][j] = sc7.nextInt();
        System.out.print(mtx1[i][j]+" ");
    }
    System.out.println();
}

System.out.println("두번째 행렬의 값, 총 9개 입력");
for(int i=0; i<mtx2.length; i++) {
    for(int j=0; j<mtx2.length; j++) {
        mtx2[i][j] = sc7.nextInt();
        System.out.print(mtx2[i][j]+" ");
    }
    System.out.println();
}
System.out.println();
		
System.out.println("두 행렬의 곱셈");
for(int i=0; i<mtx1.length; i++) {
    for(int j=0; j<mtx2.length; j++) {
        System.out.print(mtx1[i][j]*mtx2[j][i]+ " ");
    }
    System.out.println();
 }

4. 배열 : main() 메소드 매개변수

프로젝트 시작점 : 메인 메소드(메인 함수)

public static void (String[] args) {  }

-public : 어디서든 부를 수 있다.

-static : 객체를 만들지 않아도 이 메소드를 쓸 수 있다.

-void : 함수를 종료한 뒤에 리턴 값이 없다.

-String[]

-args : 메인 함수에 들어갈 때 처음 넣어주는 매개변수. argument

 

(이클립스에서 하는 방법)

run > run configurations > Arguments > Program arguments : Hello Java 1.8 > apply > run

처음 프로그램 실행될 때 전달하는 문자열(String)

package test0125;
public class MainMethodTest {
	public static void main(String[] args) { //메인함수
	}
}

'수업 > └Java' 카테고리의 다른 글

[CH06_1]클래스 기본 문법  (0) 2022.01.31
[CH05_2]참조 자료형 : String  (0) 2022.01.31
[CH04_02]제어문 : 반복문  (0) 2022.01.30
[CH04_1]조건문 실습 예제_책  (0) 2022.01.30
[CH04_01]제어문 : 조건문  (0) 2022.01.30
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함