본문 바로가기

Java/자바의정석 기초편

자바의 정석 7장 (19일차) - 7장 연습문제 (객체지향 2)

728x90

섯다 카드 한벌 생성

  1. 섯다카드 클래스 자체를 array로 지정하여 선언
  2. 지정한 후 if로 조건문을 선언하여 숫자 조건 추가
  3. 숫자를 배정할 때 객체를 선언하여 그 멤버변수에 숫자를 배정
  4. 위의 메인클래스에서 for문으로 출력
// 섯다카드 20장을 포함하는 섯다카드 한벌(sutdadeck클래스)를 정의한 것.
// 섯다카드 20장ㅇ을 담는 sutdacard배열을 초기화하시오.
// 섯다카드는 1-10까지 숫자가 적힌 카드가 한장씩 있고 1,3,8일 경우 둘증의 한장은 Kwang이어야 함
// 

public class Chap7 {
	public static void main(String[] args) {
		SutdaDeck deck = new SutdaDeck();
		for(int i = 0; i<deck.cards.length; i++) {
			System.out.println(deck.cards[i]);
		}
	}
}
class SutdaDeck{
	final int CARD_NUM = 20;
	SutdaCard[] cards = new SutdaCard[CARD_NUM];
//	아래의 섯다카드 클래스 자체를 array로 지정하여 시작
	SutdaDeck() {
		for(int i = 0; i<CARD_NUM; i++) {
//			지정한 후 for반복문으로 if 조건문을 걸어 위의 숫자 조건 추가
			if(i==2 || i == 4|| i==7) {
				cards[i] = new SutdaCard(i+1, true);
			}
//			클래스 자체를 array로 잡았으므로 아예 객체를 선언하여 클래스의 멤버변수에 숫자를 배정하여 출력
			else {
				cards[i] = new SutdaCard((i%10)+1, false);
			}
		}
	}
}

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

	public SutdaCard(int num, boolean isKwang) {
		this.num = num;
		this.isKwang = isKwang;
	}

	public String toString() {
		return num + (isKwang ? "K" : "");
	}
}

생성자 매개변수 여부에 따른 컴파일에러

조상객체를 상속받은 자손의 생성자를 생성할 때 조상의 생성자가 매개변수가 생성되어있는 상태라면 자손의 생성자도 동일하게 생성자에 매개변수를 넣은 후 super로 동일한 변수 메모리를 할당해야 한다. 

package LecturePracticalExam;

class Product{
	int price;
	int bonusPoint;
	
	public Product() {}
//	빈 생성자를 생성해야 아래 TV를 컴파일할때 오류가 나지않음
//	TV를 호출할때 조상객체인 Product를 불러오는데 이 때 매개변수가 없는 TV는
//	매개 변수가 없는 Product가 필요함
	
//	다만 아래의 매개변수가 필요한 Product는 TV의 생성자도 매개변수가 있어야
//	조상 객체의 매개변수를 불러올 수 있기때문에 TV내에도 동일한 타입의 매개변수를
//	넣어줘야한다.
	
	public Product(int price) {
		this.price = price;
		bonusPoint = (int)(price/10.0);
	}
}
class TV extends Product{

	public TV() {}
	
	public TV(int price) {
		super(price);
	}
	public String toString() {
		return "TV";
	}
}
public class Chap7_ComplileError {
	public static void main(String[] args) {
		TV t = new TV(100);
		System.out.println(t.price);
		System.out.println(t.bonusPoint);
	}
}

Getter & Setter

private의 변수를 접근 가능하게 해주는 getter & setter 생성 후 전 채널로 돌아갈 수 있는 메서드 생성

package LecturePracticalExam;

public class Chap7_GetterSetter {

	public static void main(String[] args) {
		MyTv t = new MyTv();
		t.setChannel(1);
		t.setChannel(2);
		System.out.println("CH:"+t.getChannel());
		t.setVolume(99);
		System.out.println("VOL:"+t.getVolume());
		t.gotoPrevChannel();
		System.out.println("CH:"+t.getChannel());
	}
}

//1.
//MyTv클래스의 멤버변수 isPowerOn, channel, volume을 클래스 외부에서 접근할 수
//없도록 제어자를 붙이고 대신 이 멤버변수들의 값을 어디서나 읽고 변경할 수 있도록
//getter와 setter메서드를 추가하라.

//2.
//작성한 MyTv2클래스에 이전 채널(previous channel)로 이동하는 기능
//의 메서드를 추가해서 실행결과와 같은 결과를 얻도록 하시오.
//[Hint] 이전 채널의 값을 저장할 멤버변수를 정의하라.
//메서드명 : gotoPrevChannel
//기 능 : 현재 채널을 이전 채널로 변경한다.
//반환타입 : 없음
//매개변수 : 없음

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;
	int PrevChannel;
	
	public void gotoPrevChannel() {
		setChannel(PrevChannel);
//		바뀌기 전의 채널 setChannel로 channel값에 배정
	}
	
	public boolean getIspowerOn() {
		return isPowerOn;
	}
	public void setIspowerOn(boolean ispowerOn) {
		this.isPowerOn = ispowerOn;
	}
	public int getChannel() {
		
		return channel;
	}
	public void setChannel(int channel) {
		if(channel<=MAX_CHANNEL && channel>=MIN_CHANNEL) {
			PrevChannel = this.channel;
//			바뀌기 전의 채널을 변수에 저장
			this.channel = channel;
		}
		else {
			System.out.println("올바른 채널이 아닙니다");
			return;
		}
	}
	public int getVolume() {
		return volume;
	}
	public void setVolume(int volume) {
		if(volume<=MAX_VOLUME && volume>=MIN_VOLUME) {
			this.volume = volume;
			}
		else {
			System.out.println("올바른 볼륨이 아닙니다");
			return;
		}
	}	
}

내부 변수 선언

선언 1

package LecturePracticalExam;

public class Chap7_InnerClass {
	public static void main(String[] args) {
		Outer o = new Outer();
		Outer.Inner i = o.new Inner();
		System.out.println(i.iv);
	}
}
//Outer클래스의 내부 클래스 Inner의 멤버변수 iv의 값을 출력하시오.

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

 

선언 2

package LecturePracticalExam;

import LecturePracticalExam.Outer2.Inner2;

public class Chap7_InnerClass2 {
	public static void main(String[] args) {
		Outer2.Inner2 i = new Inner2();
		System.out.println(i.iv);
	}
}
// static 변수이기때문에 따로 객체생성 필요없음
//Outer클래스의 내부 클래스 Inner의 멤버변수 iv의 값을 출력하시오.

class Outer2 { // 외부 클래스
static class Inner2 { // 내부 클래스(static클래스)
int iv=200;
	}
}

 

선언 3

package LecturePracticalExam;

public class Chap7_InnerClass3 {
	public static void main(String[] args) {
//		4) 
		Outer3 o = new Outer3();
		Outer3.Inner i = o.new Inner();
		i.method1();
	}

	
}

class Outer3 {
	int value=10; // Outer.this.value	
	class Inner {
		int value=20; 
	
		void method1() {
			int value=30;
			System.out.println(value); //1
			System.out.println(this.value); //2
			System.out.println(Outer3.this.value); //3
		}
	}
}

//다음과 같은 실행결과를 얻도록 (1)~(4)의 코드를 완성하시오.
//30
//20
//10

익명 클래스 선언

아래의 클래스를 익명으로 선언하여 객체 선언 줄이기

package LecturePracticalExam;
import java.awt.*;
import java.awt.event.*;
//아래의 EventHandler를 익명 클래스(anonymous class)로 변경하시오.
public class AnonymousClass {
	public static void main(String[] args){
		Frame f = new Frame();
//		f.addWindowListener(new EventHandler());
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
			e.getWindow().setVisible(false);
			e.getWindow().dispose();
			System.exit(0);
			}
		});
	}
}
//class EventHandler extends WindowAdapter{
//	public void windowClosing(WindowEvent e) {
//	e.getWindow().setVisible(false);
//	e.getWindow().dispose();
//	System.exit(0);
//		}
//	}
//}