10일차의 가장 중요한 포인트

- 사용자 정의 클래스 자료형 만들기 및 클래스 자료형 선언 방법
- 선언한 클래스 자료형을 이용하여 여러 객체 생성
- 클래스 자료형으로 배열 만드는 이유
- 유저가 자료를 임의로 입력할때 setter 를 이용하여 클래스 자료형 배열에 객체를 저장.
- 클래스 자료형 배열 내에 getter를 이용하여 객체n번째에 저장된 자료를 출력


클래스, 객체, 인스턴스

1. 클래스의 객체에 원본 정의서.

2. 객체(instance)는 클래스가 실행되서 메모리에 적재된 상태를 말함.
클래스(원본) -> 객체1 -> 독립적인 상태 유지 -> 소멸 -> 가비지 컬렉터
                  -> 객체2 -> 독립적인 상태 유지 -> 소멸 -> 가비지 컬렉터
                  -> 객체3 -> 독립적인 상태 유지 -> 소멸 -> 가비지 컬렉터

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



문제) 거스름돈을 화폐단위로 구분해서 출력.
실행예)
금액(10~1000)? 990
총액 : 990원
오백원 1개, 백원 4개, 오십원 1개, 십원 4개




문제) 2자리 이상의 수를 입력 받아서 자릿수들의 합을 계산해서 출력. 클래스 이용.
실행 예)
숫자 입력(2자리 이상)?1234
1000자리의 수 -> 1
100자리의 수 -> 2
10자리의 수 -> 3
1자리의 수 -> 4
자릿수의 합 : 10

1234 -> 문자열 길이를 얻는다 -> 4

2 -> (10)2-1승 -> 10
3 -> (10)3-1승 -> 100
4 -> (10)4-1승 -> 1000
...
n -> (10)n-1승 -> 100000....  -> a

1234 -> (1234%10000)/1000 -> 1234/1000   -> 1
1234 -> (1234%1000)/100 -> 2
1234 -> ((1234%1000)%100)/10 -> 3
1234 -> (((1234%1000)%100)%10)/1 -> 4






문제) 2자리 이상의 수를 입력 받아서 자릿수들의 합을 계산해서 출력. 클래스 이용.
문자열을 한 글자씩 분리하는 방법으로 해결 
실행 예)
숫자 입력(2자리 이상)?1234
1000자리의 수 -> 1
100자리의 수 -> 2
10자리의 수 -> 3
1자리의 수 -> 4
자릿수의 합 : 10






문제) 세 개의 숫자 중에서 가장 큰 숫자 구하기. 사용자 정의 클래스 이용. sort() 메소드 금지
실행 예)
숫자1? X
숫자2? Y
숫자3? Z
입력 받은 숫자: X, Y, Z가장 큰 숫자: X






문제) 여러 개의 숫자 중에서 가장 큰 숫자 구하기. 배열 및 사용자 정의 클래스 이용. sort() 메소드 금지
실행 예)
입력할 숫자의 갯수 지정(2~10)?
숫자1? X
숫자2? Y
숫자3? Z
...
입력 받은 숫자: X, Y, Z, .....
가장 큰 숫자: X





접근 지정자


1. public, private, protected, default(표시하지 않는 상태)

2. 외부에서 해당 멤버를 접근할 수 있는 기준제시.

package 패키지명;
접근지정자 class 클래스명 {

접근지정자 자료형 멤버변수;
접근지정자 자료형 메소드명(매개변수 리스트) {
자료형 지역변수; //접근지정자 사용 불가.
//실행문
}

자료형 멤버변수;
접근지정자 자료형 메소드명(매개변수 리스트) {
자료형 지역변수; //접근지정자 사용 불가.
//실행문
}
}


3. 멤버변수는 private, 클래스나 메소드는 public을 주로 사용.

4.
public 지정시 -> 어떤 위치에서든지 접근 가능.
private 지정시 -> 해당 영역 안에서만 접근 가능.
protected 지정시 -> 상속 관계가 있는 클래스에서만 접근 가능.
default 지정시(아무것도 안썼을때) -> 같은 패키지 내에서만 접근 가능.

Class08_02 -> [각주:1] (같은 패키지에 소속되어 있는 상태)
Class08_3 -> [각주:2] (다른 패키지에 소속되어 있는 상태)
Class08_4 -> [각주:3] (다른 패키지에 소속되어 있는 상태)





getter, setter

1. 메소드중에서 private 멤버변수를 위한 접근용 메소드.






이클립스 기능을 이용한 getter, setter 메소드 자동 완성





중요 예제 (클래스 자료형 선언, 객체 생성, 출력등)

이름과 전화번호를 저장할 수 있는 자료형 만들기
실행 예)
회원 수(1~10)?3
이름 전화번호(1)? hong 111-1111
이름 전화번호(2)? kim 222-2222
이름 전화번호(3)? park 333-3333
----------------
전체 회원수: 3명
----------------
이름    전화번호
hong    111-1111
kim     222-2222
park    333-3333
----------------

//Member.java (사용자 정의 클래스)

package com.test;

public class Member {

private String name, tel;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}


//Class11.java (main() 메소드 포함 클래스)


package com.test;

import java.util.*;

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

//입력
Scanner sc = new Scanner(System.in);
System.out.print("회원수 입력(1~10)?");
String num = sc.next();
int count = Integer.parseInt(num);

//이름및 전화번호 자료형 클래스 활성화 및 저장용 배열 생성
                //아래에서 사용된 Member는 사용자 정의 클래스 자료형(참조형)을 의미한다.
                //배열의 자료형 선언은 String, int, 참조형등 여러 자료형 선언이 가능하고,
                //
배열 자체가 for문등 사용자 임의의 수를 기반으로 데이터를 운용하기에 
                //매우 적합하기 때문에 이 예제에서 클래스 자료형 배열을 생성한 것이다.

Member[] members = new Member[count]; // 사용자 정의 클래스 자료형인 배열을 생성

//처리

for (int a=0; a<members.length; a++) {
System.out.printf("이름:전화번호(%d)?", (a+1));
String name = sc.next(); //이름
String tel = sc.next(); //전화번호

Member member = new Member();   // member 객체 생성 과정
member.setName(name);                //member 객체에 이름 저장(바로 윗줄에서 생성한 객체이름)
member.setTel(tel);                       //member 객체에 전화번호 저장
members[a] = member;                 //member 객체를 배열에 저장하는 과정

}

//출력

System.out.println("----------------");
System.out.printf("전체 회원수: %d명%n", count);
System.out.println("----------------");
System.out.println("이름   전화번호");
for (int a=0; a<members.length; a++) {

//members[a]는  Member 객체를 리턴할 뿐이다.
//name, tel 접근을 하려면  Member 객체에서 gerName(), gerTel()을 이용해야 한다.
// System.out.printf("%s %s %n", members[a]); 일케하면 members[a]는 자동으로 이름과 전화번호를 뿌려주지 않는다.


//캐스트 연산자 Member 유의. 추후 캐스트 연산자를 이런식으로 사용할 수 있는 케이스가 있다.
//현재 예제에서는 캐스트 연산자를 사용하지 않아도 된다.


//members[a] 에는 name 과 tel 이라는 두 저장공간이 있다.
//
출력단에서 출력할때에 members[a]라고만 기재할 경우 출력되지 않으며,
//(배열명).사용자정의클래스내메소드명()     형식으로 기재해야한다.
//
즉, (members[a]).getName()

    System.out.printf("%s    %s %n", ((Member)members[a]).getName(), ((Member)members[a]).getTel()); 
}

System.out.println("----------------");

}

}

  1. public void method1() { System.out.println("Class08_2 > method1() 호출");} void method2() { System.out.println("Class08_2 > method2() 호출");} private void method3() { System.out.println("Class08_2 > method3() 호출");} [본문으로]
  2. public void method1() { System.out.println("Class08_3 > method1() 호출");} void method2() { System.out.println("Class08_3 > method2() 호출");} private void method3() { System.out.println("Class08_3 > method3() 호출");} [본문으로]
  3. public void method1() { System.out.println("Class08_4 > method1() 호출");} void method2() { System.out.println("Class08_4 > method2() 호출");} private void method3() { System.out.println("Class08_4 > method3() 호출");} public void method4() { method3();} } [본문으로]

WRITTEN BY
빨강꼬마

,

만년달력

1. 1년 1월 1일부터 전년도 12월 31일까지의 총 날짜수 구함.
int total = (year-1)*365 + ((year-1)/4 - (year-1)/100 + (year-1)/400);


2. 해당년도 1월 1일부터 해당년도 해당월 1일까지의 총 날짜수 구함.
int[] m = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
for (int a=0; a<month-1; a++) {
total += m[a];
}
//해당월 1일 때문에 +1
total++;
//올해가 윤년이면서 2월 이상인 경우 +1
if (month>=3 && (year%4==0 && year%100!=0 || year%400==0)) {
total++;
}


3. 해당년도 해당월의 첫 날(1일)의 요일(일, 월, 화, 수, 목, 금, 토) 구함.
String[] d = {"일", "월", "화", "수", "목", "금", "토"};
int days = total % 7;
System.out.printf("%s요일 %n", d[days]);


4. 콘솔버전에서 날짜를 달력 형태로 출력.






난수 발생

1. 0 부터 1 사이의 무작위 숫자를 난수라고 함.

2. Random 클래스의 nextInt() 메소드를 이용하면 쉽게 난수를 얻을 수 있다.

import java.util.*;
Random rd = new Random();

int val = rd.nextInt(100); //0 보다 크거나 같고 100 보다는 작은 난수

예를 들어, 로또번호는 1~45까지만 존재. rd.nextInt(45) + 1 라고 계산함.
난수를 여러개 발생시키고, 배열에 저장한 다음, 난수 출력. 1~45 범위의 숫자 6개.






문제) 여러개의 난수를 발생시키고, 난수들 중에서 가장 큰 값과 가장 작은 값을 별도 출력. 난수 허용 범위는 1~100. 배열 이용.
실행 예)
난수 갯수(2~20)?5
난수 결과 : 55 9 12 6 90 
가장 큰 값 : 90
가장 작은 값 : 6






중복되지 않은 난수 얻기 (1~100)_방법1
실행 예)
난수 갯수(2~20)? 5
난수 결과 : 3 4 5 10 12


//중복되는 경우

int size=5;
int count=0;
int[] arr = new int[size];
Random rd = new Random();
while(true) { //무한실행 (특정 갯수의 난수를 얻을때까지 반복)
int random = rd.nextInt(100) + 1;
arr[count] = random;
count++;
if (count == size) {
break;
}
}


//중복되지 않은 경우

int size=5;
int count=0;
int[] arr = new int[size];
Random rd = new Random();

while(true) { //무한실행 (특정 갯수의 난수를 얻을때까지 반복)
int random = 0;
boolean check = false;


do {
check = false;
random = rd.nextInt(100) + 1;
for (int a=0; a<count; a++) {
if (arr[a] == random) {
check = true;
}
}
}while(check);  //무한실행 (중복되지 않는 경우만 배열에 저장)


arr[count] = random;
count++;
if (count == size) {
break;
}
}






중복되지 않은 난수 얻기 (1~100)_방법2
실행 예)
난수 갯수(2~20)? 5
난수 결과 : 3 4 5 10 12






문제) 로또 번호를 원하는 장수 만큼 출력.
로또 번호는 1~45 범위의 숫자를 중복되지 않은 상태에서 6개가 되면 1장에 해당.
실행 예)
로또 장수(1~20)?3
번호1 :  1 12 13 34 35 36
번호2 : 12 20 25 30 39 45
번호3 :  1  4  9 20 30 42






문제) 가위,바위,보 게임. 
1~3 사이의 난수가 발생하면 가위, 바위, 보라고 생각하고 사용자가 내는 가위, 바위, 보와 비교해서 승패 결정.
실행 예)
사용자 선택(1:가위, 2:바위, 3:보, -1:종료)?1
사용자:가위, 컴퓨터:바위
결과 : 컴퓨터 승!

사용자 선택(1:가위, 2:바위, 3:보, -1:종료)?2
사용자:바위, 컴퓨터:바위
결과 : 비겼습니다.

사용자 선택(1:가위, 2:바위, 3:보, -1:종료)?-1
사용자 승:0회, 컴퓨터 승:1회





객체 지향 프로그래밍

-> 프로그램의 대상이 되는 데이터를 객체로 취급하는 프로그램 기법.


클래스 
- 객체에 대한 원본 정의서. 
- 데이터형을 정의하는 코드 작성 필요.
- 사용자가 직접 데이터형에 대한 정의를 추가해야 한다. 
- 멤버변수(상태), 메소드(행위)

예를 들어서, 
int 자료형은 상태값은 있지만 행위는 없다.
Integer 클래스는 상태값만 있는게 아니라 행위도 가능하다.

나무(상태) -> 조각가(클래스) -> 조각(행위) -> 작품(결과)

예를 들어, 프린터 클래스를 만든다면
class 프린터 {
//멤버변수
int 잉크 = 100;
int 종이 = 0;

//메소드
void 인쇄(대상) {
if (잉크>0 && 종이>0) {
//대상 출력
잉크--;
종이--;
} else {
//잉크 또는 종이 부족 메시지 출력
}
}
void 종이공급(매수) {
종이 += 매수;
}
}



클래스 정의 기본 형식

1. 클래스명은 첫 글자는 대문자로 표기

2. class 클래스명 { .... }

3. 저장시 물리적 파일명은 클래스명.java

4. public class 클래스명 {   ..    } 에서 public은 접근지정자. 

외부에서 클래스를 참조할 때 접근 가능한 지역 표시.

5. 멤버변수와 메소드는 사용자 정의.

6. 멤버변수와 메소드도 접근 지정자를 별도 지정. 멤버변수는 private, 메소드 public 주로 사용.


멤버변수 정의 예.  private int a = 0;

메소드 정의 예. public void method() { ...  }




산술연산 담당 클래스 연습
-> Calc
-> 숫자 두 개에 대한 덧셈 결과 리턴
실행 예)
숫자1?10
숫자2?20
입력된 숫자 : 10, 20
결과 : 30





산술연산 담당 클래스2 
-> 기존의 Calc 클래스에 메소드 추가를 이용해서 수정 가능.
-> 임의의 정수 두 개를 받아서 n부터 m까지의 합을 계산해서 출력.
실행 예)
숫자1?1
숫자2?10
입력된 숫자: 1, 10
연산 결과: 55



WRITTEN BY
빨강꼬마

,