학원 14일차 - Java

·2021년 4월 15일
0
post-thumbnail

2021.04.15

배열의 차원

  • 1차원 배열
  • 2차원 배열
  • 3차원 배열
  • .....
  • N차원 배열
  • 1차원 배열
//1차원 배열
int[] num1 = new int [5];

//1차원배열 초기화
num1[0] = 10;
num1[1] = 20;
num1[2] = 30;
num1[3] = 40;
num1[4] = 50;
num1[5] = 60;

  • 2차원 배열
//2차원 배열
int[][] num2 = new int [3][4]; //3층 4칸 > 12개방
//2차원배열 초기화
num2[0][0] = 10; 
num2[0][1] = 20; 
num2[0][2] = 30; 
num2[0][3] = 40;

num2[1][0] = 50; 
num2[1][1] = 60; 
num2[1][2] = 70; 
num2[1][3] = 80;

num2[2][0] = 90; 
num2[2][1] = 100; 
num2[2][2] = 110; 
num2[2][3] = 120;	

  • 3차원 배열
//3차원 배열
int[][][] num3 = new int [2][3][4]; //2개동 3층 4칸 > 24개방

//3차원배열 초기화
num3[0][0][0] = 10;
num3[0][0][1] = 20;
num3[0][0][2] = 30;
num3[0][0][3] = 40;

num3[0][1][0] = 50;
num3[0][1][1] = 60;
num3[0][1][2] = 70;
num3[0][1][3] = 80;

num3[0][2][0] = 90;
num3[0][2][1] = 100;
num3[0][2][2] = 110;
num3[0][2][3] = 120;


num3[1][0][0] = 510;
num3[1][0][1] = 520;
num3[1][0][2] = 530;
num3[1][0][3] = 540;

num3[1][1][0] = 550;
num3[1][1][1] = 560;
num3[1][1][2] = 570;
num3[1][1][3] = 580;

num3[1][2][0] = 590;
num3[1][2][1] = 5100;
num3[1][2][2] = 5110;
num3[1][2][3] = 5120;


다차원 배열 탐색

  • 1차원배열 -> 단일 for문
for(int i=0; i<num1.length; i++) {
    System.out.printf("%5d",num1[i]);
}
System.out.println();
  • 2차원배열 -> 2중 for문
for(int i=0; i<num2.length; i++) {
    for(int j=0; j<num2[0].length; j++) {

        //System.out.printf("i: %d, j: %d",i,j);
        System.out.printf("%5d",num2[i][j]);
    }
    System.out.println();
}
System.out.println();
  • 3차원배열 -> 3중 for문
for(int i=0; i<num3.length; i++) {
    for(int j=0; j<num3[0].length; j++) {
        for(int k=0; k<num3[0][0].length; k++) {
            System.out.printf("%5d",num3[i][j][k]);
        }
        System.out.println();
    }
    System.out.println();
}
System.out.println();

2차원배열의 길이(방 갯수)

//int[][] num2 = new int [3][4]; //3층 4칸 > 12개방
System.out.println(num2.length); //3 -> 층

System.out.println(num2[0].length); //4 -> 방 => [0]으로 써주는 방법을 사용
//System.out.println(num2[1].length); //4 -> 방		
//System.out.println(num2[2].length); //4 -> 방


배열 초기화 리스트

  • 1차원배열
int[] num1 = new int[] { 10, 20, 30, 40, 50 };
  • 2차원배열(2x3)
//A.
int[][] num2 = new int[][] {{ 10, 20, 30 },{ 40, 50, 60 }};

//B.
int[][] num2_1 = new int[][] {
    { 10, 20, 30 },
    { 40, 50, 60 }
};
  • 3차원배열(2x3x4)
//A.
int[][][] num3 = new int[][][] {{{ 10, 20, 30, 40 }, { 10, 20, 30, 40 }, { 10, 20, 30, 40 }}, {{ 10, 20, 30, 40 }, { 10, 20, 30, 40 }, { 10, 20, 30, 40 }}};									
//B.
int[][][] num3_1 = new int[][][] {
    {
        { 10, 20, 30, 40 },
        { 10, 20, 30, 40 },
        { 10, 20, 30, 40 }
    },
    {
        { 10, 20, 30, 40 },
        { 10, 20, 30, 40 },
        { 10, 20, 30, 40 }
    }
};

실습

private static void m3() {
    // 5x5 배열
    int[][] num = new int[5][5];

    int n = 1;

    //입력
    for(int i=0; i<5; i++) {  
        for(int j=0; j<5; j++) {
            num[i][j] = n; //가로로 증가
            n++;
            //System.out.printf("i : %d, j:%d\n", i, j);
        }
    }

    output(num);
}


private static void output(int[][] num) {
    // 출력
    for(int i=0; i<5; i++) {  
        for(int j=0; j<5; j++) {
            System.out.printf("%3d", num[i][j]);
        }
        System.out.println();
    }
    System.out.println();
}

private static void m3() {

    // 5x5 배열
    int[][] num = new int[5][5];

    int n = 1;

    //입력
    for(int i=0; i<5; i++) {  
        for(int j=0; j<5; j++) {
            num[j][i] = n;  //세로로 증가
            n++;
            //System.out.printf("i : %d, j:%d\n", i, j);
        }
    }
    output(num);
}


private static void output(int[][] num) {

    // 출력
    for(int i=0; i<5; i++) {  
        for(int j=0; j<5; j++) {
            System.out.printf("%3d", num[i][j]);
        }
        System.out.println();
    }
    System.out.println();
}

private static void m3() {

    // 5x5 배열
    int[][] num = new int[5][5];

    int n = 1;

    //입력
    for(int i=0; i<5; i++) {  
        for(int j=0; j<=i; j++) {
            num[i][j] = n; //가로로 증가
            n++;
            //System.out.printf("i : %d, j:%d\n", i, j);
        }
    }
    output(num);
}


private static void output(int[][] num) {

    // 출력
    for(int i=0; i<5; i++) {  
        for(int j=0; j<5; j++) {
            System.out.printf("%3d", num[i][j]);
        }
        System.out.println();
    }
    System.out.println();
}


클래스, Calss

  1. 절차지향 프로그래밍
    • C
  2. 객체지향 프로그래밍
    • C++, Java, C# 등등...
  3. 함수형 프로그래밍
    • F#, Kotlinm, Java(일부 기술)
  • 클래스

  • 코드의 집합

  • 클래스 사용 이유

    • 데이터 집합이 필요해서
    • 행동 집합이 필요해서
    • 데이터 + 행동 집합이 필요해서
  • 클래스 사용
    1. 클래스 선언하기(정의하기)
    2. 객체 생성하기
    3. 객체 사용하기

클래스 정의하기


//프로그램 실행 : 프로젝트 내의 모든 클래스 정의 읽기(인식 단계, Class Loading) -> main() 메소드 실행

public class Ex29_Class {

    //main : 프로그램의 시작점!!
    public static void main(String[] args) {
        
    }//Ex29_Class
}//main

class Point { //클래스 헤더 : 식별자 + 규칙 정의

    //클래스 바디 -> 구현부

    //클래스 멤버(멤버 변수, 멤버 메소드)를 구현한다.(★★★★★★★)

    //멤버 변수
    int a;

    //멤버 메소드
    public static void test() {
        
    }
    
}//Point

클래스사용 > 객체 생성하기

//객체 생성하기
//클래스명 클래스변수명 = new 클래스명();
//자료형 변수명 = 객체생성자 생성자;

Point p1 = new Point();

String s1 = "홍길동";

int[] n1 = new int[2];

//참조형 > 클래스
//Point -> 클래스
//String -> 클래스
//int[] -> 클래스

//자료형
// - 데이터의 형식+길이를 정의해놓은 규칙

//Point(클래스)를 자료형이라고 부르는 이유?
//1. 변수를 만들었으니까
// - 변수 앞에는 자료형이 온다 > 변수가 그 형태의 데이터만 저장할 수 있기 때문
//2. Point라는 자료형을 형태로 만들어서 설계 >  데이터를 저장하는 공간에 규칙을 정의 

//Point 클래스의 객체(인스턴스)를 생성했습니다.
//p1 = 집합(x,y)


클래스 사용의 장점

요구사항] 지도 -> 우리집 좌표 저장 + 관리

  • Case 1 - 변수 사용
    • 대량으로 관리하기가 힘들다.
    • 물리적 구조가 집합이 아니다.
    • 식별자 관리하기가 힘들다.
//우리집
int x = 100;
int y = 200;

System.out.printf("우리집은 (%d, %d)에 위치합니다.", x, y);

//마트
int x2 = 300;
int y2 = 400;
System.out.printf("마트는 (%d, %d)에 위치합니다.", x2, y2);
  • Case 2 - 배열 사용
    • 물리적인 집합 구조를 제공한다. > 관리가 용이하다.
    • 다량의 데이터 관리에 용이하다.
    • 첨자로는 의미를 알기 힘들다.
//우리집
int[] a1 = new int[2];
a1[0] = 100; //x
a1[1] = 200; //y

System.out.printf("우리집은 (%d, %d)에 위치합니다.", a1[0], a1[1]);

//마트
int[] a2 = new int[2];
a2[0] = 300;
a2[1] = 400;

System.out.printf("마트는 (%d, %d)에 위치합니다.", a2[0], a2[1]);
//2차원 배열
int[][] alist = new int[2][2];

alist[0][0] = 100;
alist[0][1] = 200;

alist[1][0] = 300;
alist[1][1] = 400;

//2차원 배열안에 1차원 배열 대입★
int[][] alist2 = new int[2][2];

alist2[0] = a1;
alist2[1] = a2;

//마트의 y좌표값? > alist2[1][1] > 배열 어디에 저장되있는지 알기 어렵다.

1. int a = 10;
	- a의 자료형? > int

2. int[] a = new int[3];
   - a의 자료형? > int[]
   - a[0]의 자료형? > int

3. int[][] a = new int[3][3];
   - a의 자료형? > int[][]
   - a[0]의 자료형? > int[]
   - a[0][0]의 자료형? > int
  • Case 3 - 클래스 사용 > 객체 생성& 사용하기
    • 물리적인 집합 > 제공 > 관리 용이
    • 다량의 데이터 > 순차 접근 의미 > 좋지 않음(X) > 배열과 목적이 다르다.
    • 의미(가독성) > 같은 클래스로부터 만들어진 객체내의 변수는 이름이 동일하다. > 접근 편의성!!
public class Ex29_Class {
    public static void main(String[] args) {

        //우리집 좌표
        Point p1 = new Point();

        p1.x = 100;
        p1.y = 200;

        System.out.printf("우리집은 (%d, %d)에 위치합니다.", p1.x, p1.y);


        //마트
        Point p2 = new Point();

        p2.x = 300;
        p2.y = 400;

        System.out.printf("마트는 (%d, %d)에 위치합니다.", p2.x, p2.y);
        
    }//main
}


//설계도
class Point {
	
	public int x;
	public int y;
	
}


상황에 따른 클래스 vs 배열

데이터를 집합(단위)화가 되어야한다면 배열 또는 클래스를 사용해야한다.

  • 배열
    • 같은 자료형 + 같은 의미
  • 클래스(=구조체)
  • 다른 자료형(다른 의미) + 하나의 집합(각각의 다른 데이터가 결론적으로 하나의 목적을 가지고 있다.)
public class Ex29_Class {
    public static void main(String[] args) {

        //상황1] 지도의 좌표를 저장하고 싶다. -> 선택? -> 클래스
        //상황2] 학생의 국어 점수를 저장하고 싶다. -> 선택? -> 배열
        //상황3] 학생 정보를 저장하고 싶다.(학생 정보: 학생명, 키, 몸무게) -> 선택? -> 클래스

        //배열 사용
        int[] s1 = new int[3];
        s1[0] = 170; //키
        s1[1] = 70; //몸무게
        //s1[2] = "홍길동"; //이름 -> 다른 자료형..사용 불가

        String[] s2 = new String[3];
        s2[0] = "170"; // 숫자로 사용 -> 형변환(Integer.parseInt())
        s2[1] = "70";
        s2[2] = "홍길동"; //몇번째 방에 뭐가 들어있는지 ?? > 의미만 모르는게 아니고;; 자료형 알수 없다;;;

        //.연산자 : 멤버 접근 연산자( . 을 통해서 멤버에 접근한다.)
        //s1.name
        
        //객체 사용
         Student s3 = new Student();

        s3.name = "홍길동";
        s3.height = 180;
        s3.weight = 80;

        System.out.println(s3.name);
        System.out.println(s3.height);
        System.out.println(s3.weight);
        
    }//main
}

//학생 정보(학생명, 키, 몸무게) -> 클래스 설계
class Student {

        //학생 정보를 구성하는 개별 데이터를 저장할 변수를 클래스 멤버로 선언한다.
        public String name;
        public int height;
        public int weight;
}
profile
모르면 괴롭고 알면 즐겁다.

0개의 댓글

관련 채용 정보