자바를 공부해 보자

[중첩 클래스 및 상속, 다형성, 추상화, 인터페이스 ] 클래스 기초 1

자바

1. 클래스 기초 1

클래스란?

-> 학교에 최동수, 김순호등 많은 학생들이 있음

- 이때, 공통으로 묶을 수 있는 것은 학생이고, 이것을 클래스라고 함

 

 

-> 한마디로 일반화된 속성과 메소드로 객체를 기술한 것을 클래스라고 함

 

 

 

2) 클래스의 기본 구성

 

형식)

[접근제한자]    [ 지정예약어 ]    CLASS (예약어)    CLASS이름(사용자 명칭)

extends클래스        implements인터페이스 {            //상속관계도

멤버필드     멤버메소드     생성자        중첩클래스}                                        //4가지가 올 수 있음

 

 

* 클래스 밖에 쓰일 수 있는 것은 package, import,(한 글자 입력 받을 때, throws IOException) 또 다른 클래스

 

 

 

 

 

접근제한자 , 지정예약어 생략가능

import

클래스 안에 필드 : 멤버 필드

 

car : 맴버 메소드

 

 

 

 

 

 

 

 

 

2) 클래스의 기본 구성 (4가지)

 

포함 멤버

 

[1] Field

데이터 저장 공간 (멤버변수 - 클래스 안에 있는 멤버)

참고) 메소드 안에서 선언한 변수는 지역 변수라고

 

[2] Method

특정 행위의 기술 영역(멤버메소드)

 

 

[3] Construct

객체 생성 및 초기화를 시켜주는 생성자 메소드

 

[4] Nested Class

중첩클래스

 

 

 

3) 객체(Objext)

 

객체란?(쓸 수 있는 상태)

-> 정수, 실수 또는 문자 등과 같이 단순한 데이터나 자동차, 비행기 등과 같은 복잡한 사물뿐만 아니라

기업에의 공헌도, 이성간의 사랑 등의 추상적 개념에 이르기까지,

인간이 하나의 개념으로 파악하는 모든 것들을 일컫는 것으로 일반적으로 인간에게 인지되는 개념적인 한 단위를 의미함

 

 

 

 

 

 

-1) 객체는 항상 클래스로부터 생성됨

즉, 클래스는 객체를 생성하는 형판 (template)

 

 

-2) 클래스는 두 개의 구성요소 (member)인 자료구조(필드)와 연산 (메소드)을 가짐

 

-3) 클래스로부터 생성된 객체를 instance(인스턴스)라 함

즉, 객체 =instance

 

 

 

-4) 정보처리의 주체는 클래스가 아니라 객체

 

 

-5) 객체지향 프로그래밍의 시작은 클래스의 생성

 

 

3) 객체(Object)

 

프로그래밍에서의 객체란?

사애와 행위의 집합체이다.. 즉 속성(필드, 데이터)와 메소드(함수, 행위)의 집합체임

 

속성(필드)

객체의 정적 특성으로 객체가 가지고 있는 정보를 보관하는 기억장소로 사용되는 데이터 영역

 

 

 

 

메소드 (기능)

객체의 동적 특성으로서 객체의 데이터를 엑세스하거나 또는 객체가 가지고 있는 속성을 변경하는 일을

 

int a[] ;                                 a=new int[5];                                int a [] = new int[5];

 

 

 

 

4) 클래스와 객체

 

객체지향 프로그램은 3단계로 진행됨

-> 자동차 객체를 예를 들어 설명하면 추상화 작업은 프로그램에 적합하게 자동차 객체를 설계 하는 것임

 

 

 

 

 

new 연산자가 힙 영역에 메모리 할당 할당 후

되돌려 주는 주소는 참조 변수에 저장됨

 

 

car01 참조 변수                         시제자료->힙                Car ( ); - > 생성자

 

 

 

 

 

 

 

 

참조 변수와 객체 -> 힙에 저장

 

 

 

 

 

 

닷(.) 멤버 참조 연산자로 필드에 접근

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5) 클래스 사용법

 

 

 

객체 생성

 

 

사람으로썬 같으나 속성은 다 다르다.

 

 

 

 

 

 

 

6) 생성자

 

 

 

생성자 정의

 

생성자 : 클래스로부터 객체가 생성될 때 초기화 과정을 기술하는 특수한 메소드

 

-클래스명과 동일한 메소드

-결과형 리턴값이 없음

-객체 생성 시 반드시 하나의 생성자 호출

-생성자를 없으면 자동으로 default생성자가 생김 ->JVM(자바 가상 기계) 이 만든다

-생성자 오버로딩 할 수 있음

-멤버 필드 값 초기화를 위해 만든 메소드

-객체를 생성할 때만 사용이 가능

 

 

 

 

 

 

 

 

 

 

객체 생성하기

 

class Person{

String name;

int age;

}

public class Exam_01{

public static void main(String [] args){

Person p1 = new Person();

p1.name="태연";

p1.age=25;

}

}

 

 

 

 

 

 

 

 

 

 

 

생상자의 오버로딩

 

 

 

 

 

 

 

7) this, this메소드

 

* 객체를 선언한 후, 객체 자신을 의미

*this 뒤에 참조연산자(.)를 붙여 멤버 접근 가능

*this(매개변수)를 하면 객체가 가지고 있는 생성자 호출

*this() 사용시 반드시 생성자의 첫 번째 줄에 써야 함

 

 

 

 

 

 

 

 

 

8) 객체의 사용

 

객체참조변수는 해당 객체의 멤버변수와 메소드를 사용할 수 있음

 

사용법

객체참조변수.메소드이름();

객체참조변수.멤버변수이름;

 

 

 

 

 

 

9) 객체로 변환하기

 

기존에 만들었던 방 관리 프로그램을 클래스로 변환하여 만들어보자

 

package ch06;

import java.io.IOException;
import java.util.Scanner;

class Room{
 boolean room[];
 Scanner sc;
 int roomsu;
 Room(){
  sc = new Scanner(System.in);
  System.out.print("방의 갯수를 입력:");
  roomsu = sc.nextInt();
  room = new boolean[roomsu];
 }
 
 Room(int roomsu){
  room = new boolean[roomsu];
  //배열은 맨처음 선언해주면 boolean의 초기값은 false로 만들어진다.
  sc = new Scanner(System.in);
  this.roomsu = roomsu;
 }
 public void input() {
  int roomNumber;
  do {
  System.out.print("입실하실 방의 번호:");
  roomNumber = sc.nextInt();
  }while(roomNumber<1 || roomNumber>roomsu);
  //if (roomNumber<1 || roomNumber>roomsu) input();
  
  if(room[roomNumber-1]) {
   System.out.println(roomNumber+"호실은 사용중입니다");
  }else {
   System.out.println(roomNumber+"호실에 입실하셨습니다");
   room[roomNumber-1] = true;
   
  }
 }
 public void output() {
  int roomNumber;
  do {
  System.out.print("퇴실하실 방의 번호:");
  roomNumber = sc.nextInt();
  }while(roomNumber<1 || roomNumber>roomsu);
  //if (roomNumber<1 || roomNumber>roomsu) input();
  
  if(!room[roomNumber-1]) {
   System.out.println(roomNumber+"호실은 빈 방입니다");
  }else {
   System.out.println(roomNumber+"호실에 퇴실하셨습니다");
   room[roomNumber-1] = false;
   
  }
 }
 public void view() {
  for(int i =0 ; i<roomsu; ++i) {
   if(room[i]) {
    System.out.println(i+1+"호실은 사용중입니다");
   }else {
    System.out.println(i+1+"호실은 빈방입니다");
   }
  }
 }
 
  
 public void exit() {
  System.out.print("프로그램을 종료합니다");
  System.exit(0); //프로그램을 영구히 종료합니다.
 }
}
public class Exam_01 {
 public static void main(String[] args) throws IOException {
  Scanner sc = new Scanner(System.in);
  Room room = new Room();
  while(true) {
   System.out.print("1.입실 2.퇴실 3.방보기 4.종료:");
   int select = System.in.read()-48; // 1,\r, \n //0에 대한 아스키코드값 48
   sc.nextLine(); //엔터키가 들어올때까지 입력을 받겠다.
   switch(select) {
   case 1:
    room.input(); break;
   case 2:
    room.output(); break;
   case 3:
    room.view(); break;
   case 4:
    room.exit(); break;
   default :
    System.out.println("잘못 입력하셨습니다");
    
   }
   
  }
 }

}

 

 

 

 

10) 클래스 배열

 

클래스 배열 만들기

 


 

 

클래스를 배열로 만들 때는 먼저 배열을 만들어 준 후, 각각의 배열마다 객체를 선언해 줘야 함

 

 

11) 클래스 배열 문제 풀이

 

성적관리 프로그램을 클래스로 바꾸어 만들어 보자

 

 

package ch06;

import java.util.Scanner;

class SungJuk{
 String name;
 int kor,eng,mat;
 int tot,rank;
 
 public void sumTot() {
  tot = kor+ eng+mat;
 }
 public void disp() {
  System.out.print(name+"\t");
  System.out.print(kor+"\t");
  System.out.print(eng+"\t");
  System.out.print(mat+"\t");
  System.out.print(tot+"\t");
  System.out.print(rank+"\t");
  
 }
}
public class Exam_02 {
 public static void main(String[]args) {
  System.out.print("인원수를 입력:");
  Scanner sc = new Scanner(System.in);
  int inwon = sc.nextInt();
  
  SungJuk sj[] = new SungJuk[inwon];
  
  for (int i=0 ; i<inwon ; i++) {
   sj[i] = new SungJuk();
   System.out.print("이름을 입력:");
   sj[i].name = sc.next();
   System.out.print("국어점수를 입력:");
   sj[i].kor = sc.nextInt();
   System.out.print("영어점수를 입력:");
   sj[i].eng = sc.nextInt();
   System.out.print("수학점수를 입력:");
   sj[i].mat = sc.nextInt();
   sj[i].sumTot();
   sj[i].rank=1;
   
   
   
  }
  for(int i =0 ; i<inwon ; i++) {
   for (int j=0 ; j<inwon ; j++) {
    if (sj[i].tot <sj[j].tot)sj[i].rank++;
   }
  }
  
  System.out.print("이름\t국어\t영어\t수학\t총점\t순위\n");
  for(int i=0 ; i<inwon ; i++) {
   sj[i].disp();
  }
 }
 
}

 

[배열과 메소드] 메소드의 개요

자바

1. 메소드의 개요

1) 메소드를 사용하는 이유

 

만약 전교생 10000명의 국어 점수를 입력해야 한다면?

코드가 굉장히 지저분해 질것임

 

 

[1] 코드를 간결하게 만들고자 할 때

여러번 실행해야 하는 코드가 있다면 메소드를 만들어 놓고 호출하여 사용

 

[2] 기능을 만들고자 할 때

기능별로 나누어서 프로그램을 작성하면, 나중에 그 기능별로 따로 가져다 사용 할 수 있음

 

2) 메소드의 형식

 

[접근제한자 ]    [지정예약어]    반환형    메소드명    (매개변수)

예외전가{.....} -> throws IOException

 

 

[1] 접근 제한자

private (자신의 클래스에서만 사용되도록 제한)

default(동일한 폴더에서만 사용되도록 제한)

protected (동일한 폴더 + 상속받은 클래스로 제한)

public (객체가 선언된 곳이면 어디에서든 사용)

 

 

 

[2] 지정예약어

class편에서 자세히 알아보자

static : 지금 수업에선 static만 알아두자

final

static final

abstract

synchronized

native

 

[3] 반환형

기본자료형            int     double

참조자료형            class를 객체화 -> class 보고 나서

void - 반환형이 없을 때 사용

 

 

[4] 메소드명

사용자 정의 명칭으로 형식에 맞게 입력

첫글자는 영문 소문자,_,$

 

[5] 매개변수

메소드 사용시 필요한 값을 받을 수 있는 곳

 

[6] 예외전가        throws IOException

예외가 발생하여 전가를 시키고자 할 때

 

 

 

 

3) 메소드 사용 예

 

 

 

 

 

4) 메소드의 4가지 형식

 

 

5) main 메소드 구성

 

main=> public static메소드만 호출 가능

 

6) 메소드 예제

두수를 입력 받아 그 합을 구하는 프로그램

 

package aaa;
import java.io.IOException;
import java.util.*;
public class methodTest1 {
 public static void main(String[] args) throws IOException{
  int su1 = input();        //input 매개변수 없었음
  int su2 = input();
  int sum = plus (su1,su2);    //두 수의 합이니깐 두수를 넣어 주어야 함
  output(sum);
 }
  public static int input() {
   Scanner sc = new Scanner(System.in);
   System.out.print("임의의 수를 입력:");
   int su = sc.nextInt();
   return su;
  }
  public static int plus(int su1, int su2) {
   return su1+su2;
 }
  public static void output(int sum) {
   System.out.println("입력하신 수의 합:"+sum);
  }

}

 

 

 

^메인을 복잡하게 만들지 않습니다

 

7) 메소드 오버로드

메소드 오버로드 : 메소드의 이름을 여러번 사용 할 수 있는 기능

 

메소드의 이름이 같고, 매개변수가 틀린 메소드 집합

매개변수가 틀린다는 말은, 자료형이 다르거나, 매개변수의 개수가 다르거나, 자료형 순서가 다른 것을 말함

반환형은 조건에 해당하지 않음

 

 

 

 

c언어 함수이름

객체지향 언어 함수이름+매개변수

 

 

 

 

 

 

 

 

8) 메소드 오버로딩

두 수를 입력 받아 그 합을 알려주는 프로그램

 

 public byte add(byte a, byte b) {
  return (byte)(a+b);
 }
 public int add (int a, int b) {
  return a+b;
 }
 public double add(double a, double b) {
  return a+b;
 }
}

 

 

 

 

9) 메소드 재귀호출

-> 메소드 내에서 자신을 또 호출 할 때 주의 할점은 반드시 종료 시점이 있어야 함

 

 

public static void disp(){

disp();

}

 

단점 : 끝나는 시점이 없음 , 오버플로우가 됨

 

 

 

팩토리얼 계산 프로그램

5! =120 이라는 결과가 나올 수 있도록 메소드 작성

 

 

 

(사람풀이) 5! = 5 *4 *3 *2 *1 =120

(컴퓨터의 풀이) 5! = 5*4!; 4!=4*3! = 3*2! ; 2! = 2*1! ; 1!=1

 

실습 : 피보나치 수열을 알아보고 프로그램을 작성

 

 

package aaa;
import java.util.*;
import java.io.*; // 한글자 입력
public class dd43 {
 public static void main(String[] args)throws IOException {
  // 두개의 수와 한개의 산술연산자를 입력받아 그 연산자 대로 하는 프로그램
  //단, 연산자가 뺼셈일 떄는 큰수에서 작은 수를 빼서 결과를 알려주세요
  //단, 나눗셈일 때는 2번째 수가 0이면 1로 고쳐서 결과를 알려주세요
  
  //메소드를 이용하여 만들기
  Scanner sc = new Scanner(System.in);
  
  int su1 = input();
  int su2 = input();
      System.out.print("산술연산자를 입력:");
          char op =(char)System.in.read(); //한글자 입력
  int result =0;
      switch(op) {
          case '+':
               result = plus(su1,su2);
               break;
              case '-':
           result = min(su1,su2);
                   break;
          case '*':
              result = mul(su1,su2);
               break;
          case '/':
               result = div(su1,su2);
                   break;
   
       default :
            System.out.println("연산자를 잘못 입력 하셨습니다." );
  }
  System.out.println("결과:"+result);
 }
 public static int plus(int a ,int b) {
  return a+b;
 }
 public static int min(int a, int b) {
  if(a>b) return a-b;
  else return b-a;   //큰수에서 작은 수 빼야하니깐
 }
 
 
 public static int mul (int a, int b) {
  return a*b;
 }
 public static int div(int a, int b) {
  if(b==0) b=1; //만약 b가 0이면 b를 1로 바꿔줘라
  return a/b;
 }
 public static int input() {
  Scanner sc = new Scanner(System.in);
  System.out.print("임의의 수를 입력:");
  int su = sc.nextInt();
  return su;
  
  
  
 }
}

 

 

----------------------------------------------

 

package aaa;
import java.util.*;
public class Exam_02 {
 public static void main(String [] args) {
  //팩토리얼 구하기
  Scanner sc =new Scanner(System.in);
  System.out.print("팩토리얼의 수를 입력:");
  int facSu = sc.nextInt();
  
  System.out.printf("%d의 팩토리얼 결과값은 %d입니다.\n", facSu , factorial(facSu));
  
 }
 public static int factorial(int n) {
  if(n==1) return 1;
  return n* factorial(n-1);
  
 }
}

 

 

 

 

팩토리얼의 수를 입력:5
5의 팩토리얼 결과값은 120입니다.

 

 

--------------------------------------

 

package aaa;

public class Exam_03 {
  public static void main(String[] args) {
   //피보나치 수열 구하기
   //1,1,2,3,5,8,13,21,34,55,89,........
   
   for ( int i =1 ; i <10 ; ++i) {
      System.out.print(Pivo(i)+" , ");
   }
   System.out.println(Pivo(10));
   
  }
  public static int Pivo(int n) {
   if(n<=2) return 1;
   return Pivo(n-2) + Pivo(n-1);
  }
}

 

 

1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55

 

 

 

 

 

 

 

[배열과 메소드]배열의 개요

자바

1. 배열의 개요

1) 배열을 사용하는 이유

 

예시 학생 5명의 성적을 저장해야 한다면

int s1 , s2, s3 , s4 , s5;

 

 

 

만약 전교생 (10000명) 의 저장해야 한다면?

 

같은 종류의 데이터(자료형)를 저장하기 위한 자료 구조

 

* 배열을 객체로 취급

* 배열을 선언할 때 배열의 크기를 명시하지 않음

* [ ] (배열첨자연산자) 는 앞에 오나 뒤에 오나 상관이 없음

 int []a = new(할당연산자) int [5]

 int a[] = new int[5]'

 int a[];a = new int[5];

* 어떤 형으로 사용할 것인가를 정하고 배열변수를 정해줌

 

 

2) 1차원 배열의 선언

 

자바에서의 배열순서

배열의 선언 -> 배열의 메모리 할당 (배열의 생성) -> 배열 요소(원소)의 이용

 

 

배열 : 자료형이 동일한 여러개의 값을 연이어 저장할 수 있도록 하는 기억 공간의 집합체(모임) 

 

원소: 배열에 저장된 각각의 값

 

인덱스 : 배열의 원소에 접근하기 위한 첨자

a[0] , a[1] ...

-> 자바에서의 인덱스는 0부터 시작

 

 

3) java메모리 구조

 

힙:동적메모리

 

4) 배열의 생성

래퍼런스 변수란?

기본 데이터를 값으로 갖는 것이 아니고, 메모리상이 다른 객체나 배열을 가리키고 있는 변수임

 

 

int [] a =new(동적 메모리 할당 연산자) int [5]

 

 

5) 1차원 배열 초기값

초기 값을 콤마로 구분하여 여러 번 기술하고 이들을 중괄호 {} 로 감싸줌

 

int [ ] a (원소 갯수 쓰면 큰일난다.. 절대 쓰지 마..) = {10,20,30,40,50};

int [ ] a = new int[ ] {10,20,30,40,50};

 

 

6) 1차원 배열의 원소 입력, 출력

[배열의 원소 값들을 입력하기]

 

int a[] = new int[5];

 

for (i=0 ; i<a.length ; i++)

a[i] = (i+1)*2;

 

 

* a.length

배열명. -> 배열명이 가지고 있는 갯수가 몇입니까?

* 배열의 개수를 알아 낼 수 있음

 

 

[배열의 원소 값들을 출력하기]

 

 

10개의 수를 입력 받아 입력한 수와 합을 출력하는 프로그램

 

 

 

package aaa;
import java.util.*;
public class aa13 {
 public static void main(String [] args) {
  Scanner sc = new Scanner(System.in);
  
  int arr[] = new int[10]; //메모리에 10개를 저장할 공간을 확보
  int sum =0;
  for (int i=0 ; i<arr.length ; ++i) {
   System.out.print(i+1+"번째 수를 입력:");
  arr[i] = sc.nextInt();
  sum+=arr[i];
 }
  for (int i=0 ; i<arr.length-1 ; ++i) { //8번방 까지 나타내주세요.
   System.out.print(arr[i]+"+");
  }
  System.out.println(arr[9]+"="+sum); //9번방만,,
}
}

 

 

1번째 수를 입력:3
2번째 수를 입력:1
3번째 수를 입력:5
4번째 수를 입력:7
5번째 수를 입력:9
6번째 수를 입력:2
7번째 수를 입력:6
8번째 수를 입력:1
9번째 수를 입력:0
10번째 수를 입력:6
3+1+5+7+9+2+6+1+0+6=40

 

 

 

-------------------------------------

 

7) 배열 예제

 

10개의 수를 입력 받아 낮은 수부터 출력하기 (정렬)

 

 select sort

 

 

 

package aaa;
import java.util.*;
public class aa14 {
 public static void main(String [] args) {
  Scanner sc = new Scanner(System.in);
  
  int arr[] = new int[10];
  
  for (int i =0 ; i<arr.length ; i++) { //++i 둘 다 사용 해도 됨
   System.out.print(i+1+"번째 수를 입력:"); //컴퓨터는 0부터 시작하니깐
   arr[i] = sc.nextInt();
   
  }
  
  for(int i=0 ; i<arr.length -1 ; i++) { //오름차순
   //select sort에서 비교할 때는 비교 대상은 마지막 자리는 안한다.
   
   for(int j=i+1 ; j<arr.length ; j++) { //기준보다 하나 큰 위치 부터 시작한다.
    if (arr[i] >arr[j]) {
     int imsi = arr[i];
     arr[i] = arr[j];
     arr[j] = imsi;
    }
   }
   
   
  }
  for (int i = 0 ; i<arr.length ; i++) {
   System.out.print(arr[i]+",");
  }
  System.out.println(arr[9]); //마지막,해주지 않기 위해 
 }
}

 

 

 

 

-------------------------------------------

 

8) 배열의 동적 할당

 

배열은 선언 후, 나중에 변수 값으로 할당 받을 수 있음

 

 

int arr [] ;

int inwon = 5;

arr = new int[inwon];

 

-> inwon값이 변경되면 배열의 수도 변경됨

 

 

 

9) 동적할당 예제

 

 

인원수를 입력받고, 그 인원수 만큼 이름과 전화번호를 입력받아 출력해주세요

 

package aaa;

import java.util.Scanner;

public class dd6 {
 public static void main(String [] args) {
  Scanner sc = new Scanner(System.in);
  
  System.out.print("인원수를 입력:");
  int inwon = sc.nextInt();
  
  
  String name[] = new String[inwon]; //문자열 형식 string
  String tell[] = new String[inwon];
  
  for (int i=0 ; i<inwon ; ++i) {
   System.out.print("이름을 입력:");
   name[i] = sc.next();
   System.out.print("전화번호를 입력:");
   tell[i] = sc.next();
  }
  for (int i =0 ; i<inwon ; i++) {
   System.out.println(name[i]+"님의 전화번호는"+tell[i]+"번입니다.");
  }
 }
}

 

 

 

 

 

 

인원수를 입력:3
이름을 입력:홍길동
전화번호를 입력:1234
이름을 입력:유재석
전화번호를 입력:2345
이름을 입력:박명수
전화번호를 입력:3456
홍길동님의 전화번호는1234번입니다.
유재석님의 전화번호는2345번입니다.
박명수님의 전화번호는3456번입니다.

 

 

-------------------------------

 

인원을 설정하고 이름, 국어, 영어, 수학, 점수를 입력 받아 총점과 순위까지 출력해주는 프로그램

 

 

package aaa;
import java.util.*;
public class dd77 {
 public static void main(String [] args) {
  Scanner sc = new Scanner(System.in);
  
  System.out.print("인원수를 입력:");
  int inwon = sc.nextInt();
  
  
  String name [] = new String[inwon];
  int kor[] = new int[inwon];
  int eng[] = new int[inwon];
  int mat[] = new int[inwon];
  int tot[] = new int[inwon];
  int rank[] = new int[inwon];
  
  for ( int i =0 ; i<inwon ; ++i) {
   System.out.print(i+1+"번째 학생 이름:");
   name[i] = sc.next();
   System.out.print(i+1+"번째 학생 국어 점수:");
   kor[i] = sc.nextInt();
   System.out.print(i+1+"번째 학생 영어 점수:");
   eng[i] = sc.nextInt();
   System.out.print(i+1+"번째 학생 수학 점수:");
   mat[i] = sc.nextInt();
   tot[i] = kor[i] +eng[i] + mat[i];
   rank[i] = 1; // 제일 성적이 좋으면 1등이다.
  }
  
  //전체를 1등으로 만들고 내 성적 다른사람 성적보다 떨어지면 내순위를 1등씩 올린다
  for (int i =0 ; i<inwon ; ++i) {
   for (int j =0 ; j<inwon ; ++j) {
    if (tot[i] <tot[j])rank[i]++;
   }
  }
  System.out.print("이름\t국어\t영어\t수학\t총점\t순위\n");
  for(int i=0 ; i<inwon; ++i) {
   System.out.print(name[i] +"\t");
   System.out.print(kor[i] +"\t");
   System.out.print(eng[i] +"\t");
   System.out.print(mat[i] +"\t");
   System.out.print(tot[i] +"\t");
   System.out.print(rank[i] +"\n");

   
  }
 }
}

 

 

 

 

인원수를 입력:3


1번째 학생 이름:유재석
1번째 학생 국어 점수:33
1번째 학생 영어 점수:44
1번째 학생 수학 점수:55
2번째 학생 이름:박명수
2번째 학생 국어 점수:33
2번째 학생 영어 점수:22
2번째 학생 수학 점수:55
3번째 학생 이름:정준하
3번째 학생 국어 점수:77
3번째 학생 영어 점수:66
3번째 학생 수학 점수:44


이름 국어 영어 수학 총점 순위
유재석 33 44 55 132 2 
박명수 33 22 55 110 3 
정준하 77 66 44 187 1 

 

 

 

--------------------

10) Random

 

컴퓨터가 난수를 발생시키는 방법

 

Math.random()

Random(클래스)

 

 

System.out.println("난수=" + Math.random());

 

1~10 사이의 정수값 뽑기

int ran = (int)(Math.random()*10)+1;

 

11) Math.random() 예제

 

up, down게임 만들기

 

예를 들어 컴퓨터가 75를 선택했다고 가정

(컴퓨터수를 random수로 한다)

 

1~100 사이의 수를 선택 :50

up

1~100 사이의 수를 선택 : 70

up

1~100사이의 수를 선택 :80

down

1~100사이의 수를 선택

 

 

 

 

package aaa;
import java.util.*;
public class sfsdf {
 public static void main(String[]args) {
  int comsu=(int)(Math.random()*100)+1; //1부터 시작이니깐.. 정수이니깐
  int count = 0 ;
  Scanner sc = new Scanner(System.in);
  
  
  while(true) {
   System.out.print("1~100사이의 수를 입력:");
   int selectSu = sc.nextInt();
   count++;
   
   if ( comsu == selectSu)break;
   else if ( comsu>selectSu) System.out.println("up");
   else System.out.println("down");
  }
  System.out.println(count+"번만에 맞추셨습니다");
 }
}

1~100사이의 수를 입력:50
up
1~100사이의 수를 입력:80
down
1~100사이의 수를 입력:70
up
1~100사이의 수를 입력:77
down
1~100사이의 수를 입력:75
down
1~100사이의 수를 입력:76
down
1~100사이의 수를 입력:73
up
1~100사이의 수를 입력:74
8번만에 맞추셨습니다

 

 

------------------------------

 

로또 게임 만들기 프로그램

 

컴퓨터가 6개의 임의의 수를 선택하게 한 후, 사용자가 6개의 수를 입력하여 맞춘 개수를 알려주는 프로그램

단, 6개를 다 맞추면 축하한다는 메시지도 같이 출력해주자

 

 

중복되지 않은 6개의 수

1~45번 중 선택을 해야 함

 

 

 

 

package aaa;

import java.util.*;

public class afafds {
 public static void main(String [] args) {
  
  int comsu [] = new int[6]; // 배열 선언
  int yousu[] = new int[6]; //사용자 수 선언
  
  for (int i =0 ; i<comsu.length ; i++) {
   comsu[i] = (int)(Math.random()*45)+1; // 1~45까지
   
   for (int j=0 ; j<i ; ++j) { //중복되는 경우 빼기
    if(comsu[i] == comsu[j]) {
     i--; break;
    }
   }
  }
  //사용자 수 받기
  Scanner sc = new Scanner(System.in);
  
  //컴퓨터수 받기
  for (int i =0 ; i<comsu.length ; i++) {
   do {                    //do while 무조건 1번만 값을 받을 떄
       System.out.print(i+1+"번째 수를 입력:");
       yousu[i]=sc.nextInt();
   }while(yousu[i]<1 || yousu[i]>45);
   for (int j=0 ; j<i ; ++j) { //중복되는 경우 빼기
    if(yousu[i] == yousu[j]) {
     i--; break;
 }
}
  }
  
  int count = 0 ;
  for (int i=0 ; i<comsu.length ; i++) {
   for (int j=0; j<yousu.length ; ++j) {
    if (comsu[i] == yousu[j]) {
     count++;
     
     break;
     
    }
   }
  }
  if (count == 6) System.out.println("축하합니다. 전부 다 맞추셨습니다.");
  else System.out.println(count+"개를 맞추셨습니다.");
 }
}

 

 

1번째 수를 입력:22
2번째 수를 입력:25
3번째 수를 입력:40
4번째 수를 입력:12
5번째 수를 입력:44
6번째 수를 입력:21
1개를 맞추셨습니다.

 

 

----------------------------------------------

 

 

12) 2차원 배열

2차원 배열은 1차원 배열을 여러개 묶어서 사용한 형태로 이해

 

 

 

데이터형 배열 변수명 [] [] ; 혹은 데이터형 [] []

 

 

14) 배열의 생성

array-name = new type[size];

 

 

int name [] [] = new int[4][5]; (정적)

 int name [] [] = new int[3][ ]; (동적)

 

 

 

 

int name[5] , int name = new int[ ] [3] 은 가능하지 않음

 

 

15) 2차원 배열 예제

 

 

 

package aaa;

public class dsfsafsd {
 public static void main(String [] args) {
  int arr1[][];
  int[][] arr2;
  int[] arr3[];
  
  
  int arr4[][] = new int[3][4];
  int arr5[][] = new int[3][];
  arr5[0] = new int[2];
  arr5[1] = new int[3];
  arr5[2] = new int[4];
  
  
//  int arr4[][][];
//  int[][][] arr5;
//  int[][] arr6[];
//  int[] arr7[][];
  
 }
}

마방진 만들기

 

시작점은 첫 번 쨰줄 가운데

오른쪽 대각선으로 이동

이동한 곳에 행의 값이 음수이면 그 열의 최대값으로 이동

이동한 곳에 열의 값이 배열을 벗어나면 그 행의 최소값으로 이동

이동한 곳에 데이터가 있다면 원래 위치로 이동 후 행을 하나 증가

 

 

package aaa;

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

  //홀수 마방진, 5의 마방진
  //가로, 세로, 대각선의 합이 모두 같은 진
  
  int arr[][] = new int[5][5];
  int i=0, j=2; // 1.첫번 째 줄 가운데 열에서 시작
  int co =1;
  while (co<=25) {
   arr[i][j] = co ;
   int oldI=i;
   int oldJ =j;
   i--; j++; // 2. 오른쪽 대각선 위로 이동
   if (i<0) i =4; // 3.행이 음수가 되면 그 열의 최대행으로 이동
   if (j>4) j=0; // 4.열이 배열의 값을 벗어나면 0열로 이동
   if (arr[i][j] !=0) { // 5. 이동할 곳에 데이타가 존재하면 
    i = oldI;
    j = oldJ;    //원래ㅐ 위치로 이동하고
    i++;        //행을 하나 증가시킨다.
   }
   co++;
  }
  for(i=0 ; i<5 ; ++i) {
   for (j=0 ; j<5 ; ++j) {
    System.out.printf("%2d",arr[i][j]);
   }
   System.out.println();
  }
 }
}

 

 

 

  17  24   1   8  15
  23   5   7  14  16
   4   6  13  20  22
  10  12  19  21   3
  11  18  25   2   9

 

 

 

 

 

'자바' 카테고리의 다른 글

[중첩 클래스 및 상속, 다형성, 추상화, 인터페이스 ] 클래스 기초 1  (0) 2018.09.10
[배열과 메소드] 메소드의 개요  (0) 2018.09.10
반복문  (0) 2018.09.10
제어문  (0) 2018.09.10
자바 연산자  (1) 2018.09.09