배움 __IL/TIL 1기

TIL : 11번째- 221213 [12-2-화]

Mo_bi!e 2022. 12. 13. 19:04

※ Keep in mind

 본 내용은 웹개발과정의 강의 중 내용을 복습을 위해서 메모한 것에 불과한 것입니다. 이러한 연유로 강의내용을 오인한 나머지 오기재 및 불기재가 있을 수 있으니 '참고'만 해주시길 바랍니다. 저의 경우에도 본 내용을 단순히 읽은 것이 결코 저의 것이라고 생각하지 않습니다. 본 내용은 복습를 위한 초기 내지 중간 과정에 불과한 것이고, 이후에 내용을 보충 후 인출 및 설명하기 과정이 있어야 비로소 복습의 단추가 어느정도 마무리 되어간다고 볼 수 있습니다.

 따라서 당초에 본 내용은 비공개였습니다. 그럼에도 불구하고 본 내용을 공개한 점은 함께 공부하는 동료들과 나눔을 바탕으로 배움과 성장의 공진화라는 소기의 목적을 달성에 어느정도 도움이 될수 있기 때문이라고 생각합니다.

I. INTRO : 오전 일일문제

 

II. 배열로 오목판 만들기

1. 문자 배열로 오목판 만들기

{	//오목에서 배열 10X10 100개 문자를 담을 수 있는 배열 board
		
    char [] board = new char[100];


    for(int i = 0 ; i < 100 ; i++) 
        board[i] = '┼';



    for(int i = 0 ; i < 100 ; i++) {
        System.out.printf("%c", board[i]);

        if((i + 1) % 10 == 0) 
            System.out.println();

    }
}

 

2. 배열 board를 조작하면 출력이 달라진다

char [] board = new char[100];
		

    for(int i = 0 ; i < 100 ; i++) 
        board[i] = '┼';

    //배열 board를 조작하면 출력이 달라진다
    board[15] = '○';


    for(int i = 0 ; i < 100 ; i++) {
        System.out.printf("%c", board[i]);

        if((i + 1) % 10 == 0) 
            System.out.println();

    }

배열공간의 값이 다른값으로 바뀌었고, 이 경우 출력은 안바꾸어도 된다.

배열만 손대면 된다.

즉 제어구조를 손댈 필요가 없다.

 

이것이 메모리에 랜덤액세스의 장점이다. (순차적으로 접근하는 제어구조를 이용하는것과 달리)

 

그러나 5X5에 돌을 넣기에 어디인지 찾기 어려움

board[44] = '○';

board[(5-1)*10 + (5-1)] = '○'; //계산식으로 가능

//이 경우 x,y 축에 대한 연산식을 직관적으로 생각하는것을 경계해야 함

위와 같이 연산식을 이용해서 그나마 수월하게 접근이 가능하다.

이 경우 x,y 축에 대한 연산식을 직관적으로 생각하는것을 경계해야 함(x,y반대로)

 

배열 위치 방식이 듕귁과 달라 사맛디아니할세...

2차원 배열로서 수월하게 접근이 가능하다! 

    char [][] board = new char[10][10];

    for(int y = 1 ; y <= 10 ; y++) {
        for(int x = 1 ; x <= 10 ; x++) 
            board[y - 1][x - 1] = '┼';
    }
    board[5][1] = '○';
    
    for(int y = 1 ; y <= 10 ; y++) {
        for(int x = 1 ; x <= 10 ; x++) 
            System.out.printf("%c", board[y - 1][x - 1]);

        System.out.println();
    }

위와같이 우선 배열을 쓰면 조건이 줄어들고 (즉 절차가 아니라 랜덤으로 할때의 편리성)

나아가 2차원배열로 쓰면 조건이 더 줄어든다.

 

3. 사용자로 부터 위치를 받아서 오목게임 진행하기

- 예외처리 1~10만입력까지 완료

- 중복 넣기 아직 미완

package ex2.array;

import java.util.Scanner;

public class OmkoTest3 {
	
	public static void main(String[] args) {
		

	//오목에서 배열 10X10 100개 문자를 담을 수 있는 배열 board
		
		char [][] board = new char[10][10];
	
		for(int y = 1 ; y <= 10 ; y++) {
			for(int x = 1 ; x <= 10 ; x++) 
				board[y - 1][x - 1] = '┼';
		}
		
		//위칸 마감
		for(int y = 1 ; y <= 10 ; y++) {
			for(int x = 1 ; x <= 10 ; x++) {
				board[0][x - 1] = '┬';
				board[9][x - 1] = '┴';
				
			}
				board[y - 1][0] = '├';
				board[y - 1][9] = '┤';
				
				board[0][0] = '┌';
				board[0][9] = '┐';
				board[9][0] = '└';
				board[9][9] = '┘';
				
		}

		for(int y = 1 ; y <= 10 ; y++) {
			for(int x = 1 ; x <= 10 ; x++) 
				System.out.printf("%c", board[y - 1][x - 1]);
			
			System.out.println();
		}
			
		
		int number = 0;
		int ox = 1 ; int oy = 1;
		boolean overlap = true; //중복찾기용
		
		while(true) {
		//사용자에게 입력받아서 특정위치에 넣기
		
			
		do {// 
		if(number % 2 == 0)  // 홀수번째
			System.out.printf("%c 백돌차례",'○' ); //x랑 y 위치 휴먼관점에서!
		else //짝수번째
			System.out.printf("%c 흑돌차례",'●' ); //x랑 y 위치 휴먼관점에서!
		System.out.println(" 놓고 싶은 위치에 넣기");
		
		Scanner scan = new Scanner(System.in);
		System.out.println("X Y : ");
		ox = scan.nextInt(); 
		oy = scan.nextInt();
		
		if() //중복 찾기
		
		
		if(!(0 < ox && ox < 11) || !(0 < oy && oy < 11))
			System.out.println("바둑을 잘못넣으셨습니다.\n 다시 입력하세요."); }
		 while((!(0 < ox && ox < 11) || !(0 < oy && oy < 11)) || overlap );
		
		for(int y = 1 ; y <= 10 ; y++) {
			for(int x = 1 ; x <= 10 ; x++) {
				if(number % 2 == 0)  // 짝수번째
					board[oy - 1][ox - 1] = '○'; //x랑 y 위치 휴먼관점에서!
				else //홀수번째
					board[oy - 1][ox - 1] = '●'; //x랑 y 위치 휴먼관점에서!
				
					}
				}
			
		
		
		//출력 단
		for(int y = 1 ; y <= 10 ; y++) {
			for(int x = 1 ; x <= 10 ; x++) 
				System.out.printf("%c", board[y - 1][x - 1]);
			
			System.out.println();
		}
		number ++;
		}
		
}}

4. 자리배치 프로그램 만들기 (조만간 초초 미니프로젝트)

랜덤섞기 or ~는 특정자리에 or 함께 앉게끔 만들기

 

III. 배열 이론

1. 복권을 여러 개 저장하기 위한 저장소

 

2. 톱니형 배열

-자바의 다차원 배열과 톱니형 배열

1차원 배열 3개를 2차원 3개묶어서 가능하다

 

int [] ar1 = new int [5];
		
ar1 = new int[7];

int [][] ar2 = new int [3][5]; //C++ 이면 3 X 5 X 4(byte) 이다
// 그러나 자바는 그렇지 않다
// 왜냐하면 자바는 통배열이 아니고, '기계단'에서 각 주소를 참조하기 때문이다.
// 단지 선언할 때는 통배열 처럼 할 뿐이다.

ar2  = new int [2][6]; //좌 중대장 
ar2[0] = new int [9]; // 좌 소대장 우 소대원
//0번 주소 단에만 6개의 열을 갖춘 배열을 두고 이런 경우 톱니바퀴처럼 형태가 생긴다.


int [][] ar3 = new int [3][]; //1차원 배열이끄는 소대장 3명만 뽑은
//자바는 톱니형 배열로서 한쪽만 틔어나오게 할 수 있다.

자바 선언은 통배열 / 그러나 실제로 쪼개어짐

 

int [][] ar2 = new int [3][5]; 

만약 C++ 이면 3 X 5 X 4(byte) 이다
그러나 자바는 그렇지 않다
왜냐하면 자바는 통배열이 아니고, '기계단'에서 각 주소를 참조하기 때문이다.
단지 선언할 때통배열 처럼 할 뿐이다.

 

ar2  = new int [2][6];
ar2[0] = new int [9]; 
0번 주소 단에만 6개의 열을 갖춘 배열을 두고 이런 경우 톱니바퀴처럼 형태가 생긴다.

3. 데이터 스왑과 Random()객체

(1) 데이터스왑

nums 에서 [0] 공간과 [2] 공간의 값을 바꾸기

int tmp = nums[0];
nums[0] = nums[2];
nums[2] = tmp;

 임시의 tmp 라는 상자를 만들어주어서 매개 하게끔 해야한다.

(2)  Random 객체

Random rand = new  Random();
	
int s = rand.nextInt(10);
int d = rand.nextInt(10);

// nums 에서 [s] 공간과 [d] 공간의 값을 바꾸기
int tmp = nums[s];
nums[s] = nums[d];
nums[d] = tmp;

rand라는 참조의 Random클래스의 rand 인스턴스를 선언해준다.

 

rand.nextInt() 에서 괄호 안은 0~9 까지 '10개' 를 랜덤으로 뽑아준다는 것을 알수있음.

 

 


1. 보충

(1) 인풋스트림과 scan 관계

 

 

(2) 배열에 대한 순차적접근과 랜덤접근에 대한 관점차이

 

2. 회고 

1) 배열을 이용하면 랜덤접근으로 손쉽게 배열의 값을 바꿀수(대입) 있다.

 

2) 즉 배열을 이용하면은 조건이 줄어들고, 2차원배열을 이용하면 조건이 더 줄어든다.

일반적인 피연산자는 반복문+조건문을 이용해서 모두 확인해야하지만 배열을 이용하면 배열인덱스로 바로 접근이 가능하다.

따라서 조건이 줄어든다

 

2차원배열은 1차원배열과 달리 x,y축으로 구분되어서 조건이 더 줄어든다.

 

3) 자바의 배열은 선언할때는 통배열이지만 실제로는 C++ 등과 달리 통배열이 아니다

그래서 톱니바퀴 형태의 배열이 가능하다.

 

4) Random()은 객체를 선언하고 이후 객체에 대한 메소드로 접근해야지 이용이 가능하다.

'배움 __IL > TIL 1기' 카테고리의 다른 글

TIL : 13번째- 221215 [12-2-목]  (0) 2022.12.15
TIL : 12번째- 221214 [12-2-수]  (0) 2022.12.14
TIL : 10번째- 221212 [12-2-월]  (1) 2022.12.12
TIL : 9번째- 221209 [12-1-금]  (0) 2022.12.09
TIL : 8번째- 221208 [12-1-목]  (0) 2022.12.08