[JAVA] 자바의정석 기초편 7장 연습문제

2022. 9. 3. 23:04·프로그래밍/java

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()은 본래 인스턴스를 출력하면 호출되는 메서드임

오버라이딩 하지 않으면 어떤 결과가 나올까?

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] 참조변수의 형변환  (1) 2022.08.29
'프로그래밍/java' 카테고리의 다른 글
  • [JAVA] default 메서드, static 메서드, 내부클래스, 익명클래스
  • [JAVA] 인터페이스, 상속, 구현
  • [JAVA] 추상 클래스와 추상 메서드 (abstract)
  • [JAVA] 매개변수의 다형성, 객체 배열과 벡터
병뚜
병뚜
열정!
  • 병뚜
    열려라 뚜껑
    병뚜
  • 전체
    오늘
    어제
    • all (372)
      • 일상X사랑X돈 (0)
        • 보안이슈 (114)
        • 뜨거운감자 (9)
        • 맛집 (2)
        • 혼잣말 (16)
      • 보안 (87)
        • 웹·모바일 (46)
        • 인프라 (19)
        • 리버싱 (8)
        • Security-Gym (10)
        • 리뷰 (4)
      • 프로그래밍 (66)
        • python (14)
        • java (12)
        • js (40)
      • System (47)
        • OS (14)
        • 침투 (33)
      • Play (20)
        • wargame (20)
      • 기타 (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    IT뉴스
    혼공단
    혼공파
    혼자공부하는파이썬
    랜섬웨어
    kisa
    혼공
    리버싱
    windows internals
    드림핵리버싱
    커널디버깅
    공급망공격
    리버싱초보
    파이썬
    악성코드
    뉴스요약
    자바스크립트 상속
    프로세스
    혼공학습단
    정보보안
    보안이슈
    파이썬공부
    it이슈
    파이썬입문
    보안뉴스
    jwt
    정보보안교육
    파이썬초보
    윈도우인터널스
    정보보호
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
병뚜
[JAVA] 자바의정석 기초편 7장 연습문제
상단으로

티스토리툴바