본문 바로가기
Study/Java

Chapter07.객체지향 프로그래밍2

by 로롤로롱 2023. 7. 9.

7_1)

class SutdaDeck {
	final int CARD_NUM = 20;
	SutdaCard[] cards = new SutdaCard[CARD_NUM];
	
	SutdaDeck() {
		// 배열 카드 적절히 초기화
		for(int i=0; i<cards.length; i++) {
			int r = i%10+1;
			boolean isKwang = i<10 && ((r==1)||(r==2)||(r==3)) ? true : false;
			cards[i] = new SutdaCard(r, isKwang);
		}
	}
}

class SutdaCard {
	int num;
	boolean isKwang;
	
	public SutdaCard() {
		this(1, true);
	}

	public SutdaCard(int num, boolean isKwang) {
		this.num = num;
		this.isKwang = isKwang;
	}
	
	public String toString() {
		return num + (isKwang ? "K":"");
	}
	
}

public class Exercise7_1 {
	
	public static void main(String[] args) {
		SutdaDeck deck = new SutdaDeck();
		
		for(int i=0; i<deck.cards.length; i++) {
			System.out.printf(deck.cards[i]+",");
		}
	}

}

7_2)

class SutdaDeck {
	final int CARD_NUM = 20;
	SutdaCard[] cards = new SutdaCard[CARD_NUM];
	
	SutdaDeck() {
		// 배열 카드 적절히 초기화
		for(int i=0; i<cards.length; i++) {
			int r = i%10+1;
			boolean isKwang = i<10 && ((r==1)||(r==3)||(r==8)) ? true : false;
			cards[i] = new SutdaCard(r, isKwang);
		}
	}

	public SutdaCard pick(int index) {
		
		return cards[index];
	}

	public SutdaCard pick() {
		int r = (int)(Math.random()*20);
		return cards[r];
	}
	
	public void shuffle() {
		// 카드 위치 변경
		SutdaCard temp;
		int r=0;
		for(int i=0; i<cards.length; i++) {
			r = (int)(Math.random()*20);
			
			temp = cards[i];
			cards[i] = cards[r];
			cards[r] = temp;
			
		}
	}

}

class SutdaCard {
	int num;
	boolean isKwang;
	
	public SutdaCard() {
		this(1, true);
	}

	public SutdaCard(int num, boolean isKwang) {
		this.num = num;
		this.isKwang = isKwang;
	}
	
	public String toString() {
		return num + (isKwang ? "K":"");
	}
	
}

public class Exercise7_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.printf(deck.cards[i]+",");
		}
		
		System.out.println();
		System.out.println(deck.pick(0));
	}

}

7_3)

에러 발생이유와 수정
Tv를 생성하면 Tv의 기본생성자가 호출되는데 생성자의 맨 처음에는 
부모클래스의 생성자  super()가 호출된다. super()가 없으면 컴파일러가 자동으로 추가해주는데
부모클래스인 Product에는 기본생성자가 없으므로 에러가 발생한다.

수정 1) Product클래스에 기본생성자 Product() { }를 추가
수정 2) 
class Product {
	int price; // 제품의 가격
	int bonusPoint; // 제품구매 시 제공하는 보너스점수
	//Product() {}
	
	Product(int price) {
		this.price = price;
		bonusPoint =(int)(price/10.0);
	}
}
class Tv extends Product {
	Tv(int price) {
		super(10); 
		}
	public String toString() {
		return "Tv";
	}
}
class Exercise7_3 {
	public static void main(String[] args) {
		Tv t = new Tv(10);
	}
}

7_4)

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 boolean isPowerOn() {
		return isPowerOn;
	}
	public void setPowerOn(boolean isPowerOn) {
		this.isPowerOn = isPowerOn;
	}
	public int getChannel() {
		return channel;
	}
	public void setChannel(int channel) {
		// 유효성 검사
		if(channel>MAX_CHANNEL || channel<MIN_CHANNEL) {
			return;
		}
		this.channel = channel;
	}
	public int getVolume() {
		return volume;
	}
	public void setVolume(int volume) {
		// 유효성 검사
		if(volume>MAX_VOLUME || volume<MIN_VOLUME) {
			return;
		}
		this.volume = volume;
	}
}

class Exercise7_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());

	}
}

7_5)

class MyTv2 {
	private boolean isPowerOn;
	private int channel;
	private int volume;
	private int prevChannel=0;
	
	final int MAX_VOLUME = 100;
	final int MIN_VOLUME = 0;
	final int MAX_CHANNEL = 100;
	final int MIN_CHANNEL = 1;
	
	public boolean isPowerOn() {
		return isPowerOn;
	}
	public void setPowerOn(boolean isPowerOn) {
		this.isPowerOn = isPowerOn;
	}
	public int getChannel() {
		return channel;
	}
	public void setChannel(int channel) {
		// 유효성 검사
		if(channel>MAX_CHANNEL || channel<MIN_CHANNEL) {
			return;
		}
		
		prevChannel = this.channel;
		this.channel = channel;
	}
	public int getVolume() {
		return volume;
	}
	public void setVolume(int volume) {
		// 유효성 검사
		if(volume>MAX_VOLUME || volume<MIN_VOLUME) {
			return;
		}
		this.volume = volume;
	}
	
	public void gotoPrevChannel() {
		// 현재 채널을 이전 채널로 변경
		setChannel(prevChannel);
	}
	
}

class Exercise7_5 {
	public static void main(String[] args) {
		MyTv2 t = new MyTv2();
		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());

	}
}

7_6)

class Outer { // 외부클래스
	class Inner { // 내부클래스
		int iv = 100;
	}
}

class Exercise7_6 {
	public static void main(String[] args) {
		// 내부 클래스(인스턴스 클래스)의 인스턴스를 생성하기 위해서는 먼저 외부클래스의
		// 인스턴스를 생성해야함 
		// 인스턴스 클래스는 외부 클래스의 인스턴스 변수처럼 
		// 외부 클래스의 인스턴스가 생성되어야 쓸 수 있음
		Outer outer = new Outer();
		Outer.Inner inner = outer.new Inner();
		
		System.out.println(inner.iv);

	}
}

7_7)

class Outer { // 외부클래스
	static class Inner { // 내부클래스
		int iv = 200;
	}
}

class Exercise7_7 {
	public static void main(String[] args) {
		// static inner class는 인스턴스 클래스와 달리 외부 클래스의 인스턴스를
		// static멤버를 인스턴스 생성없이 사용할수있는것처럼 생성하지 않고도 사용 가능
		
		Outer.Inner inner = new Outer.Inner();
		
		System.out.println(inner.iv);
	}
}

7_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);
			// 외부클래스의 인스턴스변수는 내부클래스에서 외부클래스이름.this.변수이름으로 접근 가능
		}
	}
}

class Exercise7_8 {
	public static void main(String[] args) {
		Outer outer = new Outer();
		Outer.Inner inner = outer.new Inner();
		
		inner.method1();
	}
}

7_9)

// 일시적으로 한번만사용되는 클래스
// 재사용성이 없고 확장성을 활용하는 것이 유지보수에서 더 불리할 때
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

class Exercise7_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);
			}
		});
		
	}
}

'Study > Java' 카테고리의 다른 글

Chapter09.java.lang 패키지  (0) 2023.07.16
Chapter08.예외처리  (0) 2023.07.09
Chapter06.객체지향 프로그래밍1(2)  (0) 2023.07.09
Chapter06. 객체지향 프로그래밍I(1)  (0) 2023.06.25
03. 연산자  (0) 2023.04.03

댓글