용어정리
자바 플랫폼 : 자바 프로그램의 개발 환겨오가 실행 환경을 함께 지칭하는 것
자바 실행 환경 : 자바 응용프로그램이 실행되는데 필요한 제반 환경, 응용프로그램이 실행 중에 사용하는 자바 API 클래스와 자바 가상 기계 등으로 이루어짐
본문정리
패키지
디렉터리를 자바에서는 패키지라고 부르며, 파일 경로명은 다음과 같이 점(.)을 찍어 표현한다.
패키지란 서로 관련 있는 클래스나 인터페이스의 컴파일된 클래스 파일들을 한 곳에 묶어 놓은 것이다.
모듈은 패키지들을 묶어 놓은 단위로, 개발자들에게 많은 클래스들을 패키지 형태로 제공하는 것이다. 가장 기본이 되면서 응용프로그램에 많이 사용되는 클래스들을 담고 있는 것이 java.base모듈이다. 해당 모듈에 여러 패키지가 속해 있는데 그 예로 io, lang, util 등이다.
클래스를 지칭할 때는 모듈명은 사용하지 않고, 패키지명을 포함하는 경로명으로 나타낸다. Scanner 클래스를 사용하기 위해선 패키지와 클래스 이름 사이에 점을 찍어 표현한다.(java.util.Scanner)
import와 클래스 경로
응용프로그램에서 다른 패키지에 있는 클래스를 사용하고자 한다면 패키지명을 포함하는 경로명을 사용한다.
java.util.Scanner sc = new java.util.Scanner(System.in);
번거롭고 타이핑 실수를 방지하기 위해 import문을 사용한다. 사용방법은 두가지가 있다.
첫 번째는
import 패키지.클래스;
import java.uti;.Scanner;
이다.
두 번쨰는 한 패키지에 있는 여러 클래스를 import 하고자 하는 경우다.
import 패키지.*;
import java.util.*;
패키지 만들기
자바 소스 파일이 컴파일되어 생기는 클래스 파일은 반드시 패키지에 소속되어야한다.
먼저 클래스가 소속될 패키지명은 다음과 같이 package 키워드를 이용하여 소스 코드 첫줄에 선언한다.
pakage UI;
public calss ToolS{
}
경로명은 UI.Tools
즉 다른 패키지에 있는 클래스에서 Tools를 이용하려면 다음과 같이 선언해야함
import UI.Tools;
package를 선언하지 않을 경우 자바 컴파일러는 클래스나 인터페이스를 디폴트 패키지에 소속시킨다. 디폴트 패키지는 현재 디렉터리이다.
패키지의 특징은 패키지 계층 구조, 패키지별 접근 제한, 동일한 이름의 클래스를 다른 패키지에 작성 가능, 소프트웨어의 높은 재사용성이다.
모듈 개념
패키지는 서로 관련 있는 클래스나 인터페이스의 컴파일된 클래스 파일들을 한 곳에 담는 컨테이너이고, 모듈은 패키지들을 담는 컨테이너로 모듈 파일로 저장한다.
모듈을 사용하는 이유는 불필요한 모듈이 로드 되지 않게하여 소형 IoT 장치에서도 자바 응요프로그램이 실행되고 성능을 유지하게 한다.
자바 JDK에서 제공하는 패키지
JDK는 자바 개발도구이며 개발자들이 사용할 수 있는 많은 클래스들이 패키지에 담기고 다시 모듈에 담겨 제공된다. 자바에서 제공하는 이 기본 클래스들을 자바 API라고 한다.
JDK의 표준 패키지는 모듈로 나뉘어져 JDK를 설치한 디렉터리 밑의 jmods 디렉터리에 담겨 있다.
JDK 패키지 중 비교적 많이 사용되는 패키지는 이하와 같다.
java.lang : System을 비롯하여 문자열, 수학 함수, 입출력 등과 같이 자바 프로그래밍에 필요한 기본적인 클래스와 인터페이스를 제공한다. import 문을 사용하지 않아도 자동으로 임포트된다.
java.util : 날짜, 시간, 벡터, 해시맵 등 다양한 유틸리티 클래스와 인터페이스를 제공한다.
java.io : 키보드, 모니터, 프린터, 파일 등에 입출력 하는 클래스와 인터페이스를 제공한다.
java.awt 와 java.swing : 자바 AWT와 swing 패키지로서 GUI 프로그래밍에 필요한 클래스와 인터페이스를 제공한다.
Object 클래스
Object는 java.lang 패키지에 속한 클래스이며, 모든 클래스에 강제로 상속된다. 즉 계층 구조 상 최상위 클래스이다. 즉 다음과 같이 객체 생성이 가능하다.
Object obj = new Object();
주요 메소드도 있다.(스레드를 깨운다는데 뭔 소린지...)
boolean equals(Object obj) : obj가 가리키는 객체와 현재 객체를 비교하여 같으면 true 리턴
Class getClass() : 현 객체의 런타임 클래스를 리턴
int hashCode() : 현 객체에 대한 해시 코드 값 리턴
String toString() : 현 객체에 대한 문자열 표현을 리턴
void notify(), notifyAll() : 현객체에 대해 대기하고 있는 하나/모든 스레드를 깨운다.
void wait() : 다른 스레드가 깨울 때까지 현재 스레드를 대기하게 한다.
여기서 설명하고 싶은건 위의 메소드를 오버라이딩 할 수 있다는 것이다.
객체 비교를 할 때 == 는 레퍼런스가 동일한 객체를 가리키는지 비교한다. equals(Object obj)는 인자로 건네진 객체와 자기 자신을 비교하여 두 객체의 내용이 같은지를 비교하는 메소드이다.
Wrapper 클래스
해당 클래스는 존재하지 않지만 int, char, double 등 8개의 기본 타입 객체로 다루기 위해 JDK에 만들어진 이하 표의 8개 클래스를 통칭하여 Wrappr 클래스라 한다.
기본 타입 | byte | short | int | long | char | float | double | boolean |
Wrapper 클래스 | Byte | Short | Int | Long | Char | Float | Double | Boolean |
해당 클래스는 기본 타입의 값을 객체로 만들어 사용할 때 사용한다.(3, 'a' 등을 기본 타입이라 하는데 무슨 의미인지 흠...) 해당 클래스는 java.lang 패키지에서 제공된다.
Wrapper 객체는 기본타입의 값을 인자로 하여 다음 예와 같이 정적 메소드인 valueOf()를 호출하여 생성한다.
Integer i = Integer.valueOf(10);
Character c = Character.valueOf('c');
Character를 제외한 나머지 Wrapper 클래스의 경우, 다음과 같이 문자열로 Wrapper 객체를 생성할 수도 있다.
Integer i = Integer.valueOf("10");
해당 메소드는 주로 기본타입 값을 문자열로 변환하거나, 문자열을 기본 타입으로 변환하는 것들이 주를 이루고 있다. 많은 메소드가 static 타입이다.
static int bitCount(int i) : 정수 i의 이진수 표현에서 1의 개수 리턴
float floatValue() : float 타입으로 값 리턴
int intValue() : int 타입으로 값 리턴
long lonValue() : long 타입으로 값 리턴
short shortValue() : short 타입으로 값 리턴
static int parseInt(String s) : 문자열 s를 10진 정수로 변환한 값 리턴
static int parseInt(Stirng s, in radix) : 문자열 s를 지정된 진법의 정수로 변환 값 리턴
static Stirng toBinaryStirng(int i) : 정수 i를 이진수 표현으로 변환한 문자열 리턴
static String toHexstring(int i) : 정수 i를 16진수 표현으로 변환한 문자열 리턴
static String toOctalString(int i) : 정수 i를 8진수 표현으로 변환한 문자열 리턴
static String toString(int i) : 정수 i를 문자열로 변환하여 리턴
static Integer valueOf(int i) : 정수 i를 담은 Integer 객체 리턴
static Integer valueOf(String S) : 문자열 s를 정수로 변환하여 담고 있는 Integer 객체 리턴
기본 타입의 값을 Wrapper 객체로 변환하는 것을 박싱이라 하고, 반대의 경우를 언박싱이라고 한다.
JDK1.5부터 자동으로 이루어지며 이를 자동 박싱, 자동 언박싱이라 한다.
Integer ten = 10; #자동 박싱
int n = ten; #자동 언박싱
String 클래스
java.lang 패키지에 포함된 클래스로서 String 클래스는 문자열을 나타낸다.
String str1 = "abcd";
char data[] = {'a', 'b'};
String str2 = new String(data);
String str3 = new String("abcd");
중요한건 스트링 리터럴과 new String()으로 생성된 스트링 객체는 다르게 관리된다. 스트링 리터럴은 자바 내부에서 리터럴 테이블로 특별히 관리하여, 동일한 리터럴을 공유 시킨다. 하지만, new String()으로 생성된 스트링은 new를 이용하여 생성되는 다른 객체와 동일하게 힙 메모리에 생성된다.
리터럴이든 new String()으로 생성했던, 일단 생성된 스트링 객체는 수정이 불가능하다.
주요 메소드는 다음과 같다.
char charAt(int index) : index 인덱스에 있는 문자 값 리턴
int codePointAt(int index) : index 인덱스에 있는 유니코드 값 리턴
int compareTo(String anotherString) : 두 스트링을 사전 순으로 비교하여 두 스트링이 같으면 0,
현 스트링이 anotherString보다 먼저나오면 음수, 아니면 양수 리턴
String concat(String str) : 현재 스트링 뒤에 str 스트링을 덧붙인 새로운 스트링 리턴
boolean contains(CharSequence s) : s에 지정된 문자들을 포함하고 있으면 true 리턴
int length() : 스트링의 개수(문자 개수) 리턴
String replace(Charsequence target, Charsequence repalcement) : target이 지정하는 일련의 문자들을
replacement가 지정하는 문자들로 변경한 스트링 리턴
String[] split(String regex) : 정규식 regex에 일치하는 부분을 중심으로 스트링을 분리하고, 분리된
스트링들을 배열로 저장하여 리턴
String subString(int beginIndex) : beginIndex 인덱스로부터 시작하는 서브 스티링 리턴
String toLowerCase() : 소문자로 변경한 스트링 리턴
String toUpperCase() : 대문자로 변경한 스트링 리턴
String trim() : 스티링 앞뒤의 공백 문자들을 제거한 스티링 리턴
StringBuffer 클래스
해당 클래스도 java.lang 패키지에 포함되어 있으며, String 클래스와 같이 문자열을 다룬다. String 객체의 경우 내부의 문자열을 수정할 수 없지만, StringBuffer 객체는 문자열을 저장하는 가변 버퍼를 가지고 있기 때문에 저장된 문자열의 수정이 가능하다.
생성자는 다음과 같다.
StringBuffer() : 초기 버퍼의 크기가 16인 스트링 버퍼 객체 생성
StringBuffer(charSequence seq) : seq가 지정하는 일련의 문자들을 포함하는 스트링 버퍼 생성
StringBuffer(int capacity) : 지정된 초기 크기를 갖는 스트링 버퍼 객체 생성
StringBuffer(String str) : 지정된 스트링으로 초기화된 스트링 버퍼 객체 생성
메소드는 다음과 같다.
StringBuffer append(String str) : str 스트링을 스트링 버퍼에 덧붙인다.
StringBuffer append(StringBuffer sb) : sb 스트링 버퍼를 현재의 스트링 버퍼에 덧붙인다.
이 결과 현재 스트링 버퍼의 내용이 변한다.
int capacity() : 스티링 버퍼의 현재 크기 리턴
StringBuffer delete(int start, int end) : start 위치에서 end 위치 앞까지 부분 문자열 삭제
StringBuffer insert(int offset, String str) : str 스트링을 스트링 버퍼의 offset 위치에 삽입
StringBuffer replace(int start, int end, String start) : 스트링 버퍼 내의 start 위치의 문자부터
end가 지정하는 문자 앞의 서브 스트링을 str로 대치
StingBuffer reverse() : 스트링 버퍼 내의 문자들을 반대 순서로 변경
void setLength(int newLength) : 스티ㅣㅇ 버퍼 내 문자열 길이를 newLength로 재설정, 현재 길이보다
큰 경우 널 문자('')로 채우며 작은 경우는 기준 문자열이 잘린다.
StringTokenizer 클래스
해당 클래스는 java.util 패키지에 포함되어 있으며, 하나의 문자열을 여러 개의 문자열로 분리하기 위해 사용된다. 문자열을 분리할 때 사용되는 기준 문자를 구분 문자라고 하고, 구분 문자로 분리된 문자열을 토큰이라 한다.
StringTokenizer(String str) : str 스트링의 각 문자를 구분 문자로 문자열을 분리하는 스트링
토크나이저 생성
StringTokenizer(String str, String delim) : str 스티링과 delim 구분 문자로 문자열을 분리하는
스트링 토크나이저 생성
StringTokenizer(String str, String delim, boolean returnDelims) : str 스티링과 delim 구분 문자로 문자열을 분리하는
스트링 토크나이저 생성, returnDelims가 true이면 delim이 포함된 문자도 토큰에 포함
int countTokens() : 스트링 토크나이저가 분리한 토큰의 개수 리턴
boolean hasMoreTokens() : 스트링 토크나이저에 다음 토큰이 있으면 true 리턴
String nexToekn() : 스트링 토크나이저에 들어 있는 다음 토큰 리턴
Math 클래스
해당 클래스는 java.lang 패키지에 포함되어 있으며, 기본적인 산술 연산을 제공한다. 모든 멤버 메소드는 static 타입이다.
static double abs(double a) : 실수 a의 절댓값 리턴
static double cod(double a) : 실수 a의 cosine 값 리턴
static double sin(double a) : 실수 a의 sine 값 리턴
static double tan(double a) : 실수 a의 tanent 값 리턴
static double exp(double a) : e^a값 리턴
static double ceil(double a) : 올림, 실수 a보다 크거나 같은 수 중에서 가장 작은 정수를 실수 타입
으로 리턴
static double floor(double a) : 내림, 실수 a보다 작거나 같은 수 중에서 가장 큰 정수를 실수 타입
으로 리턴
static double max(double a, double b) : a, b 중 큰 수 리턴
static double min(double a, double b) : a, b 중 작은 수 리턴
static double random() : 0.0보다 크거나 같고 1.0보다 작은 임의의 실수 리턴
static long round(double a) : 반올림, 실수 a를 소수 첫째 자리에서 반올림한 정수를 long타입으로
반환
static double sqrt(double a) : 실수 a의 제곱근 리턴
Calendar 클래스
해당 클래스는 java.util 패키지에 있고, 년·월·일·요일·시간·분·초·밀리초까지 프로그램이 실행되는 동안 개발자가 기억하고자 하는 시간과 날짜 정보를 저장하고, 날짜나 시간을 알아내거나 설정한다.
해당 클래스는 추상 클래스로 getInstancce()메소드를 통해 Calendar 객체를 생성한다.
Calender now = Calender.getInstance();
YEAR | 년도 | DAY_OF_MONTH | 한 달의 날짜 |
MONTH | 달(0~11) | DAY_OF_WEEK | 한 주의 요일 |
HOUR | 시간(0~11) | AM_PM | 오전인지 오후인지 구분 |
HOUR_OF_DAY | 24시간을 기준으로 한 시간 | MINUTE | 분 |
SECOND | 초 | MILLISECOND | 밀리초 |
본문제
Q1. 다음 main()이 실행되면 아래 예시와 같이 출력되도록 MyPoint 클래스를 작성하라.
public static void main(String [] args) {
MyPoint p = new MyPoint(3, 50);
MyPoint q = new MyPoint(4, 50);
System.out.println(p);
if(p.equals(q)) System.out.println("같은 점");
else System.out.println("다른 점");
}
class MyPoint{
private int x, y;
public MyPoint(int x, int y) {
this.x = x; this.y=y;
}
public String toString() {
return "Point(" + this.x +","+this.y+")";
}
}
Q2. 중심을 나타내는 정수 x, y와 반지름 radius 필드를 가지는 Circle 클래스를 작성하고자 한다. 생성자는 3개의 인자(x, y, raidus)를 받아 해당 필드를 초기화하고, equals() 메소드는 두 개의 Circle 객체의 중심이 같으면 같은 것으로 판별하도록 한다.
public static void main(String[] args) {
Circle a = new Circle(2, 3, 5); // 중심 (2, 3)에 반지름 5인 원
Circle b = new Circle(2, 3, 30); // 중심 (2, 3)에 반지름 30인 원
System.out.println("원 a : " + a);
System.out.println("원 b : " + b);
if(a.equals(b))
System.out.println("같은 원");
else
System.out.println("서로 다른 원");
}
class Circle{
private int x, y, r;
public Circle(int x, int y, int r) {
this.x = x; this.y = y; this.r = r;
}
public String toString() {
return "Circle(" + this.x + "," + this.y + ")반지름" + this.r;
}
public boolean equals(Circle obj) {
if(this.x == obj.x && this.y == obj.y) {
return true;
}
else {
return false;
}
}
}
Q3. 다음 코드를 수정하여, Calc 클래스는 etc 패키지에, MainApp 클래스는 main 패키지로 분리 작성하라.
class Calc {
private int x, y;
public Calc(int x, int y) { this.x = x; this.y = y; }
public int sum() { return x+y; }
}
public class MainApp {
public static void main(String[] args) {
Calc c = new Calc(10, 20);
System.out.println(c.sum());
}
}
package etc;
public class Calc {
private int x, y;
public Calc(int x, int y) { this.x = x; this.y = y; }
public int sum() { return x+y; }
}
package main;
import etc.Calc;
public class main {
public static void main(String[] args) {
Calc c = new Calc(10, 20);
System.out.println(c.sum());
}
}
Q4. 다음 코드를 수정하여 Shape 클래스는 base 패키지에, Circle 클래스는 derived 패키지에, GraphicEditor 클래스는 app 패키지에 분리 작성하라.
public class Shape {
public void draw() { System.out.println("Shape"); }
}
public class Circle extends Shape {
public void draw() { System.out.println("Cirlce"); }
}
public class GraphicEditor {
public static void main(String[] args) {
Shape shape = new Circle();
shape.draw();
}
}
package app;
import base.Shape;
import derived.Circle;
public class GraphicEditor {
public static void main(String[] args) {
Shape shape = new Circle();
shape.draw();
}
}
package derived;
import base.Shape;
public class Circle extends Shape {
public void draw() { System.out.println("Cirlce"); }
}
package base;
public class Shape {
public void draw() { System.out.println("Shape"); }
}
Q5. Calendar 객체를 생성하면 현재 시간을 알 수 있다. 프로그램을 실행한 현재 시간이 4시에서 낮 12시 이전이면 "Good Morning"을, 오후 6시 이전이면 "Good Afternoon"을, 밤 10시 이전이면 "Good Evening"을, 그 이후는 "Good Night"을 출력하는 프로그램을 작성하라.
현재 시간은 10시 22분입니다.
Good Morning
import java.util.Calendar;
public class Java {
public static void main(String args[]) {
Calendar k = Calendar.getInstance();
int t = k.HOUR_OF_DAY;
int m = k.MINUTE;
System.out.println("현재 시간은 " + t + "시 " + m + "분입니다.");
if(t >= 4 && t < 12) {
System.out.print("Good Morning");
}
else if(t >=12 && t< 18) {
System.out.print("Good Afternoon");
}
else if(t >= 18 && t < 22) {
System.out.print("Good Evening");
}
else {
System.out.print("Good Night");
}
}
}
Q6. 경과시간을 맞추는 게임을 작성하라. 다음 예시를 참고하면, <Enter> 키를 입력하면 현재 초 시간을 보여주고 여기서 10초에 더 근접하도록 다음 <Enter> 키를 입력한 사람이 이기는 게임이다.
10초에 가까운 사람이 이기는 게임입니다.
황기태 시작 키 >>
현재 초 시간 = 42
10초 예상 후 키 >>
현재 초 시간 = 50
이재문 시작 키 >>
현재 초 시간 = 51
10초 예상 후 키 >>
현재 초 시간 = 4
황기태의 결과 8, 이재문의 결과 13, 승자는 황기태
Q7. Scanner를 이용하여 한 라인을 읽고, 공백으로 분리된 어절이 몇 개 들어 있는지 "그만"을 입력할 때까지 반복하는 프로그램을 작성하라.
>>I love Java.
어절 개수는 3
>>자바는 객체 지향 언어로서 매우 좋은 언어이다.
어절 개수는 7
>>그만
종료합니다...
(1) StringTokenizer 클래스를 이용하여 작성하라.
import java.util.*;
public class Java {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String str = null;
int count = 0;
while(true) {
count = 0;
System.out.print(">>");
str = sc.nextLine();
if(str.equals("그만")) {
break;
}
else {
System.out.print("어절 개수는 ");
StringTokenizer st = new StringTokenizer(str, " ");
count = st.countTokens();
System.out.println(count);
}
}
System.out.println("종료합니다....");
}
}
(2) String 클래스의 split() 메소드를 이용하여 작성하라.
import java.util.*;
public class Java {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String str = null;
int count = 0;
while(true) {
count = 0;
System.out.print(">>");
str = sc.nextLine();
if(str.equals("그만")) {
break;
}
else {
System.out.print("어절 개수는 ");
String k[] = str.split(" ");
System.out.println(k.length);
}
}
System.out.println("종료합니다....");
}
}
Q8. 문자열을 입력받아 한 글자씩 회전시켜 모두 출력하는 프로그램을 작성하라.
문자열을 입력하세요. 빈칸이나 있어도 되고 영어 한글 모두 됩니다.
I Love you
Love youI
Love youI
ove youI L
ve youI Lo
e youI Lov
youI Love
youI Love
ouI Love y
uI Love yo
I Love you
import java.util.*;
public class Java {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String str = null, str1= null;
System.out.println("문자열을 입력하세요. 빈칸이나 있어도 되고 영어 한글 모두 됩니다.");
str = sc.nextLine();
for(int i = 0; i < str.length(); i++) {
str1 =str.substring(i+1);
System.out.print(str1);
for(int j = 0; j <= i; j++) {
System.out.print(str.charAt(j));
}
System.out.println();
}
}
}
Q9. 철수와 컴퓨터의 가위바위보 게임을 만들어보자. 가위, 바위, 보는 각각 1, 2, 3 키이다. 철수가 키를 입력하면, 동시에 프로그램도 Math.Random()을 이용하여 1, 2, 3 중에 한 수를 발생시키고 이것을 컴퓨터가 낸 것으로 한다. 그런 다음 철수와 컴퓨터 중 누가 이겼는지 판별하여 승자를 출력하라.
철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>1
철수(가위) : 컴퓨터(바위)
컴퓨터가 이겼습니다.
철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>3
철수(보) : 컴퓨터(바위)
철수가 이겼습니다.
철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>4
import java.util.*;
public class Java {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int a = 0, b = 0;
while(true) {
System.out.print("철수[가위(1), 바위(2), 보(3), 끝내기(4)] >>");
a = sc.nextInt();
b =(int)(Math.random()*3 + 1);
if(a == 4) {
break;
}
else {
if(a==1) {
if(b==1) {
System.out.println("철수(가위) : 컴퓨터(가위)");
System.out.println("비겼습니다.");
}
else if(b==2) {
System.out.println("철수(가위) : 컴퓨터(바위)");
System.out.println("컴퓨터가 이겼습니다.");
}
else if(b == 3) {
System.out.println("철수(가위) : 컴퓨터(보)");
System.out.println("철수가 이겼습니다.");
}
}
else if(a==2) {
if(b==1) {
System.out.println("철수(바위) : 컴퓨터(가위)");
System.out.println("철수가 이겼습니다.");
}
else if(b==2) {
System.out.println("철수(바위) : 컴퓨터(바위)");
System.out.println("비겼습니다.");
}
else if(b == 3) {
System.out.println("철수(바위) : 컴퓨터(보)");
System.out.println("컴퓨터가 이겼습니다.");
}
}
else if(a==3) {
if(b==1) {
System.out.println("철수(보) : 컴퓨터(가위)");
System.out.println("컴퓨터가 이겼습니다.");
}
else if(b==2) {
System.out.println("철수(보) : 컴퓨터(바위)");
System.out.println("철수가 이겼습니다.");
}
else if(b == 3) {
System.out.println("철수(보) : 컴퓨터(보)");
System.out.println("비겼습니다.");
}
}
}
}
}
}
Q10, Q12. . 갬블링 게임을 만들어보자. 두 사람이 게임을 진행한다. 이들의 이름을 키보드로 입력 받으며 각 사람은 Person 클래스로 작성하라. 그러므로 프로그램에는 2개의 Person 객체가 생성되어야 한다. 두 사람은 번갈아 가면서 게임을 진행하는데 각 사람이 자기 차례에서 <Enter> 키를 입력하면, 3개의 난수가 발생되고 이 숫자가 모두 같으면 승자가 되고 게임이 끝난다. 난수의 범위를 너무 크게 잡으면 3개의 숫자가 일치하게 나올 가능성이 적기 때문에 숫자의 범위는 1~3까지로 한다.
문제 10의 갬블링 게임을 n명이 하도록 수정하라. 실행 예시와 같이 게임에 참여하는 선수의 수를 입력받고 각 선수의 이름을 입력받도록 수정하라.(12번으로 풀음)
겜블링 게임에 참여할 선수 숫자>>3
1번째 선수 이름>>황
2번째 선수 이름>>이
3번째 선수 이름>>김
[황]:
2 3 3 아쉽군요!
[이]:
1 2 2 아쉽군요!
[김]:
2 2 3 아쉽군요!
[황]:
3 2 2 아쉽군요!
[이]:
1 1 3 아쉽군요!
[김]:
2 2 1 아쉽군요!
[황]:
2 2 2 황님이 이겼습니다!
import java.util.*;
class Person{
Scanner sc = new Scanner(System.in);
private String name;
private int num[];
public Person(String name) {
this.name = name;
}
public String getname() {
return this.name;
}
public boolean run() {
num = new int[3];
for(int i = 0; i < 3; i++) {
num[i] = (int)(Math.random() * 3 + 1 );
}
System.out.print("[" + this.name + "]" + ": <ENTER>");
sc.nextLine();
System.out.print("\t" + num[0] +" " +num[1] +" " +num[2] +" " );
if(num[0] == num[1] && num[1] == num[2]) {
return false;
}
else{
return true;
}
}
}
public class Java {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int num = 0;
int count = 0, stay = 0;
String name= null;
System.out.print("겜블링에 참여할 인원 숫자 >>");
num = sc.nextInt();
stay = num;
Person str[] = new Person[num];
for(int i = 0; i < num; i++) {
System.out.print((i+1) + "번째 선수 이름>>");
name =sc.next();
str[i] = new Person(name);
}
while(true) {
count = stay%num;
if(str[count].run()) {
System.out.println("아쉽군요!");
}
else {
System.out.println(str[count].getname()+"님이 이겼습니다!");
break;
}
stay++;
}
}
}
Q11. StringBuffer 클래스를 활용하여 명령처럼 문자열을 수정하라. 아래 실행 예시에서 love!LOVE는 love를 찾아 LOVE로 수정하라는 명령이다. 첫 번째 만난 문자열만 수정한다.
>>우리는 love Java Programming.
명령: 우리는!We
We love Java Programming.
명령: LOV!사랑
찾을 수 없습니다!
명령: !Java
찾을 수 없습니다!
명령: love!LOVE
We LOVE Java Programming.
명령: 그만
종료합니다
다른데서 indexOf라는 메소드를 쓰던데 이게 뭔지 모르겠다.
'java > 학교,기관' 카테고리의 다른 글
입출력 스트림과 파일 입출력(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.11.24 |
---|---|
제네릭과 컬렉션(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.11.21 |
상속(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.10.22 |
클래스와 객체(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.10.17 |
반복문과 배열 그리고 예외 처리(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.10.09 |
댓글