배움 __IL/TIL 1기

TIL : 10번째- 221212 [12-2-월]

Mo_bi!e 2022. 12. 12. 21:50

※ Keep in mind

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

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

I. INTRO : 물음

제어구조 다루는데 생각과의 간극으로 어려움이있음

1개의 차원으로는 3X3의 위치가 찾기 어렵고 찾아도 그 의미를 알기 어렵다. > 2차원배열로 가능 함!

 

<1차원>

for(int i = 0 ; i < 100 ; i++) { 
			
    if(i == 22)
        System.out.printf("%c", '○');
    else 	
        System.out.printf("%c", '┼');


    if((i + 1) % 10 == 0) // 괄호로 우선순위 생각을 하지 못했음
        System.out.print("\n");

}

<2차원>

    for(int y = 1 ; y <= 10 ; y++) {
        for(int x = 1 ; x <= 10 ; x++) 		//문장하나는 굳이 괄호를 쓰지 않는다.
                if(x == 3 && y == 3) 
                    System.out.printf("%c", '○');				
                else
                    System.out.printf("%c", '┼');
									
			System.out.println();
		}

 

II. 오목판 응용하기

내 생각대로 되는지 예상해보고, 하기 

1. 오목판 가장자리 꾸미기 (반복문 밖에서)

{
    System.out.printf("%c", '┌');
    for(int i = 0 ; i < 10 ; i++)
        System.out.printf("%c", '┬');
    System.out.printf("%c", '┐');

    System.out.println();
}


for(int y = 1 ; y <= 10 ; y++) {
    System.out.printf("%c", '├');
    for(int x = 1 ; x <= 10 ; x++) 		//문장하나는 굳이 괄호를 쓰지 않는다.
                if(x == 3 && y == 3) 
                    System.out.printf("%c", '○');				
                else
                    System.out.printf("%c", '┼');


    System.out.printf("%c", '┤');
    System.out.println();
}



{
    System.out.printf("%c", '└');
    for(int i = 0 ; i < 10 ; i++)
        System.out.printf("%c", '┴');
    System.out.printf("%c", '┘');
}

 

2. 오목판 가장자리 꾸미기2 ( 반복문 안에서 하기)

for(int y = 1 ; y <= 10 ; y++) {
    for(int x = 1 ; x <= 10 ; x++) 		//문장하나는 굳이 괄호를 쓰지 않는다.
                if(x == 3 && y == 3) 
                    System.out.printf("%c", '○');		

                else if(x == 1 && y == 1)
                    System.out.printf("%c", '┌');
                else if(x == 1 && y == 10)
                    System.out.printf("%c", '└');
                else if(x == 10 && y == 1)
                    System.out.printf("%c", '┐');
                else if(x == 10 && y == 10)
                    System.out.printf("%c", '┘');

                else if( x == 1)
                    System.out.printf("%c", '├');
                else if( y == 1)
                    System.out.printf("%c", '┬');
                else if( y == 10 )
                    System.out.printf("%c", '┴');
                else if( x== 10 )
                    System.out.printf("%c", '┤');


                else
                    System.out.printf("%c", '┼');


    System.out.println();
}

 

1번 2번중 무엇이 더 좋은지는 '수정이 용이한 코드' 인지로 판단

그래서 1번이 지저분해 보이지만(가독성) 수정하기(테두리) 용이 함

비록 2번이 더 깔끔해 보여도...  [가독성 VS 수정가능성]

수정가능성 ^ 이유 : 조건문안에 손을 대야하는 곳이 많기 때문임

 

 

III. 배열

-끝난 뒤 조별로 함 '자리 바꾸기 프로그램'만들기

 

1. 배열의 필요성

(1) 임시 저장소 또는 버퍼의 필요성

1) 순서

 

[ > 입력 > 데이터 > 출력 > re]

각 단계는 메모리와 상호작용 함

 

자리바꾸기, 계산하기 등은 메모리에서 함

 

2) SAM 스토리지

순차적으로 저장하는것이 랜덤 접근보다 바람직 함 (고장이  덜남)

(2) 파일에 담겨진 데이터 크기나 순서등을 조작하기

메모리는 디스크로부터 로드해서 랜덤하게 이용가능

이후 다시 순차적으로 디스크에 보냄

 

(3) 일반적인 프로그램의 구조

그래픽스 영상처리 데이터 분석 등은 데이터를 로드하고 계산 하는데 이런것을 모두 배열의 방식으로 함

 

 

2. 배열 연산

1. 배열연산의 특징 : 하나의 변수명으로 여러 개의 값을 저장할 수 있음. (변수명, 기능, 반복문)

하나의 방으로 이용하기를 함

 

각 변수마다 하면 코드가 반복하게 됨

 

new int[3];   (3개로 정한 이유: 유한한 자원이기 때문에,, - 당장 가장 큰방을 달라고 할 수없음)

C와 다르게 자바는 조작할 수 있는 기능(함수)로 줌 즉 객체의 기능을 통해서 이용이 가능

그러나 당장은 어려울 수 있으니 방으로만 보자!

 

int [] kors = new int[3];

모든객체는 이름(kor)이다. 주소를 가르키는 것이 아님. 내 이름에 내 위치가 들어가지 않음

 

스택 등으로 사고(물리적사고)하는 것은 아님 지금은 수학적으로 사고 해야한다.

그리고 이를 넘어 (수학을 넘어) 업무,기능 단위로 생각하고 프로그램을 만들어야한다. 

 

이 경우 3개의 칸에 3인실로서 나누어써야한다

즉 kors[1] (0에서 1칸 까지 가서 써라)  [연산자 방식]

 

 

kor[0] = 1 ;  for(int i = 0 ; i = 0 ; i<3; i++){
 kor[i] = 1;
}
kor[1] = 1 ; 
kor[2] = 1 ; 

반복문배열은 바들과 실처럼 궁합이 매우 좋다

 

1)

Q. kors == engs / 연산이 바른지?

A. 실체가 있어서 연산은 가능함, 그러나 False임 실체는 다름 

 

2)

Q. kors[0] == engs[0] /

A. 가능함

 

3)

Q. int x = kors[0]

A. 가능

 

4)

Q. int x = kors;

Q. 불가능 실체는 그대로 못들어감

 

 

2. 배열연산 실습 : kor1, 2, 3 을 배열로 바꾸기

 

1)

<배열선언>

		int[] kors = new int[3]; 
		//여러개라는 방의 의미는 korList나 kors가 바람직함
		
		for(int i = 0 ; i < 3 ; i++)
			kors[i] = 0;

2)

<기존> : 배열연산으로 받기는 바람직하지 않은 상황

for(int i = 0 ; i < 3 ; i++)  //한문장으로서 블럭잡을필요없음

    do {
        System.out.printf("국어%d:", i + 1);
        kors[i] = scan.nextInt();

        if(kors[i] < 0 || kors[i] > 100 )
            System.out.println("점수를 100까지만 입력해야합니다 \n 다시 입력해주세요");
        }
        while(kors[i] < 0 ||kors[i] > 100);

<권장 코드> 

    for(int i = 0 ; i < 3 ; i++) {  //한문장으로서 블럭잡을필요없음
            int kor; //배열연산 많이쓰는거 않좋음 지역변수로서 간단하게! 

            do { //지역변수로 입력 받은 뒤 타당한 값 범위 내 이면, 배열에 대입하기
                System.out.printf("국어%d:", i + 1);
                kor = scan.nextInt(); 

                if(kor < 0 || kor > 100 )
                    System.out.println("점수를 100까지만 입력해야합니다 \n 다시 입력해주세요");
                }
            while(kor < 0 ||kor > 100);

            kors[i] = kor; 

        }

 

 

위와 같이 가급적 배열연산은 덜 쓰고 지역변수로서 간단하게 접근하는것이 바람직하다

타당한 값 범위 내 이면, 배열에 대입하기

 

 

3) 

{	 //3. 파일 성적 입력			
    FileInputStream fis = new FileInputStream("res/data.csv"); //버퍼를 마련함
    Scanner scan = new Scanner(fis); // scan 이름 중복된다. 이경우 벽을 만드는 '지역화'가 가능 함

    String line = scan.nextLine(); 
    String[] tokens = line.split(","); 
    //변수명을 ,를 기준으로 나누기 때문에 token 혹은 tmp 를쓴다.

    //그냥 kor1 에 두면 정수형이라서 에러발생한다.
    for(int i = 0 ; i < 3 ; i++)
        kors[i] = Integer.parseInt(tokens[i]); //90


    scan.close(); //얘는 수동으로 닫아주어야 > 내가 만들어서
    fis.close(); // 다른거 하기전에 1순위로 가장 먼저 해보기

    }

token 로 중복된 배열변수명 바꿔주기

 

4) 

{// 2. 콘솔 성적 출력

        System.out.println("┌─────────┐"); 
        System.out.println("│                            │");
        System.out.println("│        성적 출력      │");
        System.out.println("│                            │");
        System.out.println("└─────────┘");
        //출력하는 문장에 대한 내려쓰기가 포함된 상태이다.

        for(int j = 0 ; j < 3 ; j ++) {

            int total = 0 ;		 // for가 반복될 때 마다 값이 초기화 되게끔			
            for(int i = 0 ; i < 3 ; i++) 
                total += kors[i];

            double avg = total / 3.0;  //원래는 76점수이나 번역기가 .0을 붙여준다.
            System.out.printf("-----------<%d>-----------\n", 3 - j); 

            for(int i = 0 ; i < 3 ; i++){ //for문안은 가급적 바꾸지 않는것이 바람직 
            System.out.printf("국어%d : %5d\n", i+1 ,kors[i]);
            System.out.printf("총점 : %5d\n", total);
            System.out.printf("평균 : %6.2f\n", avg);
            }           
    }

}

total 에 대해서 매번 다시 0으로 선언해주어야한다.

 

5) 

 //4. 파일 성적 출력
    {
    FileOutputStream fos = new FileOutputStream("res/data.txt");
    PrintStream out = new PrintStream(fos); //위 fos를 응용하는 객체가 만들어짐

       for(int i = 0 ; i < 3 ; i++) {
            out.printf("%d", kors[i]);	
            if(i == 2)
                out.print("\n");	
            else
                out.print(",");
    }								

    fos.close();

    System.out.println("작업관료 ");
    }

수평을 수직을 바꾸어서 해주어야한다.

이 경우 ,는 마지막에 출력되면 안되기 때문에 조건절을 이용해준다.

 

 

<코테> 알고리즘?

문제 해결능력 보다는 문제이해능력

코테는 수학적인 사고인 플랫폼을 만드는 MS사에게 바람직한 방식임,

응용개발을 하는 우리에게는 조금은 부적절하다

알고리즘은 수학을 기반으로 있음


 

1. 보충

 

 

2. 회고 

1) 조건문이나 반복문에 가급적 한개의 명령어 이면 가급적 블럭을 사용하지 않기

 

 2) 배열연산을 이용하기보다는, 지역변수를 최대한 활용하기

 

3) 개인적으로 생각하는 배열은 특징이 3가지 이다

하나의 변수명으로 여러개의 데이터 조작이 가능함

반복문과 궁합이 좋다

함수(기능)이 있다

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

TIL : 12번째- 221214 [12-2-수]  (0) 2022.12.14
TIL : 11번째- 221213 [12-2-화]  (0) 2022.12.13
TIL : 9번째- 221209 [12-1-금]  (0) 2022.12.09
TIL : 8번째- 221208 [12-1-목]  (0) 2022.12.08
TIL : 7번째- 221207 [12-1-수]  (0) 2022.12.07