package com.step21;
class A{
//첫번째 학생 점수를 담을 변수 선언
//전변은 유지 된다.- A a = new A(); a = null;(다시 초기화-디폴트값-모른다, 결정되지않음) a = new A();
//미묘한 문제가 발생됨 - 재생성을 했다 - 복사본이 한 개 더 만들어졌다. 이전에 참조하던 클래스는 날아갔다.
int n1 = 70;
int n2 = 80;
int n3 = 90;
int tot = 0;
void hap1() {//처리하기 부른다. - 리턴타입 void-> int, 또는 전변을 굳이 지변(파라미터자리)으로 처리하기
//tot는 지변이라서 다른 외부의 클래스 에서는 사용이 불가하다. - 문제제기 - 재사용성이 떨어짐 코드임
int tot = n1 + n2 + n3;//이것을 JVM에게 시킨다.
//원시형 타입은 한 번에 한가지의 값만 담김 - 만일 여러번 하면 덮어쓰기가 되는 것임
this.tot = tot;//0-> 240
}
}
public class Amain {
public static void main(String[] args) {
A a = new A();
System.out.println(a.n1);
//insert here - 위치 - 기초가 아니다
//아래 메소드 호출이 되어야 13번 라인이 실행 기회를 가짐
//메소드를 선언할 때는 좌중괄호와 우중괄호로 끝남
a.hap1();//메소드가 호출될때는 세미콜론으로 끝난다.
System.out.println(a.tot);//tot는 지변이라서 외부의 다른 클래스에서 재사용이 불가함
}
}
/*
생각하기 - 말하기(녹음, 끄적임) - 낱말카드 작성 - class A{}
main메소드가 필요한 클래스인가? -> 전변선언- 타입과 갯수 결정할 수 있나? - 판단, 기준
세 학생의 점수를 입력 받아서...... -> 변수 3개가 필요하다 -> 타입은 뭘로 할까? -> 전변으로 할까?|지변으로 해도 되나
전변 - 초기화 생략가능함, 하나의 클래스를 대표하는 값이다.(인스턴스변수.변수명)
*/
---------------------
70
240
package com.step21;
class C{
int n1 = 70;
int n2 = 80;
int n3 = 90;
}
class C1{
int hap1() {
C c = new C();
int hap = c.n1 + c.n2 + c.n3;
return hap;
}
int hap1(C c ) {
int hap = c.n1 + c.n2 + c.n3;
return hap;
}
}
public class Cmain {
public static void main(String[] args) {
C c = new C();
C1 a = new C1();
int hap = a.hap1();
System.out.println(hap);
c.n1 = 50;
c.n2 = 60;
c.n3 = 50;
hap = a.hap1(c);
System.out.println(hap);
}
}
----------------------------------------
240
160
package com.step21;
import java.util.Scanner;
class E {
Scanner sc = new Scanner(System.in);
public int getFirst() {
int num = 0;
num = sc.nextInt();
return num;
}
public int getSecond() {
int num = 0;
num = sc.nextInt();
return num;
}
public int add(int first, int second) {
return first+second;
}
public int minus(int first, int second) {
return first-second;
}
public int multi(int first, int second) {
return first*second;
}
public double divid(int first, int second) {
return first/(double)second;
}
}
public class Emain {
public static void main(String[] args) {
E e = new E();
System.out.println("첫번째 숫자를 입력하세요.");
int first = e.getFirst();
System.out.println("첫번째 입력 받은 숫자는 " + first + " 입니다.");
System.out.println("두번째 숫자를 입력하세요.");
int second = e.getSecond();//메소드 호출이다.
System.out.println("두번째 입력 받은 숫자는 " + second + " 입니다.");
}
}
package com.step3;
import java.util.*;
public class BallGame {
int[] random = new int[3];
// 랜덤 3자리 구하는 메소드
public void getRandom() {
int[] random = new int[3];//1부터 9까지의 임의의 숫자를 채번해서 초기화하기
Random r = new Random();
for(int i=0; i<3; i++) {
random[i] = r.nextInt(9)+1;//중복검사 안됨
for(int j = 0; j<i; j++) {
if(random[i] == random[j]) {
i--;
}else {
this.random = random;
}
}
}
System.out.println(random[0]+"+"+random[1]+"+" + random[2]);
}
// 유저한테 3자리 입력받는 메소드
public int[] getNum() {
int[] user = new int[3];
Scanner sc = new Scanner(System.in);
System.out.println("숫자 3개를 입력하세요 : ");
for(int i = 0; i < 3; i++) {
user[i] = sc.nextInt();
}
return user;
}
// account
public void account(int[]user, int strikeCnt, int ballCnt) {
System.out.println(" Strike : " + strikeCnt);
System.out.println(" Ball : " + ballCnt);
if(strikeCnt == 3) {
System.out.println("정답입니다!.");
} else if(strikeCnt !=3) {
int[] user1 = getNum();
playGame(user1);
}
}
//랜덤숫자와 유저숫자 비교 메소드
public void playGame(int[] user) {
int strikeCnt=0;
int ballCnt=0;
for(int i = 0; i < 3; i++) {
if(random[i] == user[i]) {
strikeCnt++;
}
for(int j =0; j < 3; j++)
if (random[i] != user[i] && random[i] == user[j]) {
ballCnt++;
}
}
account(user, strikeCnt, ballCnt);
}
public static void main(String[] args) {
BallGame bg = new BallGame();
bg.getRandom();
int[] user = bg.getNum();
bg.playGame(user);
}
}
package com.step3;
import java.util.Random;
import java.util.Scanner;
/*
아직 3자리의 숫자를 한번에 확인하고 수정하는걸 모르겠음.. 각자 자릿수의 숫자를 확인하는방법?
*/
public class BaseBallGame {
int dap1, dap2, dap3 = -1; // 랜덤 숫자 변수- 1차배열
int num1 , num2, num3 = 0; //유저가 적는 숫자 1차배열
int gameCount = 0; //게임 카운터
int strike = 0; //스트라이크 갯수
int ball = 0; //볼 갯수
Scanner sc = new Scanner(System.in);
void newNumber() {//랜덤 숫자 정하기
Random r = new Random();
while(true) {
dap1 = r.nextInt(10);// 일의자리 숫자 채번
dap2 = r.nextInt(10);// 십의자리 숫자 채번
dap3 = r.nextInt(10);// 백의자리 숫자 채번
if(!(dap1==dap2 || dap1==dap3 || dap3==dap1)) {
break;
}
}
System.out.println("새로운 숫자는 "+ dap3 + dap2 + dap1 +" 입니다.");//실제 게임일땐 보이면 안됨
}
void inserNumber() { //사용자가 숫자 입력
System.out.println("일의 자리 숫자를 입력해주세요");
num1 = sc.nextInt();
System.out.println("십의 자리 숫자를 입력해주세요");
num2 = sc.nextInt();
System.out.println("백의 자리 숫자를 입력해주세요");
num3 = sc.nextInt();
}
void chackNum() {//숫자 체크하기
if(dap1 == num1) strike = strike + 1;// strike 체크
if(dap2 == num2) strike = strike + 1;
if(dap3 == num3) strike = strike + 1;
if(num1 == dap2 || num1 == dap3) ball = ball + 1;// ball 체크
if(num2 == dap1 || num2 == dap3) ball = ball + 1;
if(num3 == dap1 || num3 == dap2) ball = ball + 1;
}
public static void main(String[] args) {
BaseBallGame bbg = new BaseBallGame();
System.out.println("게임을 시작할까요? (Y/N)");
if("Y".equals(bbg.sc.next())) {
System.out.println("게임을 시작합니다. 기회는 총 10번입니다.");
bbg.newNumber();
while(true) {//무한 루프
bbg.ball = 0;
bbg.strike = 0;
bbg.gameCount++; // 게임 카운트 증가
System.out.println("=========================="+bbg.gameCount+"번째 기회입니다.==========================");
bbg.inserNumber();
bbg.chackNum();
if(bbg.strike == 3) {
System.out.println(+ bbg.gameCount + "번째 기회에 세개의 숫자가 모두 맞았습니다");
break;
}else{
System.out.println(bbg.strike + "스트라이크 " + bbg.ball + "볼 입니다.");
if(bbg.gameCount == 10) {//기회는 10번으로 주어짐
System.out.println("모든 기회를 소모하였습니다.");
break;
}
}
}
}else {
System.out.println("게임을 종료합니다.");
}
}
}
package com.week2;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
//클래스 선언하기
//ActionListener는 인터페이스 이라서 추상메소드를 가지고 있다.
//추상메소드란 선언만 되어있고 좌중괄호와 우중괄호가 없는 메소드 말함
public class AddressBook implements ActionListener{
//선언부
JFrame jf = new JFrame();
AddressDialog aDialog = new AddressDialog();//생성부가 생성자를 호출한다.
JPanel jp_north = new JPanel();//버튼 4개 배치하는데 사용함-단독으로 모양이 없다
JButton btnSelect = new JButton("조회");
JButton btnInsert = new JButton("입력");
JButton btnUpdate = new JButton("수정");
JButton btnDelete = new JButton("삭제");
//생성자
public AddressBook() {}
//화면처리 구현
public void initDisplay() {
//이벤트 처리 3단계 - 버튼의 이벤트를 지원하는 인터페이스를 implements한다. - ActionListener
//해당 인터페이스가 선언하고 있는 메소드를 오버라이딩 해야한다. - actionPerformed(ActionEvent e)
//이벤트소스와 이벤트 처리를 담당하는 클래스를 매칭해줌
btnSelect.addActionListener(this);
btnInsert.addActionListener(this);
btnUpdate.addActionListener(this);
btnDelete.addActionListener(this);
jp_north.add(btnSelect);
jp_north.add(btnInsert);
jp_north.add(btnUpdate);
jp_north.add(btnDelete);
jf.add("North", jp_north);
jf.setTitle("주소록 Ver1.0");
jf.setSize(800,500);
jf.setVisible(true);
aDialog.initDisplay();
aDialog.jdg_address.setVisible(false);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//메인메소드
public static void main(String[] args) {
AddressBook abook = new AddressBook();//기본
abook.initDisplay();
}
//아래 메소드는 ActionListener인터페이스에 이름이 정해져 있다.
//구현체 클래스인 너가 재정의하여 구현해라
//현재 코드에서 actionPerformed메소드를 호출하는 코드는 어디에도 없다.
//그런데 54번 라인은 어떻게 실행되는 걸까요?
//actionPerformed메소드는 마치 main메소드 처럼 버튼이 눌려지고 눌려졌다는 사실을 JVM이 감지하면
//그때 자동으로 호출되는 메소드 입니다. - 콜백메소드(callback)
@Override
public void actionPerformed(ActionEvent e) {
//눌려진 버튼의 문자열을 읽어온다. - 언제 버튼이 눌렸을 때 - 버튼을 누르는건 사용자 이지만
//눌렸다는 느끼는건 JVM만이 알수 있다.- 파라미터 자리에 e가지고 getActionCommand()호출하면 String타입의 라벨 출력함
String command = e.getActionCommand();
System.out.println(command);//조회,수정,입력,삭제
//너 조회를 원해?
if("조회".equals(command)) {
System.out.println("조회버튼을 클릭하였습니다.");
aDialog.set(command, true);
}
//너 입력하려고?
else if("입력".equals(command)) {
aDialog.set(command, true);
}
//너 수정할거니?
else if("수정".equals(command)) {
aDialog.set(command, true);
}
//너 삭제할래?
}
}
package com.week2;
import javax.swing.JDialog;
public class AddressDialog {
//선언부 - 전역변수 자리임
JDialog jdg_address = new JDialog();
public AddressDialog() {
//initDisplay();
}
//메소드 설계를 통해서 반복되는 코드와 제어권은 AddressBook에 가지면서도
//그 변화된 부분은 AddressDialog에서 처리하는 방법을 알아보자.
//버튼이 눌리는 건 AddressBook 클래스에서 알고 있다. - actionPerformed가 있음
//그런데 그 버튼이 눌렸을 AddressDialog클래스의 title값을 변경해야 한다.
//AddressBook에서 눌린 버튼의 라벨값을 set메소드의 파라미터를 통해서
//받아오고 setTitle메소드를 호출하여 이 문제를 해결할 수 있다.
//조회버튼을 감지하는 if문 안에서 set메소드를 호출하시오.
public void set(String title, boolean isView) {
jdg_address.setTitle(title);
jdg_address.setVisible(isView);
}
//화면처리부
public void initDisplay() {
jdg_address.setSize(400, 500);
//jdg_address.setVisible(true);
}
//인스턴스화를 한다.
//인스턴스화 위치를 선택한다.- 전역으로 한다. 아니다 지역으로 할수도 있다.
//메인메소드
/*
public static void main(String[] args) {
AddressDialog ad = new AddressDialog();
ad.initDisplay();
}
*/
}
Set<String> set = new HashSet<>();
여기에서 new HashSet<>()는 HashSet 클래스의 생성자를 호출하여 새로운 HashSet 객체를 생성한다.
그런 다음 이 객체는 Set<String>
유형의 참조 변수 set에 할당한다.
결과적으로 실제로 HashSet의 객체가 생성되며, 이 객체를 Set 인터페이스를 통해 사용할 수 있다.
package 배열과_컬렉션프레임워크.제네릭과_컬렉션프레임워크;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Objects;
import java.util.Set;
public class SetExam2 {
public static void main(String[] args) {
// Hash 라는 알고리즘이 나오면 Object가 가지고 있는 equals와 hashCode 메소드를 오버라이딩 해야한다.
Set<MyData> mySet = new HashSet<>();
mySet.add(new MyData("kim", 500));
mySet.add(new MyData("lee", 200));
mySet.add(new MyData("hong", 700));
// equals 와 hashcode 가 있어서 중복된 값이 안나옴
mySet.add(new MyData("hong", 700));
// Iterator를 사용하는 패턴
Iterator<MyData> iterator = mySet.iterator();
while (iterator.hasNext()){
MyData myData = iterator.next();
System.out.println(myData);
}
}
}
class MyData {
private String name;
private int value;
public MyData(String name, int value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public int getValue() {
return value;
}
@Override
public boolean equals(Object o) {
System.out.println("equals!!!");
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyData myData = (MyData) o;
return value == myData.value && Objects.equals(name, myData.name);
}
@Override
public int hashCode() {
System.out.println("hashcode!!!");
return Objects.hash(name, value);
}
// toString 메소드를 오버라이딩해야 정상적인 값을 출력할 수 있음
@Override
public String toString() {
return "MyData{" +
"name='" + name + '\'' +
", value=" + value +
'}';
}
}
package 배열과_컬렉션프레임워크.제네릭과_컬렉션프레임워크;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapExam2 {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("k1", "hello");
map.put("k2", "hi");
map.put("k3", "안녕");
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
String value = map.get(key);
System.out.println(key+" : "+value);
}
}
}
package 배열과_컬렉션프레임워크.제네릭과_컬렉션프레임워크;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SortExam {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("kim");
list.add("lee");
list.add("hong");
// 자료구조에서 유용한 메소드를을 모아둔 클래스
Collections.sort(list);
for(int i=0; i< list.size(); i++) {
System.out.println(list.get(i));
}
}
}