열여섯 번째 수업

정혅·2024년 2월 29일

더 조은 아카데미

목록 보기
21/76
post-thumbnail

암기하고 있어야 할 키워드들

public class NumberTest {

    public static void main(String[] args) {
        int num = 10;
        String numStr = "20";
        int numTmp = Integer.parseInt(numStr);    // 문자열을 int로
        String strTmp = String.valueOf(num);    // int를 문자

        System.out.println(Math.floor(3.7));    // 내림 3.0
        System.out.println(Math.ceil(3.1));    // 올림 4.0
        
        int[] arr1 = {1, 2, 3};
        int[] arr2 = Arrays.copyOf(arr1.3);//배열 복사
    }
}
  • Integer.parseInt() > 문자열을 int로
    - 이 키워드를 활용해 n진수>10진수로 바로 변환시킬 수 있다.
  • Integer.toString() > int를 문자열로 > int만 변경 가능
    - 이 키워드를 활용해 10진수>n진수로 바로 변환시킬 수 있다.
  • String.valueOf() > int를 문자열로(정수뿐 아니라 다양한 자료형을 변경 가능
  • .substring() > 괄호 안에 인덱스값을 넣으면 그 값 이후부터 끝까지 문자열을 가져온다.
    - .substring( , ) > 괄호 안에 , 를 기준으로 인덱스 값을 넣으면 왼쪽 인덱스 값부터 오른쪽 인덱스 값까지의 문자열만 가져온다.
  • Math.floor() > 내림(double로 반환)
  • Math.round() > 반올림(long, int로 반환)
  • Math.ceil() > 반올림(double로 반환)
  • Arrays.sort() > 오름차수 정렬
  • Arrays.toString() > 배열의 값들이 다 String으로 []안에서 출력
  • Arrays.copyOf(복사할 배열 변수명 , 몇개 복사할 지) > 배열 복사
  • System.arraycopy(복사할 배열 변수명, 복사할 인덱스 시작점, 붙여넣기 할 변수명, 붙일 인덱스 시작점, 몇개 복사할지) > 인덱스를 지정해서 배열 복사
Integer.parseInt() n진수 > 10진수 변환

Integer.toString() 10진수 > n진수 변환


배열을 이용한 shuffle 알고리즘

import java.util.Arrays;

public class NumberArray2 {

    public static void main(String[] args) {
        int[] num = new int[10];
        for(int i=0;i<num.length;i++)
            num[i] = i;//0~10을 순차적으로 배열에 대입

        for (int i = num.length - 1; i > 0; i--) {//피셔예이츠 셔플 알고리즘 사용
            int j = (int)Math.floor(Math.random() * (i + 1)); 
            int tmp = num[i];
            num[i] = num[j];
            num[j] = tmp;        
        }
        System.out.println(Arrays.toString(num));//문자열로 출력됌


        int len = 3;
        String numStr = "";
        int rnum = 0;
        for(int i=0;i<len;i++)
        {
            numStr += num[i];//int와 String을 +하면 자동 형변환(String)
        }    //8 > 81 > 819 식으로 세자리 난수가 생성될 수 있음
        rnum = Integer.parseInt(numStr);//int로 형변환해서
        System.out.println(rnum);//819라는 숫자 출력

    }
}

배열을 이용한 숫자 야구게임 (char배열로 나누어서 중복 비교)

import java.util.Arrays;
import java.util.Scanner;

public class Test {
    public static boolean  chkArr(char[] chArr)//char배열의 객체 주소값이 들어가는것
    {
        for(int i=0;i<chArr.length-1;i++)
        {
            for(int j=i+1;j<chArr.length;j++)
            {
                if(chArr[i]==chArr[j])//중복이 있으면 false return
                    return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int rnum = 0;
        String rnumStr = "";
        while(true)//난수를 생성해 중복이 있는동안
        {
            rnum = (int)(Math.random()*(999-100+1)+100);  // (end-start+1)+start  > 난수발생
            rnumStr = String.valueOf(rnum);//int를 문자열로 변환
            if(chkArr(rnumStr.toCharArray())) break;//문자열을 char배열로 변환
        }
        int len = rnumStr.length();

        String inumStr;
        int scnt=0, bcnt=0;
        System.out.println(rnum);
        while(true)
        {
            System.out.println("공격하세요.");
            inumStr = sc.next();
            for(int i=0;i<len;i++)
            {
                char ch = rnumStr.charAt(i);//i번째 수를 ch에 대입
                int idx = inumStr.indexOf(ch);//인덱스에 존재하는 ch문자의 인덱스 > 존재 x면 -1
                if(idx != -1)//strike와 ball이 있는지 확인해주는 코드
                {
                    if(i==idx) scnt++;
                    else bcnt++;
                }                
            }
            if(scnt==0 && bcnt==0) System.out.println("out");//위에서 카운트 안됐으면        
            else if(scnt != len) System.out.println(scnt + " strike " + bcnt + " ball");//strike가 3개가 아니면
            else             
            {
                System.out.println("홈런");
                break;
            }
            scnt = 0;
            bcnt = 0;
        }
        sc.close();
    }
}

자바 개념 문제 풀이 - 배열

다운로드에 Chapter5 연습문제.pdf 존재

for(int a : arr) {sum += a;}

  • 나는 이렇게 했는데 이렇게 하는게 훨씩 간단하고 가독성 좋음

int cnt = 0;

for(int[] a : arr) {

    for(int b: a) {

    total += b;

    cnt++;

    }

}
  • total은 위처럼 구했는데 float이 구해지지 않았다
  • average = (float)(total/cnt); 로 했는데..
  • 정수끼리 소수끼리 나눠지려면 형이 같아야한다는 점을 기억하자.

맞춘문제

  • System.arraycopy는 자주쓰이니 꼭 암기하고있자

  • 정답을 맞췄는데 그래도 기억하자고 삽입

아예 손도 못댄 문제 무슨 말인지 이해 x

  • 커맨드라인을 통해 입력받는다고 하는 말은,main메서드에 String[] args 가 args라는 변수명에 문자열 배열이 있다는 의미인데, args.length는 우리가 컴파일할때 기본으로 0 으로 생성되고, 컴파일 시킬때 옆에 args배열에 들어갈 값을 입력하면 그 값을 가지고 실행이 된다는 의미이다.

이클립스에서 커맨드라인을 통해 입력받는 방법

class Practice2 {
	public static void main(String[] args) {
		System.out.println("첫 번째 값 : " + args[0]);
		System.out.println("두 번째 값 : " + args[1]); 
	}
}

  • run실행버튼 옆에 삼각형 누르면 이렇게 뜨는데 여기서 Run Configurations를 클릭한다.
  • 처음에 Main페이지로 자동 설정되어서 보여주는데 Arguments로 들어가 Program arguments에 args에 넣을 문자열 값을 입력해주면 띄어쓰기를 기준으로 차례로 들어가게 된다.
    - 현재 잘려서 보이지는 않지만 args[0]에 홍길동이 들어가 있고, args[1]에 이순신이라는 문자열이 들어가 있어 이렇게 Run을 실행시키면 밑에처럼 출력된다.


int[] answer = { 1,4,4,3,1,4,4,2,1,3,2 };

int[] counter = new int[4];

for(int i=0; i < answer.length;i++) {

int a = answer[i];

System.out.print(a);

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

System.out.print("*");

}

System.out.println();

}

for(int i=0; i < counter.length;i++) {

System.out.println();

문제의 출제 의도를 제대로 알지 못했어서..풀이보니까 내가 푼건 잘못된 코드

  • 배열에 1이 3개니까 3하고 별 3세개 출력 /2가 2개 / 3이 2개 / 4가 4개

    • 3 2 2 4

    • 넣을 숫자에 -1 을 하면 대입하려는 인덱스 값이 되니까

  • answer배열에 있는 숫자의 개수가 몇개있는지 출력하는 것이니 1~4밖에 없으니까 counter에 0~4개를 차례로 넣고

  • answer배열에 있는 숫자에서 -1 하면 몇개인지 셀 수 있는 해당 인덱스에 딱 들어간다..

    • counter[0]++; 하면 0번째 값이 ++ 되는것

코딩테스트할 때 자주 쓰이니까 알고리즘을 잘 이해해놓자

영어문장을 배열에 넣는다하면(알파벳 하나씩) 'a ' 를 0번째에 넣고싶으면 a-a처럼 빼주면 0번째 배열에 차례로 넣을 수 있다.


ㄹㅇ 무슨말인지 > 책에서 복잡하게 푼거라는데..

  • star를 result에 넣을것 > 규칙성 존재

  • result[j][] 와 star[][j] > 이렇게 규칙이 같고 result[j][star.length-1(3)-i] 와 star[i][j] 이 된것

    • 하드코딩하면 3-i지만 조금 고급지게 하면 star.length-1인것이다.

    • result 행은 3에서 0으로 작아지고 있고, star 행은 0부터 순차적으로 커지고있다

      • 그렇기때문에 for문을 이용해 순차적으로 커지고있으니까 star는 두고, result는 큰값에서 작아지고 있기 때문에 빼줘야하는것이다.

어떻게 풀지..생각하지 말고 노가다로 하더라도 데이터를 뽑아서 이 안에서 규칙성을 찾아야 한다.!!


int보다 작은 자료형들을 연산하면 Integer로 자동 형변환된다.

  • 나는 ch를 int로 형변환 시켜서 했는데 숫자로 비교할 때 -0 을 해주지 않아서 숫자로 넘어가지지 않았다.

  • 숫자도 아스키코드로 값이 있는데, -a만 하고 -0 을 하지않아서 제대로 출력이 되지 않았던

  • 문자열을 += 하지 않고 = 으로 받았더니 result안에 String이 한개씩만 출력됐다.

    • 문자열을 다 담고 싶으면 + 로 대입시키면 된다.


이중for문 쓰고 4중 for문 쓰면서 다했는데 처음에.. 생각해보니 어차피 열은 3개니까 3당연히 3번 더해지는것이였는데, 너무 복잡하게 생각한 나의 패착이다.

  • 처음에 [0][0]인 100을 result [0][3] / [0][5] / [5][3] 에 100을 각각 넣어주고 for문으로 돌아간다.

  • 두번째 [0][1] 인 100을 result [0][1] 몰라 뭐 이런순서로 더해서 배열에 넣는게 아니라 배열에 넣는것을 반복해서 += 해주는것이다.

반복문따라서 한번 해보기


맞춘문제

  • toCharArray > 배열을 char로 변경해주는

    • 스펠링 하나하나가 각 배열에 들어있는것 t-0/e-1 식으로

    • String 생성자 중에 (char[] value) 로 매개변수로 char배열로 받는 형태가 있으면 가능하다

      • new String(question)

      • answer.trim > 좌우 공백을 없앨때 쓰는 메소드

        • String s = "H ell o" > String s1 = s.trim(); 하면 "Hello" 가 되는것이다. 공백이 없으면 그냥 없는대로 출력

        • 웹상에서 회원가입을 할때 공백을 제거해주기 위해서 쓴다.

  • %n 과 \n의 기능은 같다. > 개행

  • 피셔예이츠 셔플 알고리즘을 사용한

  • 배열을 저렇게 저장해서 문제 맞추기도 가능해서 알고리즘 기억하려고 삽입해놨다.


호출 스택(Call Stack)

모든 프로그램언어에서 공통적인 것, 중요한 개념

메소드 수행에 필요한 메모리가 제공되는 공간

Stack의 정의

  • 밑이 막힌 상자, 위에 차곡차곡 쌓고, 꺼낼 때는 맨 위에 있는 것부터 차곡차곡 뺀다.

  • LIFO 형태 (Last In First Out) > 정처기에 나온 스택개념

JVM의 메모리구조

java virtural Machin

  • 메소드 영역(Method Area)

    • 클래스 정보와 클래스 변수가 저장되는 곳
  • 호출 스택(Call Stack)

    • 메소드의 작업 공간

    • 메소드가 호출되면 호출 스택에 메모리 할당, 종료되면 사용하던 메모리를 반환

  • 힙(Heap)

    • 인스턴스가 생성되는 공간 > new연산자에 의해서 생성되는 배열과 객체를 모두 여기 생성

호출 스택의 특징

  • 메소드가 호출되면 수행에 필요한 메모리를 스택에 할당받는다.

  • 메소드가 수행을 마치면 사용했던 메모리를 반환

  • 호출 스택의 제일 위에 있는 메소드가 현재 실행중인 메소드, 나머지는 대기중인 상태

  • 아래에 있는 메소드가 바로 위의 메소드를 호출한 메소드이다.

호출 스택 실행 과정

  • 가장 위에있는게 현재 실행중인 메서드인것이다.

    • println 을 호출 > secondMethod를 호출 > firstMethod를 호출 > main메서드 순

0개의 댓글