2023.05.09
1교시
* 복습 - 책258p
* 메소드 호출
- 클래스 내,외부의 호출에 의해 실행됨
- 내부 : 단순한 메소드 이름으로 호출
ex) void run() {}
run();
- 외부 : 클래스에서 생성한 객체와 참조변수 이용 [ 객체.메소드() ]
ex) Car car = new Car();
car.run();
객체 메소드
* 객체생성
// 객체 생성
클래스 참조변수 = new 클래스(매개값, ...);
Car myCar = new Car();
// 호출
참조변수.메소드(매개값, ...); // 리턴값 없음, 또는 받지 않음
myCar.run();
타입 변수 = 참조변수,메소드(매개값, ...); // 리턴값 있음 , 또는 받고 싶음
int speed = myCar.getSpeed();
- 메소드 이름은 짧게 / 변수 이름은 길게- 식별 가능한 정도로(두 단어 정도)
- 메소드에 기능을 작게 담기 - 오류 방지
* 메소드 안에 메소드를 넣기 가능
public class ClassName {
void methodA( String x, int y ) {
}
void methodB() { // 메소드A를 호출
methodA( "김철수" , 10 );
}
}
* 메소드 : 리턴값 있는경우, 없는 경우(void)
- 리턴값이 있는 메소드를 호출하고 리턴값을 받고싶다면 다음과 같이 변수를 선언하고 리턴값을 대입
타입 변수 = 메소드 ( 매개값, ...);
2교시
* 오버라이드 : 기존의 것을 재활용
* 오버로딩 : 중첩함수, 메소드 이름이 같고 매개변수(개수, 타입)가 다름, 리턴타입은 상관없음
-> 매개값을 다양하게 받아 처리 가능(활용법)
* 자동형변환
- 작은 쪽에서 큰 쪽으로 감
- 상속 또는 기본형에서 이뤄짐
int x = 10;
double y = 10.5;
add(x, y); // 자동형변환
- int 가 double로 형변환 됨
* 선언부 = 헤더 = 시그니처 = 정의부
- 리턴타입, 메소드이름, 매개변수선언부분으로 구성
● void (리턴값 없음) - 실습(extend_class)
package extend_class;
public class CheckReturnClass { //public이 붙으면 클래스이름과 파일이름이 같아야함
public void add(int x, int y) {
System.out.printf("%d + %d = %d\n", x, y, (x + y));
return;
}
void add(double x, double y) {
System.out.printf("%f + %f = %f\n", x, y, (x + y));
return;
}
}
- public이 붙으면 클래스이름과 파일이름이 같아야함
실행클래스
package extend_class;
public class CheckReturnClassApp {
public static void main(String[] args) {
CheckReturnClass crc = new CheckReturnClass(); // 객체생성
crc.add(100, 100); // 메소드 호출
crc.add(100.0, 100.0);
}
}
-> void에서 리턴값 적어줘도 결과가 나옴
※ 파일이름 바꾸기
- 오른쪽마우스 > Refactor > Rename
※ 변경내역 보기
- 오른쪽마우스 > Compare With > Local History
* 중요한 코드는 백업하기
* 새로운 코드를 작성하면 저장하기
-> 형상관리 습관화
● 인스턴스 멤버와 정적 멤버 - 271p
* 인스턴스멤버
- 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드
- 인스턴드 필드(변수), 인스턴스 메소드로 구성
- 객체에 소속된 멤버이기 때문에 객체 없이는 사용 불가
- 객체를 생성하고 참조변수로 접근- (외부 클래스에서 사용할 경우)
- 객체 내부의 인스턴스 멤버는 this(객체 자기자신)로 접근
- this는 주로 생성자와 메소드의 매개변수이름이 필드와 동일한경우 인스턴스 멤버인 필드임을 명시하고자 할 때 사용
* 정적 멤버와 static
- 정적 : '고정된'
- 클래스에 고정된 멤버로 객체를 생성하지 않고 사용할 수 있는 필드와 메소드
- 정적 필드(변수), 정적 메소드로 구성
- 공통의 것들을 공유
- 모든 객체(대상) 중 하나
- 외부의 static만 불러올 수 있음
* 활용
메인은 하나만 있으면 되니까 static - 최초의 실행
* 인스턴스와 정적의 판단기준
- 객체마다 가지고 있어야 할 데이터라면 인스턴스, 객체 공용의 데이터라면 정적으로 선언
예시) 인스턴스 - 색상 / 정적 - π (계산할때 필요한 고정값)
3교시
● game클래스
※ 클래스 상단에 정보 적는 것이 기본
/*
* 클래스명 : Dice
* 개발자 : 구름
* 작성일자 : 2023-05-09
* 프로그램설명 : 주사위 클래스
* 멤버변수 :
* 멤버함수 :
* */
* Dice 클래스 만들기
- 주사위 4번 던져서 각각의 값이 어떤 값이 나오는지 구하는 게임
package game;
public class Dice {
// 1. 멤버변수(색상, 선택된 숫자) - private 처리 필수
private String color; // 주사위 색
private int selectedNumber; // 주사위에서 선택된(보이는) 숫자
// 2. 메소드
// roll() : 주사위가 굴러가서 나오는 난수발생장치 - return값 필요 없음
void roll() { // 0.0 ~ 1.0의 난수(소수)* 6 => 0.0 ~ 6.0 => 강제 정수화(int)
selectedNumber =
(int)(Math.random() * 6) + 1;
}
// choice() : 주사위가 생성한 난수값 확인 - 내부의 변수가 있으면 return값 필요 없음
int choice() {
return selectedNumber;
}
// 모든 객체는 로그기능을 가져야함.
// 로그기능에 해당하는 메소드가 toString() 메소드이다.
@Override
public String toString() {
String msg =
"주사위의 번호 : " + selectedNumber + "\n";
return msg;
}
// 멤버변수에 접근하게 하기위한 메소드 (get, set)
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getSelectedNumber() {
return selectedNumber;
}
private void setSelectedNumber(int selectedNumber) {
this.selectedNumber = selectedNumber;
}
}
* Math.random - 단순한 경우(주사위 등)에 활용
범위 0.0 < 난수 < 1.0
* toString
- log를 남기는 메소드 (모든 객체는 로그기능을 가져야함.)
- 모든 메소드 오버라이딩하기
- 모든 자바클래스의 조상클래스인 Object에 있는 기본메소드
- @Override란 어노테이션을 붙이고 시작
4교시
● DiceApp 만들기
실행클래스 - 개별 ver
package game;
public class DiceApp {
public static void main(String[] args) {
// 무대(실행)에 Dice 연기할 수 있는 dice 배우변수 출연
// = Dice 데이터형식의 dice 참조변수 선언
// 1. dice 배우 / 배우는 무대에 등장한다
Dice dice = new Dice(); // 자바가 만들어주는 기본생성자 사용
dice.roll(); // 주사위 굴리기
int selectedDiceNumber = dice.choice();
// view
System.out.println("선택된 1번 주사위 눈금은 : " + selectedDiceNumber);
//dice객체의 로그기능 이용
System.out.println(dice.toString());
// 2. dice2 배우
Dice dice2 = new Dice();
dice2.roll();
int selectedDiceNumber2 = dice2.choice();
System.out.println("선택된 2번 주사위 눈금은 : " + selectedDiceNumber2);
System.out.println(dice2.toString());
// 3. dice3 배우
Dice dice3 = new Dice();
dice3.roll();
int selectedDiceNumber3 = dice3.choice();
System.out.println("선택된 3번 주사위 눈금은 : " + selectedDiceNumber3);
System.out.println(dice3.toString());
// 4. dice4 배우
Dice dice4 = new Dice();
dice4.roll();
int selectedDiceNumber4 = dice4.choice();
System.out.println("선택된 4번 주사위 눈금은 : " + selectedDiceNumber4);
System.out.println(dice4.toString());
}
}
- static이 붙으면 static만 부를 수 있음(동일 레벨만 가능)
- main은 static이라 static이 아닌 메소드는 호출 불가
5교시
● DiceApp 배열로 개선하기
-> 같은 자료형사용 반복문 => 배열사용
1. 틀 작성 후 작동 확인
틀 작성
// 메인 - 메소드 호출
public static void main(String[] args) {
playDiceByArray();
}
// 메소드
public static void playDiceByArray() {
System.out.println("정상작동");
}
2. DiceApp 작성
실행클래스 - 배열 ver
public class DiceApp {
public static void main(String[] args) {
playDiceByArray(); // 메소드 호출
System.out.println("### Fin ###"); // 프로그램 종료
}
// 메소드
public static void playDiceByArray() {
System.out.println("정상작동");
// 전체 Dice배열이 차지하는 건물 1개(배열의 인덱스는 변수 하나임)
Dice[] dices = new Dice[4];
for (int i = 0; i < dices.length; i++) {
dices[i] = new Dice(); // 각 인덱스의 Dice배열요소가 차지하는 실제 방(4개가 만들어짐)
dices[i].selectColor();
dices[i].roll(); // 주사위 굴리기(행동 메서드)
// 선택된 값 가져오기
// 속성 메서드 - choice의 역할
System.out.printf(
"[%s] 선택된 값 : %s\n",
dices[i].getColor(),
dices[i].toString());
}
}
}
메인 - 메소드 호출
public static void main(String[] args) {
playDiceByArray(); // 메소드 호출
System.out.println("### Fin ###"); // 프로그램 종료
}
메소드 - 주사위 게임 시작
public static void playDiceByArray() {
Dice[] dices = new Dice[4];
// 다이스객체 추가 루프
for (int i = 0; i < dices.length; i++) { // for 시작
...
} // for 끝
// 객체의 증감 나타내기
System.out.println("------------------------------");
// 다이스객체 2개 제거(배열의 요소 감소)
System.out.println("dice 객체 2개 제거\n");
Dice.decrease(); // static
Dice.decrease();
System.out.println(
"현재 dice객체의 수 : " + Dice.getCount());
// 다이스객체 3개 증가
System.out.println("dice 객체 3개 증가\n");
Dice.increase();
Dice.increase();
Dice.increase();
System.out.println(
"현재 dice객체의 수 : " + Dice.getCount());
}
● 배열에 색 집어넣기
1. 직접 집어 넣기
dices[i].setColor( "빨강" );
- 데이터 클래스에 get, set 함수 작성
데이터 클래스
public class Dice {
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getSelectedNumber() {
return selectedNumber;
}
private void setSelectedNumber(int selectedNumber) {
this.selectedNumber = selectedNumber;
}
}
2. 색 바꾸기 (내부에 넣기)
-주사위 색 변경 메소드 만들기 - scanner 활용
- 외부에서 주사위 색상을 선택하는 경우를 시뮬레이션(= 모델링)하는 경우이므로
=> public 제한자
- Scanner 만들기
public class Dice {
public void selectColor() {
// 눈으로 보고 선택하는 경우를 키보드 입력으로 대체
Scanner sc = new Scanner(System.in);
System.out.println( // 안내문 출력
"색상 선택 ( 빨강, 파랑, 노랑, 녹색 ) : > ");
this.color = sc.nextLine();
}
}
- DiceApp 메소드 부분의 for 문의 실행문 부분에 dices[i].selectColor(); 작성
public static void playDiceByArray() {
Dice[] dices = new Dice[4];
// 다이스객체 추가 루프
for (int i = 0; i < dices.length; i++) {
dices[i] = new Dice();
dices[i].selectColor();
dices[i].roll(); // 주사위 굴리기(행동 메서드)
// 속성 메서드 - choice의 역할
System.out.printf(
"[%s] 선택된 값 : %s\n",
dices[i].getColor(),
dices[i].toString());
}
6교시
* 멤버변수는 외부에서 접근 금지
- private 활용
- 외부에서 접근하려면 인터페이스 만들어주기
● 주사위의 개수가 몇개인지 아는 법(내부적으로)
- 클래스의 정적멤버 또는 정적메소드 이용
- 정적멤버는 같은 참조데이터형 사이의 정보공유용으로 사용
- 정적메소드는 같은 공유멤버의 데이터 변경용으로 사용
· for 루프등의 카운터 변수 이용 x
· 외부적으로 아는 방법(배열의 개수) : dices.length
1) int count; 변수 선언
private static int count; // 전체 객체(=클래스 = 참조 데이터형)에서 공유 - 1개만 필요
2) 생성자 추가
// 생성자 추가
Dice() {
count++; // 생성자에서 만들어진 객체의 수를 계산
// 기존 count = count + 1
}
// 외부에서 접근하게 하기위한 메소드
static int getCount() {
return count;
}
3) toString() 내용 변경
@Override
public String toString() {
String msg =
"주사위의 번호 : " + selectedNumber + "\n" +
"생성된 다이스 객체의 수 : " + count; // 추가
return msg;
}
● 주사위 변동 개수 확인
- Dice 클래스에서 증감 메소드 만들기
public class Dice {
private static int count;
Dice() {
count++; // 생성자에서 만들어진 객체의 수를 계산
// 기존 count = count + 1
}
// 외부에서 접근하게 하기위한 메소드
static int getCount() {
return count;
}
// 현재 다이스 객체를 하나 줄이기
static void decrease() { // 리턴값은 get 에서 해주니까 리턴값 없어도 됨
count--;
}
// 현재 다이스 객체를 하나 늘리기
static void increase() {
count++;
}
}
- 실행클래스에서 메소드 호출하기
public class DiceApp {
System.out.println("------------------------------");
// 다이스객체 2개 제거(배열의 요소 감소)
System.out.println("dice 객체 2개 제거\n");
Dice.decrease(); // static
Dice.decrease();
System.out.println(
"현재 dice객체의 수 : " + Dice.getCount());
Dice.increase();
Dice.increase();
Dice.increase();
System.out.println(
"현재 dice객체의 수 : " + Dice.getCount());
}
}
* 객체자기자신 this로 접근 - 고유의 뜻
* 전체가 공유하는 것(static) 클래스 이름으로 접근
- 외부에서 접근할때 클래스명으로 접근
* 클래스는 1개 / 객체는 여러개(서로 다른)
- 클래스는 프로그램이 실행되며 자동으로 만들어짐
- 객체는 내가 필요할때마다 만든다
-> 클래스를 통해 공유
* 모든 데이터형에서 하나만 존재한다(한번만 만든다) - class
- 모든 데이터형에서 공유하는 멤버
- 선언시 static 붙이기
* static(공통, 우리)의 경우 this(각각이 다를 때 사용함)는 사용 불가
* 정적
-클래스멤버변수
-클래스메소드
* static 클래스 멤버
현재 클래스 데이터형 을 대표
* 클래스 정적 멤버변수를 바꾸는 기능 = 클래스의 정적메소드
7교시
w3school - 자료제공터(학습사이트)
https://www.w3schools.com/
● 데이터베이스 맛보기
* SQL은 데이터베이스에서 데이터를 저장, 조작 및 검색하기 위한 표준 언어
* SELECT * FROM Customers;
- 가져와라 모든 것을 Customers로부터
* 명령은 대문자로 작성
* 변수는 대소문자 구분하지 않음
* 문자열은 ' ' 안에 작성
* SELECT 5 + 5; 계산기기능
* 테이블에서 가로 = 로우 = 튜풀
◎ 완성 본
* 데이터클래스 - 주사위를 던지는 역할 (기능)
package game;
import java.util.Scanner;
// 데이터클래스 - 주사위를 던지는 역할
public class Dice {
// 1. 멤버변수(색상, 선택된 숫자) - private 처리 필수
private String color; // 주사위 색
private int selectedNumber; // 주사위에서 선택된(보이는) 숫자
private static int count; // 전체 객체(=클래스 = 참조 데이터형)에서 공유 - 1개만 필요
Dice() {
count++; // 생성자에서 만들어진 객체의 수를 계산
// 기존 count = count + 1
}
// 외부에서 접근하게 하기위한 메소드
static int getCount() {
return count;
}
// 현재 다이스 객체를 하나 줄이기
static void decrease() { // 리턴값은 get 에서 해주니까 리턴값 없어도 됨
count--;
}
// 현재 다이스 객체를 하나 늘리기
static void increase() {
count++;
}
// 2. 메소드
/* roll() : 주사위가 굴러가서 나오는 난수발생장치 - return값 필요 없음
* choice() : 주사위가 생성한 난수값 확인 - 내부의 변수가 있으면 return값 필요 없음
*/
void roll() { // 0.0 ~ 1.0의 난수(소수)* 6 => 0.0 ~ 6.0 => 강제 정수화(int)
selectedNumber =
(int)(Math.random() * 6) + 1;
}
// 내부멤버변수 seclectedNumber에 저장하면 됨 - return 없어도 됨
int choice() {
return selectedNumber;
}
// 모든 객체는 로그기능을 가져야함.
// 로그기능에 해당하는 메소드가 toString() 메소드이다.
// 모든 자바클래스의 조상클래스인 Object에 있는 기본메소드
// 이 메소드를 개선할 것 (개선 : 기본기능을 확장하여 고치겠다)
// @Override란 어노테이션을 붙이고 시작
@Override
public String toString() {
String msg =
"주사위의 번호 : " + selectedNumber + "\n" +
"생성된 다이스 객체의 수 : " + count;
return msg;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getSelectedNumber() {
return selectedNumber;
}
private void setSelectedNumber(int selectedNumber) {
this.selectedNumber = selectedNumber;
}
// 주사위 색 변경 메소드 만들기 - scanner 활용
// 외부에서 주사위 색상을 선택하는 경우를 시뮬레이션(= 모델링)하는 경우이므로
// => public 제한자
public void selectColor() {
// 눈으로 보고 선택하는 경우를 키보드 입력으로 대체
Scanner sc = new Scanner(System.in); // 눈 대신
// 안내문 출력
System.out.println(
"색상 선택 ( 빨강, 파랑, 노랑, 녹색 ) : > ");
this.color = sc.nextLine();
}
}
* 실행 클래스 - 게임이 열리는 룸
1. public static void main(String[] args) - 메소드 호출
2. public static void playDiceByArray() - 주사위 게임 시작(배열식)
3. public static void playDiceIndividual() - 주사위 게임 시작(개별변수 방식)
-> 2,3 번 중에 하나만 작성하면 됨 (별도의 DiceGame이라는 클래스를 만들어서 작성 가능)
package game;
public class DiceApp {
// 게임이 열리는 룸
public static void main(String[] args) {
// playDiceIndividual(); - 개선 전
playDiceByArray(); // 메소드 호출
// 지금까지 출연한 dice는 총 몇개의 주사위인가?
// 프로그램 종료
System.out.println("### Fin ###");
}
// 메소드 - 주사위 게임 시작
public static void playDiceByArray() {
System.out.println("정상작동");
// 같은 자료형사용 반복문 => 배열사용
// 전체 Dice배열이 차지하는 건물 1개(배열의 인덱스는 변수 하나임)
Dice[] dices = new Dice[4];
// 다이스객체 추가 루프
for (int i = 0; i < dices.length; i++) { // for 시작
dices[i] = new Dice(); // 각 인덱스의 Dice배열요소가 차지하는 실제 방(4개가 만들어짐)
dices[i].selectColor();
dices[i].roll(); // 주사위 굴리기(행동 메서드)
// 선택된 값 가져오기
// 속성 메서드 - choice의 역할
System.out.printf(
"[%s] 선택된 값 : %s\n",
dices[i].getColor(),
dices[i].toString());
} // for 끝
System.out.println("------------------------------");
// 다이스객체 2개 제거(배열의 요소 감소)
System.out.println("dice 객체 2개 제거\n");
Dice.decrease(); // static
Dice.decrease();
System.out.println(
"현재 dice객체의 수 : " + Dice.getCount());
System.out.println("dice 객체 3개 추가\n");
Dice.increase();
Dice.increase();
Dice.increase();
System.out.println(
"현재 dice객체의 수 : " + Dice.getCount());
}
public static void playDiceIndividual() {
// 주사위 게임 시작 - 개별변수 방식
// 무대(실행)에 Dice 연기할 수 있는 dice 배우변수 출연
// = Dice 데이터형식의 dice 참조변수 선언
// 1. dice 배우
Dice dice = new Dice(); // 자바가 만들어주는 기본생성자 사용
dice.roll(); // 주사위 굴리기
int selectedDiceNumber = dice.choice();
// view
System.out.println("선택된 1번 주사위 눈금은 : " + selectedDiceNumber);
//dice객체의 로그기능 이용
System.out.println(dice.toString());
// 2. dice2 배우 / 배우는 무대에 등장한다
Dice dice2 = new Dice();
dice2.roll();
int selectedDiceNumber2 = dice2.choice();
System.out.println("선택된 2번 주사위 눈금은 : " + selectedDiceNumber2);
System.out.println(dice2.toString());
// 3. dice3 배우
Dice dice3 = new Dice();
dice3.roll();
int selectedDiceNumber3 = dice3.choice();
System.out.println("선택된 3번 주사위 눈금은 : " + selectedDiceNumber3);
System.out.println(dice3.toString());
// 4. dice4 배우
Dice dice4 = new Dice();
dice4.roll();
int selectedDiceNumber4 = dice4.choice();
System.out.println("선택된 4번 주사위 눈금은 : " + selectedDiceNumber4);
System.out.println(dice4.toString());
}
}
- 파란 부분 : App의 View 부분
- 노란 부분 : toString 활용하여 출력된 부분