1.
- 섯다카드 20장을 포함하는 섯다카드 한 벌(SutdaDeck)
- 섯다카드 20장을 담는 SutdaCard배열을 초기화하라.
- 단, 섯다카드는 1~10까지 숫자가 적힌 카드가 한쌍씩 존재
- 숫자 1,3,8인 경우 둘 중 한장은 광(Kwang)이어야 함.
- SutdaCard의 인스턴스 변수 isKwang의 값이 true이어야 한다는 것.
class SutdaDeck {
final int CARD_NUM = 20;
SutdaCard[] cards = new SutdaCard[CARD_NUM];
SutdaDeck() {
for(int i=0;i<cards.length;i++) {
int num = i % 10 + 1;
boolean isKwang = (i<10)&&((num==1)||(num==3)||(num==8));
cards[i] = new SutdaCard(num,isKwang);
}
}
}
class SutdaCard {
int num;
boolean isKwang;
SutdaCard(){
this(1,true);
}
SutdaCard(int num, boolean isKwang){
this.num=num;
this.isKwang =isKwang;
}
// 인스턴스 출력 시 toString()의 리턴값이 출력되는데, 이를 오버라이딩 한 것. num + K여부
public String toString() {
return num + (isKwang ? "K" : "" );
}
}
public class Prac7_1 {
public static void main(String[] args) {
SutdaDeck deck = new SutdaDeck();
for(int i = 0 ; i<deck.cards.length; i++) {
System.out.print(deck.cards[i] + ", ");
}
}
}
SutdaCard 클래스에서 toString()를 재정의함으로서 "카드의 num+[K], "가 출력되도록 함.
toString()은 본래 인스턴스를 출력하면 호출되는 메서드임
오버라이딩 하지 않으면 어떤 결과가 나올까?
ㅇㅋㅇㅋ
2.
연습문제 1번의 SutdaDeck 클래스에 다음에 정의된 새로운 메서드를 추가하고 테스트하라.
1) 메서드명: shuffle
- 기능: 배열 cards에 담긴 카드의 위치를 뒤섞는다. (Math.random() 사용)
- 반환타입 X 매개변수 X
2) 메서드명: pick
- 기능: 배열 cards에서 지정된 위치의 SutdaCard를 반환한다
- 반환타입: SutdaCardd
- 매개변수: int index - 위치
3) 메서드명: pick
- 기능: 배열 cards에서 지정된 임의의 위치의 SutdaCard를 반환한다. (Math.random()사용)
- 반환타입: SutdaCard
- 매개변수: 없음
import java.lang.Math;
class SutdaDeck {
final int CARD_NUM = 20;
SutdaCard[] cards = new SutdaCard[CARD_NUM];
SutdaDeck() {
for(int i=0;i<cards.length;i++) {
int num = i % 10 + 1;
boolean isKwang = (i<10)&&((num==1)||(num==3)||(num==8));
cards[i] = new SutdaCard(num,isKwang);
}
}
void shuffle() {
for(int i =0;i<cards.length;i++) {
SutdaCard temp = cards[i];
int x= (int) (Math.random() * 20 );
cards[i] = cards[x];
cards[x]=temp;
}
}
SutdaCard pick(int index) {
return cards[index];
}
SutdaCard pick() {
int x = (int) (Math.random() *20);
return cards[x];
}
}
class SutdaCard {
int num;
boolean isKwang;
SutdaCard(){
this(1,true);
}
SutdaCard(int num, boolean isKwang){
this.num=num;
this.isKwang =isKwang;
}
// 인스턴스 출력 시 toString()의 리턴값이 출력되는데, 이를 오버라이딩 한 것. num + K여부
public String toString() {
return num + (isKwang ? "K" : "" );
}
}
class Prac7_2 {
public static void main(String args[]) {
SutdaDeck deck = new SutdaDeck();
System.out.println(deck.pick(0));
System.out.println(deck.pick());
deck.shuffle();
for (int i = 0; i<deck.cards.length;i++) {
System.out.print(deck.cards[i] + ",");
}
System.out.println();
System.out.println(deck.pick(0));
}
}
아 재밌다 ㅋㅋ
역시 코드는 직접 짜봐야 하나보다 하고 느낌.
머리 팽팽돌아가네 ㅎㅎ (신난코린이)
3. 코드 에러를 찾아라
class Product{
int price;
int bonusPoint;
Product(int price){
this.price = price;
bonusPoint = (int) (price / 10.0);
}
}
class Tv extends Product{
Tv() { }
public String toString() {
return "Tv";
}
}
public class Prac7_3 {
public static void main(String[] args) {
Tv t = new Tv();
}
}
처음엔 Tv 클래스의 생성자 쪽을 수정해서 넣어야 하나?.. 싶었는데
생각해보니 부모 클래스의 생성자가 이미 매개변수가 있음.
그럼 Tv클래스 생성자에 매개변수 하나 추가해서 만드나? 그렇다기엔 객체 생성 시 그냥 new Tv(); 하고 있다.
결국 Product 클래스에 디폴트 생성자(매개변수가 없는) 추가.
class Product{
int price;
int bonusPoint;
Product() { }
Product(int price){
this.price = price;
bonusPoint = (int) (price / 10.0);
}
}
class Tv extends Product{
Tv() { }
public String toString() {
return "Tv";
}
}
public class Prac7_3 {
public static void main(String[] args) {
Tv t = new Tv();
}
}
4.
- MyTv 클래스의 멤버변수 isPowerOn, channel, volume을 클래스 외부에서 접근할 수 없도록 접그넺어자를 붙이라
- 해당 멤버변수의 값을 어디서나 읽고 변경할 수 있도록 getter와 setter 메서드 추가
※ 난 이미 틀렸지만.. 값을 어디서나 읽고 변경할 수 있도록 하려면 메서드의 접근제어자가 뭐야할까??
class MyTv {
private boolean isPowerOn;
private int channel;
private int volume;
final int MAX_VOLUME = 100;
final int MIN_VOLUME = 0;
final int MAX_CHANNEL = 100;
final int MIN_CHANNEL = 1;
public void setVolume(int volume) {
if(volume > MAX_VOLUME || volume < MIN_VOLUME) {
return;
}
this.volume = volume;
}
public int getVolume() {
return this.volume;
}
public void setChannel(int channel) {
if(channel > MAX_CHANNEL || channel < MIN_CHANNEL) {
return;
}
this.channel = channel;
}
public int getChannel() {
return this.channel;
}
}
public class Prac7_4 {
public static void main(String[] args) {
MyTv t = new MyTv();
t.setChannel(10);
System.out.println("CH: " + t.getChannel());
t.setVolume(20);
System.out.println("Vol: " + t.getVolume());
}
}
5.
연습문제 4번에서 작성한 클래스에 이전 채널로 이동하는 기능의 메서드 추가
- 메서드명: gotoPrevChannel
- 기능: 현재 채널을 이전 채널로 변경
- 반환타입 및 매개변수 X
class MyTv {
private boolean isPowerOn;
private int channel;
private int volume;
private int PrevChannel;
final int MAX_VOLUME = 100;
final int MIN_VOLUME = 0;
final int MAX_CHANNEL = 100;
final int MIN_CHANNEL = 1;
public void setVolume(int volume) {
if(volume > MAX_VOLUME || volume < MIN_VOLUME) {
return;
}
this.volume = volume;
}
public int getVolume() {
return this.volume;
}
public void setChannel(int channel) {
if(channel > MAX_CHANNEL || channel < MIN_CHANNEL) {
return;
}
this.PrevChannel=this.channel;
this.channel = channel;
}
public int getChannel() {
return this.channel;
}
public void gotoPrevChannel() {
int channel=this.PrevChannel;
this.PrevChannel=this.channel;
this.channel = channel;
}
}
public class Prac7_5 {
public static void main(String[] args) {
MyTv t = new MyTv();
t.setChannel(10);
System.out.println("CH: " + t.getChannel());
t.setChannel(20);
System.out.println("CH: " + t.getChannel());
t.gotoPrevChannel();
System.out.println("CH: " + t.getChannel());
t.gotoPrevChannel();
System.out.println("CH: " + t.getChannel());
t.setChannel(55);
System.out.println("CH: " + t.getChannel());
t.gotoPrevChannel();
System.out.println("CH: " + t.getChannel());
}
}
이게 맞나 모르겠다 ㅋㅋ작동은 제대로 되는데..
답과 비교해보겠다.
// 내가 작성한 gotoPrevChannel 메서드
public void gotoPrevChannel() {
int channel=this.PrevChannel;
this.PrevChannel=this.channel;
this.channel = channel;
}
// 답지에 있는 gotoPrevChannel 메서드
public void gotoPrevChannel() {
setChannel(prevChannel); // . 현재 체널을 이전 채널로 변경한다
}
ㅋㅋㅋㅋㅋㅋㅋㅋ아..
저런 방법이..
나머지는 똑같다. 멤버변수 PrevChannel 생성한 것, 그리고 setChannel 메서드의 위에 PrevChannel = this.channel 한 것.
다만.. 나보다 더 효율적일 뿐.. 생각조차 못했네.
6. Outer 클래스의 내부 클래스 Inner의 멤버변수 iv 값 출력하시오
class Outer {
class Inner{
int iv =100;
}
}
public class Prac7_6 {
public static void main(String[] arvs) {
Outer o = new Outer();
Outer.Inner i = o.new Inner();
System.out.println(i.iv);
}
}
7. Outer 클래스의 내부 클래스 Inner의 멤버변수 iv 값 출력하시오
class Outer {
static class Inner{
int iv =200;
}
}
public class Prac7_7 {
public static void main(String[] args) {
Outer.Inner i = new Outer.Inner();
System.out.println(i.iv);
}
}
기억하자
내부 인스턴스 클래스의 멤버변수 사용하기 위해서는..
외부 클래스의 객체 먼저 생성 후 그 객체를 통해서 내부클래스 객체 생성 후 사용 가능함.
1) 외부클래스 객체 생성
2) 외부클래스.내부클래스 참조변수 = 외부객체참조변수.new 내부클래스();
그러나 내부 스태틱 클래스의 멤버변수 사용하기 위해서는.. 외부클래스 객체 딱히 필요없다.
다만 내부 스태특 클래스의 객체 생성 시
" 외부클래스.내부클래스 참조변수 = new 외부클래스.내부클래스(); " 와 같은 형태로 생성한다.
8.
class Outer {
int value = 10;
class Inner{
int value = 20;
void method1() {
int value = 30;
System.out.println(value);
System.out.println(this.value);
System.out.println(Outer.this.value);
}
}
}
public class Prac7_8 {
public static void main(String[] args) {
Outer o = new Outer();
Outer.Inner inner = o.new Inner();
inner.method1();
}
}
9. 아래 코드의 EventHandler를 익명 클래스로 변경하시오.
<변경 전>
import java.awt.*;
import java.awt.event.*;
class EventHandler extends WindowAdapter{
public void windowClosing(WindowEvent e) {
e.getWindow().setVisible(false);
e.getWindow().dispose();
System.exit(0);
}
}
public class Prac7_9 {
public static void main(String[] args) {
Frame f = new Frame();
f.addWindowListener(new EventHandler());
}
}
<변경 후>
import java.awt.*;
import java.awt.event.*;
public class Prac7_9 {
public static void main(String[] args) {
Frame f = new Frame();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
e.getWindow().setVisible(false);
e.getWindow().dispose();
System.exit(0);
}
});
}
}
[변경 꿀팁]
1) 익명 클래스로 변경하려는 클래스 이름을 지울 것. 어디에 있냐면.. 객체 생성 시 new 옆에 있는.
2) 그 자리에 조상클래스 또는 인터페이스 (위 코드에서는 WindowAdapter)를 넣고 객체 생성
3) 중괄호 열어서 익명 클래스로 변경하려는 클래스의 내용 복붙해서 넣어.
끝
'프로그래밍 > java' 카테고리의 다른 글
[JAVA] default 메서드, static 메서드, 내부클래스, 익명클래스 (0) | 2022.09.03 |
---|---|
[JAVA] 인터페이스, 상속, 구현 (0) | 2022.08.31 |
[JAVA] 추상 클래스와 추상 메서드 (abstract) (0) | 2022.08.31 |
[JAVA] 매개변수의 다형성, 객체 배열과 벡터 (0) | 2022.08.31 |
[JAVA] 참조변수의 형변환 (0) | 2022.08.29 |