※ 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 |