10월 20일 Day08

여우·2022년 10월 20일
0

공부중

목록 보기
2/38

달팽이 배열 출력

먼저 규칙성을 발견 하기 위해 대입 되어야 하는 내용들을 배열의 인덱스를 이용하여 직접 대입하면
규칙 파악에 용이해진다.
배열

int[][]arr = new int[5][5];
int length = 5;
int num =0;

-첫째줄
	arr[0][0] = ++num;	  //	1;
	arr[0][1] = ++num;	  //	2;
	arr[0][2] = ++num;	  //	3;
	arr[0][3] = ++num;	  //	4;
	arr[0][4] = ++num;	  //	5;
-둘째줄
	arr[1][4] = ++num; 	  //	7;
	arr[2][4] = ++num;	  //	8;
	arr[3][4] = ++num;	  //	9;
	arr[4][4] = ++num;	  //	10;
	

	arr[4][3] = ++num;
	arr[4][2] = ++num;
	arr[4][1] = ++num;
	arr[4][0] = ++num;
    
  • arr[0][0] 번째 부터 순서대로 1부터 입력 되어진다. 배열마다 값을 채우며 값은 1씩 균일하게 증가하므로, 값은 num이라는 변수를 이용하여 증가시키고 대입한다.
  • 인덱스의 변화값들의 규칙을 살펴보면, arr[][] 인덱스 값이 둘다 0 0 일때 1부터 시작하여 두번째 인덱스 값 즉 열번호의 증가가 5번을 반복한다. 그리고 길이가 5에서 4로 감소한다.

이를 반복문으로 바꿔 쓰면

for (int i =0; i <arr.length; i++){
++num;
arr[0][i] = num; 
} 
--length;

그리고 두번째줄은 이제 arr[][]에서 첫번째 인덱스 즉 행의 값이 증가하고 열의 번호는 고정되어있는 것을 알수 있다. arr[증가][4]

이를 반복문으로 바꿔 쓰면

for(int i =0; i <arr.length; i++){
	++num;
	arr[i+1][4] = num;
} 

으로 나타 낼 수 있다. 여기서 중요한점은 이런식으로 포문이 arr배열의 길이를 감소하며 위의 반복문을 반복하게 된다. 첫번째 포문은 첫번째 배열 인덱스는 고정이고 두번째 배열 인덱스 값이 변하게 되고 = [고정][변화].

두번째 포문은 두번째 배열 인덱스 값이 고정이고 첫번째 배열 인덱스 값이 변한다. = [변화][고정] 여기서 변화는 증가만 하는것이 아니라 일정하게 감소도 진행 한다는것이다.

-배열 인덱스값을 보면 arr[][]에서 세로축은 첫번째 인덱스, 가로축은 두번째 인덱스 이다 따라서 배열인덱스 숫자를 변수로 선언하여 계산할 수 있다. arr[y][x]

  • 모든 줄의 내용을 일일 포문을 계속해서 반복해서 적게 되면.위의 두개의 반복문 방식이 계속해서 되풀이 되는걸 알 수가 있다. 그리고 x값, y값이 증가된후에는 감소하는 패턴이다 그러므로 이를 해결 하기 위해서는 그림에도 나와 있듯이 반전 시키는 요소가 필요하다. 이를 해결 하기 위해 변수 sign을 선언한다.

    (x값 증가) -(길이 감소)-(y값 증가) / (x값 감소) -(길이 감소)-(y값 감소)

    int x = -1;
    	int y = 0;
    	int sign = 1;

    x의 경우 -1로 선언한 이유는 5칸을 채우고 이동하는게 아니라 , 이동을 한후 값을 채워 넣는 방식이다. 첫번째 줄 부터 5번을 채우고 나면 다음값은 그 아래로 입력이 되어야 하는데 이미 그 옆칸으로 넘어가야 하는 out of bound EXception에 걸리게 되므로 초기값을 0이 아닌 -1로 시작을 한다.

    그렇게 되면 결과적으로 길이가 0이 아닐때 까지 반복하는 while문에서 for문을 이용하여 도출할수 있다.

    while(true) {
    for(int i = 0; i < length; i++) {
    x += sign;
    arr[y][x] = ++num;
    }
    length--;
    if(length == 0) break;

    			for(int i = 0; i < length; i++) {
    				y += sign;
    				arr[y][x] = ++num;
    			}
    			sign = -sign;
    		}
       

    Class의 이해

  • "클래스는 자료형이다." 클래스에 의해 생성된 데이터를 객체라고 한다.단일 데이터를 저장하기 위해 필요한 요소들은 변수, 자료형이고, 클래스는 서로 다른 자료형의 여러 데이터를 저장할 수 있는 변수를 가지고 있다.

  • 클래스의 구성 요소

  1. 필드 : 객체의 속성을 표현하기 위한 변수, 메서드에서는 필드에 접근할 수 있다

  2. 메서드 : 객체의 기능을 표현하기 위한 함수, 메서드 내부에서 별도의 지역변수를 선 언할 수도 있다

  3. 생성자 : 객체를 생성할 때 호출되는 특수한 함수, 오버로딩이 가능하다. 클래스의 이름과 동 일한 함수

  4. 접근 제한자 : 객체 내부 요소를 보호하기 위한 형식. 외부로부터의 접근가능 여부를 지정한다

    클래스 선언 예시)

    변수 선언 과, 동작 기능을 선언.
    동작하게 되면 각 점수들을 출력하도록 선언 되어 있고 동작 호출 show()로 가능하다.

    클래스를 기반으로 객체 처리 예시)

    객체는 클래스와 동일한 이름을 사용하여서 만들수가 있고 만드는 방식은
    클래스이름 객체이름 = new 클래스이름(); 이런식으로 사용이 된다.

    그리고 객체이름.멤버필드명 으로 변수의 값 대입이 가능하다. 대입 받은 변수로 메서드 실행이 가능하다.


    객체로 하여. 메서드를 처리하게 되면

    이렇게 값이 나오게 된다.

  • 생성자 : 객체 생성시 호출되는 함수. 클래스의 이름과 똑같고, 반환형 자체가 없다. (void도 쓰지 않는다)
    생성자는 작성하지 않으면, JVM이 컴파일 할때 기본 생성자 코드를 작성해준다
    개발자가 생성자를 작성하면, JVM은 자동으로 생성자를 만들어주지 않는다
    생성자도 함수이므로, 자바의 함수 오버로딩이 적용된다

    위의 세 과목 점수 출력은 생성자를 사용하지 않아 기본 생성자가 사용되었는 반면 생성자를 직접 작성이 가능하다. 생성자를 직접 작성시 JVM이 기본생성자를 생성하지 않게되고, 생성자를 각 객체의 매개 변수를 활용하여 멤버필드값 대입이 가능해진다.

    예시)

    새로운 커피 클래스

    void 반환형으로 이름과 가격을 출력하는 show()

    생성자 직접입력 (괄호안은 객체를 만들시 넘겨 받게 될 매개 변수들 데이터타입 과 이름)

    생성자 직접 작성시 매개변수로 넘겨 받은 데이터들을 다시 멤버 필드로 대입하기 위해서는 this.(맴버필드)=매개변수; 이런식으로 작성을 해줘야 한다.

    객체 생성시에도 (넘겨 주게될 매개변수를 작성해서 객체를 생성해야 한다).

    ob1.show() 를 하게 되면

    아메리카노 : 2,000원 이 출력이 된다.

    물론 배열이기에 for문을 이용하여 전부 출력도 가능하다.

    커피메뉴 이름과 가격은 따로 따로이지만, 객체에 하나로 담았기에 선택정렬을 하게 되더라도. 이름과 가격이 따로 출력되거나 하지 않는다.

    예시)

    Human 클래스 생성

    class Human {
    
    	String name;
    	int age;
    
    	Human(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    
    	void show() {
    		System.out.printf("%s : %d살\n", name, age);
    	}
    }

    <이름과 나이들 배열>

    	String[] names = { "이지은", "홍진호", "강호동", "주호민", "이병건" };
    	int[] ages = 	 { 30, 		41, 	52, 	 42, 	 40 	};
    	
    		for(int i = 0; i < names.length; i++) {
    			System.out.printf("%s : %d살\n", names[i], ages[i]);
    		}
    		System.out.println();
    	

<휴먼 클래스를 이용한 객체와 그객체들을 담은 배열>

	Human h1 = new Human("이지은", 30);
	Human h2 = new Human("홍진호", 41);
	Human h3 = new Human("강호동", 52);
	Human h4 = new Human("주호민", 42);
	Human h5 = new Human("이병건", 40);
	
	Human[] arr = { h1, h2, h3, h4, h5 };
    

<나이를 기준으로 오름차순으로 정렬>

    for(int i = 0; i < arr.length - 1; i++) {
	for(int j = i + 1; j < arr.length; j++) {
		if(arr[i].age > arr[j].age) {
			Human tmp = arr[i];
			arr[i] = arr[j];
			arr[j] = tmp;
		}
	}
 	}
	
	for(int i = 0; i < arr.length; i++) {
		arr[i].show();
	}
	System.out.println();
    

출력시

이지은 : 30살
이병건 : 40살
홍진호 : 41살
주호민 : 42살
강호동 : 52살

순으로 출력이 된다.

profile
우당탕탕 지금은 개발중

0개의 댓글