ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (국비교육) 10 - 가위바위보 승률 + spilt + 객체지향 + 클래스 생성 + 메소드 + .sort
    개발/국비교육 2023. 6. 14. 15:58

     

    ■ 가위바위보 입력받아 랜덤값과 비교하여 10판의 승률 나타내기

     

     

    입력받은 가위바위보 값을 랜덤값과 비교하여 10판의 승률을 나타내기 위해서는 

    1. 랜덤값을 출력하고 2. 10개의 경기를 반복하고 3. 랜덤값과 입력값을 비교하고 4. 승률 로 나타내야 한다.

     

    먼저 랜덤값을 출력하기 위해 Math.random() 을 사용하는데 1부터 3까지 사용함으로

    Math.random() * 3 + 1 을 해준값을 랜덤값 result 로 설정한다.

     

    이후 10개의 경기를 반복하기 위해서는 for 문을 이용한다.

    input 값으로 대상자에게 1 ~ 3 까지 값을 입력 받고 이를 비교할 것인데

     

    나올 수 있는 input  값 1, 2, 3 의 케이스를 if 로 따져서 넣어주면 된다.

     

    나의 경우 1 가위 2 바위 3 보 로 지정했다.

     

    즉 나올 수 있는 경우의 수는 

    같은 숫자가 나와 비기거나, 이기거나 지거나 총 3가지이다.

     

    케이스별로 각 input == result 값을 비교해주고

    만약  이겼을 경우에는 wincount++ 졌을 경우 losecount++ 비겼을 경우 drawcount++ 해주고,

    이를 각 배열에 저장한다.

     

    배열 값이 i-1인 이유는 i 시작이 1부터이기 때문이다

     

    완료가 되었다면 승률을 구해줘야 한다.

     

    승률은 총 경기수를 승리한 경기수로 나누기 * 100 하면 된다.

    승리한 경기수 / 총 경기수 로 하면 되는데, 여기서 double 형태로 해줘야 우리가 원하는 승률로 도출이 된다.

     

    따라서 승률 winRate 는

     

    winRate = wincount / (double) (wincount + losecount + drawcount) * 100;

     

    로 표현하고, wincount + losecount + drawcount 의 값이 int 때문에

    int / int 는 int 기 때문에 먼저 값이 계산돼야 하는 wincount + losecount + drawcount 를 double 를

    double 타입으로 바꿔주고 계산한다.

     

    * 에러해결

    나의 경우 승률을 구할 시 계속 0이 나오는 오류가 발생했다.

    이를 double 로 처리해주니 바로 해결되었다.

     

    ■ split

     

     

    - String클래스 속 split() 메소드는 지정된 형태를 찾아 자르는 역할을 합니다. 
    EX)

    String tel = "010-2799-2216";
    tel.split("자를 기호"); ---> String 배열형태로 나옵니다.
    String[ ] telSplit = tel.split( "-" );  ------>  - 를 자를 기호로 사용

     

    ■ 지금까지 배운 내용 + 앞으로 배울 내용

     

    * 배운내용

    - 데이터 타입
    - 이름 만들기
    - 변수, 상수, 클래스, 메소드
    -  if, switch
    -  for, while, do~while
    - break, continue
    - 랜덤
    - 배열, 1, 2차 동적가변배열, 배열복사, 깊은복사, 얕은복사

     

    * 배울 내용

     

     1. 메인 메소드(파라미터) 사용해보기
     2. 객체지향
     3. 클래스 형태, 메소드 형태, 파라미터, 리턴타입

     

    ■ 객체지향 프로그램(Object Oriented Program = OOP : 실생활) (p.212)

     

     

    객체란 실생활에 존재하는 모든 것을 의미한다.

    그리고 이런 세상에 존재하는 모든 것들은 하는 일이 있다.

     

    컴퓨터 메모리 속에 생성된 객체를 인스턴스라고 한다. (현실세계 객체를 컴퓨터로 옮기는 것)

    인스턴스가 나오기 위해서는 클래스가 필요하다.

    클래스 단위로 인스턴스를 발생시킬 예정이기 때문이다.

     

    클래스는 설계도라고 생각하면 쉽다 (붕어빵틀)

    인스턴스 (붕어빵)

     

    - 행동(기능) : 메소드, 행위, 일한다, 본다, 듣는다.    / 동사형

    - 속성(정보) : 멤버변수, 나이, 사는곳, 주소, 이름      / 명사형

     

    ■ 클래스

     

     

    클래스는 객체를 만들기 위한 설계도와 같다. 

    즉 하나의 설계도에서 나오는 것은 똑같다.

     

    * 클래스 생성

     

     

    접근지정자 class 클래스명{

                    //필드(=변수), 생성자(메소드처럼 생김), 메소드를 선언          객체의 속성을 정의

    }

     

    ※ 접근지정자

    EX) public

     

    EX) class Apple {

                   String color;    -----------> 필드(=인스턴스 변수=멤버변수)

                   int age;

                   public Apple() {  ----------> 생성자

                   }

                   public void info() { -------> 메소드

                          System.out.println("색상 : " + color);
                          System.out.println("나이 : " + age);

                   }               

     

    - 필드(=변수=인스턴스 변수) : 초기화 하지 않아도 쓸 수 있다. / 인스턴스 변수는 파란색 /  변수 선언전부터 사용 가능

    - 생성자 : 인스턴스를 발생하기 위한 코드(=메소드) / 클래스 명과 이름 똑같아야 한다.

    - 메소드 : 함수 중에 객체에 행동을 정의

    - 지역변수(메소드 안에 있음) : 지역변수는 초기화 해야 한다. / 지역 변수는 갈색 / 선언 후부터 사용 가능

     

    설정 안한 필드는  숫자일 경우 0, 참조형 변수일 경우 null 처리 된다. 

    EX) String color -> null

           int age -> 0

     

    * 인스턴스 만들기(=객체 만들기)

     

     

    클래스 변수 = new 클래스()

     

    EX) 

    Apple apple = new Apple()

    String str = new String("Hi");

    Scanner sc = new Scanner(System.in);

     

    new 생성자로 만들어진 인스턴스는 힙 공간에 저장된다.

     

    Apple 클래스와 같은 apple 이라는 객체를 새롭게 만든다.

    Apple 을 참조하여 만들었기 때문에 안에는 color 와 age 필드도 정해져 있다.

     

    apple 객체 안에 값을 정해주기 위해서는

     

    apple.color = "빨강";
    apple.age = 10;

     

    와 같이 필드값을 정해주면 된다. 

     

     

    apple 과 apple2 는 각각의 개체이다.

    따라서 apple2.color 를 출력했을 때는 값을 지정해주지 않았기 때문에 null 이,

    age 는 숫자기 때문에 0이 나온다.

     

    메소드 (=함수)

     

     

    함수는 프로그램 실행을 의미하는데, (관련된 일들을 모아 정의해놓고 필요할 때마다 호출)

    메소드는 함수 중에 객체에 행동을 정의해놓은 것을 말한다.

     

    : 필드

    : 메소드

     

    메소드에서 int 는 되돌려주는 타입을 말하며,

    void 는 되돌려 주는 값이 없을 때 사용

     

    예를 들어 메소드 sleep 은 1이라는 반환값이 있지만,

    work 는 일은 출력값은 있지만 별도 반환값이 없어 void 를 사용한다.

     

    void 가 아닌 경우에는 반드시 return 값을 넣어줘야 한다.

     

    Human 으로 하면 new Human() 이라는 객체 타입을 반환한다.

     

    human.sleep(); 의 파일명을 보면 int jun14.       Human.     sleep() 으로 되어있다.

                                                        패키지명 - 클래스명 - 메소드명

     

    ※ 최상위에는 Object 가 있으며, Object 는 모든 클래스 위에 있다. 

     

     

    number 는 human 이라는 객체에서 sleep() 이라는 메소드를 호출한 값이다.

    따라서 number 를 출력하면 sleep 의 반환값 1을 출력한다.

     

    ■ 메소드 통해 호출하기

     

    human.work(); 를 실행하면 자체적으로 출력문을 포함하기 때문에

     

    null Zzzzzz

    홍길동 

     

    이 나온다.

     

    여기서 human.name 을 출력하면 아까 work 메소드에서 name 을 홍길동으로 저장했기 때문에

    홍길동이 출력돼서

     

    null Zzzzzz

    홍길동 

    홍길동

     

    이 나온다.

     

    ■ 접근제어자 public

     

     

     

    새로운 패키지를 apple 이라는 이름으로 만들고 Apple class로 새로운 객체를 만드려 하면 오류가 뜬다.

    그러나 CM01 cm01 이라는 객체는 생성이 된다.

     

     

    그 이유는 Apple 의 경우 모든 패키지에 접근 가능한 public 접근제어자가 없고,

    CM01 의 경우 모든 패키지에 접근 가능한 접근제어자 public 이 있기 때문이다.

     

    ■ 계산기 만들기

     

     

    plus 라는 메소드를 만들어 준다.

    return 값은 두 개의 정수를 더한 값으로 설정한다.

     

    main 메소드에서 calc 라는 객체를 만들고,

    메소드를 활용하여 계산한다.

     

    여기서 임의의 String 타입의 name 지역 변수를 만들고

    plus 메소드에 name.length() 가 되는지 확인해본다.

     

    calc.plus 는 정수 타입만 받을 수 있는데

    name.length() 도 int 타입이기 때문에 계산이 가능하다.

     

    따라서 결과값은 20이 나온다.

     

    ■ 로또 객체로 생성해보기

     

    먼저 메인 메소드에 객체 lotto를 생성해준다.

    그리고 우리가 할 작업을 메소드로 생성하여 출력하면 된다.

     

    1. 로또 번호 뽑는 메소드 생성 + 중복제거

     

     

    먼저 우리는 6개의 로또 넘버를 생성할 것이다.

    필드값에 로또 번호 배열을 먼저 선언해준다.

     

    int [ ] lottoNum = new int[ 6 ];

     

    로또 번호는 int[ ] 배열 형으로 choose() 라는 메소드를 통해 반복하여 생성해준다.

     

    for 문을 통해 번호를 1부터 45까지 반복하는 반복문을 작성해주고 이를 temp 값에 저장한다.

    그리고 중복 값인지 검증을 위해 boolean ch 변수도 만들고 true 로 설정한다. 

     

    배열의 값을 반복을 통해 비교하기 위해 for 문을 불러준다. 

    여기서 j <= i 로 설정하는 이유는 i 는 위에 i < lottoNum.length 로 인해 최대 5가 나온다.

     

    우리는 배열값을 0 ~ 5까지 봐야 함으로 j <= i 로 설정해서 비교한다.

     

    중복을 보기 위해 만약 temp의 값이 배열[ j ] 와 같을 경우 

    ch = false 거짓으로 바꿔주고 break; 해준다.

     

    그렇게 되면 아래 if 검증문을 통해 ch는 거짓으로 i-- 가 돼서

    다시 for 문을 돌게 된다.

     

    만약 temp의 값이 배열 [ j ] 와 같지 않다면, if 문은 실행하지 않고

    아래 if 문으로 돌아서 ch 는 참이기 때문에 i 배열에 temp 값이 등록되게 된다. 

     

    이렇게 반복하게 되면 중복되지 않은 6개의 값을 얻을 수 있다.

     

    2. 로또 번호 정렬

     

     

    로또 번호 정렬을 위해서는 sort() 메소드를 생성해주면 된다.

    sort() 메소드는 메인 메소드에서 lotto.sort() 하고 오류를 클릭하면 자동으로 생성된다

     

    Arrays.sort를 이용하면 배열을 오름차순으로 정렬 가능하다.

     

    3. 로또 번호 출력하는 메소드 생성

     

     

    로또 번호를 출력하는 메소드는 for 문을 통해 각 배열을 출력하는 출력문을 작성해주면 된다.

Designed by Tistory.