본문 바로가기
솔루션모음/자바 기초부터 하나씩

[자바 기초부터 하나씩/9장 연습문제 솔루션 답지 해답] 객체와 클래스

by 이얏호이야호 2020. 4. 1.

1.참 또는 거짓

a. 자바에서는 프로그래머가 자신의 클래스를 작성하는 것을 허용하지 않는다.

: 거짓. 프로그래머는 자신의 클래스를 작성하여 이용이 가능하다.

b. 클래스의 private 메소드는 그 클래스의 모든 메소드에서 접근이 가능하다.

:

c. 클래스의 public 메소드는 그 클래스의 모든 메소드에서 접근이 가능하다.

:

d. 클래스의 public 메소드는 그 클래스의 외부의 메소드에서 접근이 가능하다.

:

e. private 인스턴스 변수는 클래스에 있는 모든 메소드에서 접근이 가능하다.

: .

f. private 인스턴스 변수는 클래스 외부의 메소드에서 접근이 가능하다.

: 거짓. 클래스 내부에 메소드에서만 접근이 가능합니다.

g. static 변수는 인스턴스 변수와 같다.

: 거짓. 인스턴스 변수는 일반적으로 private 접근 제어자로 할당됩니다.

h. static 변수는 클래스의 모든 객체에 의해 공유된다.

: .

i. static 변수 x는 인스턴스 변수가 접근되는 것과 같은 방식, , p.x로 객체 p에 의해 접근될 수 있다.

: .

j. 생성자는 반환값이 없고 void가 붙지 않는 메소드의 특별한 종류이다.

: .

k. 생성자는 객체를 초기화하고 생성한다.

: .

l. 클래스 당 단지 하나의 생성자만 허용된다.

: 거짓. abc(), abc(int c) 등의 여러 생성자를 만들 수 있습니다.

m. 생성자는 오버로딩될 수 없다.

: 거짓. abc(), abc(int c) 등의 여러 생성자를 만들 수 있습니다.

n. 만약 생성자를 정의하지 못하면, 자바가 기본 생성자를 제공해준다.

: .

o. 자바는 프로그래머의 마음을 읽을 수 있다.

: 거짓. 언어는 프로그래머의 마음을 읽을 수 없다.

p. 자바의 가비지 컬렉션은 재활용과 비슷하다.

: .

q. 객체가 더 이상 참조되지 않을 때 쓰레기(garbage)가 된다.

: .

r. this 키워드는 호출 객체에 대한 참조이다.

: 거짓. this 키워드는 자기 자신을 참조할 수 있다.

s. that 키워드는 메소드 호출된 객체의 참조를 직접적으로 참조하도록 해준다.

: 거짓. 자바는 this 키워드를 사용합니다.

t. 인스턴스 변수는 내장된 자바 유형이어야 하며 프로그래머가 정의한 클래스는 될 수 없다.

: 거짓. private boolean win (String choice, int sum)처럼 클래스를 만들 수 있습니다.

 

 

 

2.클래스 설계

다음 클래스를 구현하기 위해 사용해야 하는 pubic 메소드, 인스턴스 변수, private 메소드, static 메소드, static 변수, 그리고/또는 생성자를 기술하여라.

a. 휴대전화

전화기는 전원이 켜지거나 꺼지고 사용중 또는 사용 중이 아니다.

private boolean ing;//사용중 또는 사용중이 아니다.

private boolean turnOnOff;//켜지거나 꺼진다.

cellPhone(){

turnOnOff = true;

ing = false;

index=0;

}

}

전화기는 n개의 자주 거는 전화번호 목록과 자신의 전화번호를 저장할 수 있다.

public void saveNumber(int number){

list[index] = number;

index++;

}

전화기는 자주 거는 전화번호 목록과 자신의 전화번호를 화면에 표시할 수 있다.

private String myPhoneNumber = "010-9232-1234";

public String dialList(){

String insert = myPhoneNumber;

for(int i=0;i<index;i++)

{

insert += favorite[i];

}

return insert;

}

사용자는 저장된 전화번호에 1에서 n까지 범위의 정수 값을 지정하여 자주 거는 전화번호를 단축 다이얼로 지정할 수 있다.

public int setDial(int number, int phoneNumber){

list[number] = phoneNumber;

}

전화기의 벨이 울리는지를 판단할 수 있고, 만약 그렇다면 전화를 받을 수 있다.

private boolean bell=true;

private boolean canCall;

public boolean bell(){

if(bell==true){

canCall = true;

return canCall;

}else{

canCall = false;

return canCall;

}

}

전화를 걸거나 받으면, 전화기는 사용중이다.

private boolean ing;

public void fromC()

{

ing = false;}

public void toC()

{

ing = true;

}

전화기가 사용 중이 아닐 경우에만 전화를 걸 수 있다.

private boolean ing;

private boolean can;

public void canCall(){

if(ing==false){

can = true;

}

}

전화를 끊을 수 있고, 그 때는 사용중이 아니다.

private boolean ing;

public void cutCall()

{

ing = false;

}

전화기를 켜거나 끌 수 있다. 전화기를 끄면, 또한 전화도 끊어진다.

public void turnOnOFF(boolean turnOnOff){

this.turnOnOff = turnOnOff;

if(turOnOff == false)

{

ing = false;

}

}

전화기는 전화를 걸고 저장한 모든 전화번호를 기억한다.

private int index=0;

public void call(int insert)

{

list[i] = insert;

}

전화를 걸었던 전화번호 목록을 볼 수 있다.

int[] callList;

public void showList(){

for(int I=0;i<callList;i++){

callList++;

}

}

가장 최근에 걸었던 전화번호로 다시 전화를 걸 수 있다.

private int last;

public int lastCall(){

return last;}

 

b. 컴퓨터 스피커

스피커에는 on 또는 off를 나타내는 녹색 led가 있다.

static boolean turn;

private boolean greenLED;

private int sound;

ComputerSpeaker(){

turn = true;

greenLED= true;

sound=0;

}

스피커에는 전원을 토글 시켜주는 전원 스위치가 있다.

boolean turn=true;

public void toggle()

{

if(turn==true){

turn=false;

greenLED=false;

}else{

turn=true;

greenLED=true;

}

}

스피커에는 0-9까지 10개의 조절점을 갖는 음량 스위치가 있다.

public void sound(int insert){

if(insert >=0 && insert<=9){

sound = insert;

}

}

스피커에는 색상이 존재한다(검정, 회색,흰색)

private Color color;

public void setColor(Color color){

this.color = color;

}

스피커에는 전력 등급(, , )이 있다.

static String[] powerLevel={"",“”,“”};

음량(볼륨)을 올리거나 내릴 수 있다. 9 위로 올리거나 0아래로 내리는 것은 효과가 없다.

public void upSound(){

if(sound > 9){

sound=9;

}else{

sound++;

}

public void downSound(){

}

if(sound <= 0){

sound=0;

}else{

sound--;

}

 

 

4.클래스의 기본

 

다음 클래스에 대하여 질문에 답하여라.

a. 어느 것이 인스턴스 변수인가?

: private int var1, var2;

private String var3, var4;

b. 어느 메소드가 public이고 private인가?

: public = MyClass / private = myMethod()

c. 클래스의 이름은 무엇인가?

: MyClass

d. 이 클래스의 객체의 이름은 무엇인가?

: myMethod, tryMe, tryMeToo

e. MyClass.tryMe(); 는 문법에 맞는 문장인가?

: 거짓. tryMe(String)을 입력해줘야합니다.

f. MyClass.tryMeToo();는 문법에 맞는 문장인가?

: .

g. 출력은 무엇인가?

1

2

nulllinknull

tryMe first try

tryMeToo

 

tryMeToo

tryMeToo

 

tryMeToo

tryMeToo

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

public class MyClass {

private int var1,var2;

private String var3, var4;

static private int count;

public MyClass()

{

count++;

}

private void myMethod()

{

System.out.println("MyMethod");

}

String tryMe(String x)

{

System.out.println(++ var1);

System.out.println(++ var2 + var1);

System.out.println(var3+"link"+var4);

return("tryMe"+x);

}

static void tryMeToo()

{

for(int j=0;j<count;j++)

System.out.println("tryMeToo");

System.out.println();

 

}

public static void main(String[] args) {

MyClass x = new MyClass();

System.out.println(x.tryMe(" first try "));

x.tryMeToo();MyClass y = new MyClass();

x.tryMeToo();y.tryMeToo();

}

}

 

5 출력 결정

다음 프로그램은 어렵고 약간의 속임수가 포함되어 있으니 주의해야한다.

a.

public class Quine {

 

public static void main(String[] args) {

char c = 34;

System.out.print(s + c + s + c + ';' + '}');

}

static String s1 = "public class Quine(public static void main(String[] args)";

static String s2 = "{char c = 34; System.out.print(s + c + s + c + ';' + '}');}static String s= ";

static String s = s1+s2;

}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ출력ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

public class Quine(public static void main(String[] args){char c = 34; System.out.print(s + c + s + c + ';' + '}');}static String s= "public class Quine(public static void main(String[] args){char c = 34; System.out.print(s + c + s + c + ';' + '}');}static String s= ";}

 

b.

public class LinkMeUp {

private int data;

private LinkMeUp next;

 

LinkMeUp(int num)

{

data = num * num; next = null;

}

 

LinkMeUp()

{

this(0);

}

 

LinkMeUp add(int num)

{

LinkMeUp temp = new LinkMeUp(num);

temp.next = this;

return(temp);

}

void print()

{

LinkMeUp temp = this;

while(temp != null)

{

System.out.println(temp.data);

temp = temp.next;

}

}

public static void main(String[] args) {

LinkMeUp link = new LinkMeUp();

for(int k=1;k<10;k++)

link = link.add(k);

link.print();

 

}

 

}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ출력ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

81

64

49

36

25

16

9

4

1

0

 

 

6. 오류 수정

다음 프로그램에서 모든 오류를 찾고, 이 프로그램의 목적대로 수정하여라. 구문 오류와 의미상(논리) 오류가 존재한다. 이 문제를 해결하는 가장 쉬운 방법은 컴파일러의 도움을 받는 것이다.

다음 프로그램은 다음 세 가지 메소드를 갖는 ArrayHandler 클래스를 생성하려고 한다.

a.0에서 n-1범위에 있는 임의의 요소를 포함하는 길이 n의 배열 arr을 생성하는 생성자 ArrayHandler(int n)

b.arr의 첫 번째 요소 a=arr[0] 주변으로 배열을 분할하는 partitionArray() 이는 배열이 재정렬되는 것을 의미하므로,

a는 이 배열에서 재배치되고,

a왼쪽에 있는모든 요소는 a보다 작거나 같고,

a오른쪽에 있는모든 요소는 a보다 크거나 같다.

예를 들어, arr{ 7, 2, 15 , 9 ,13 ,26, 36,1}이면, 한 가지 가능한 분할 재정렬 arr{2.1,7,15,9,13,26,36}과 같다.

 

c. 배열 arr의 내용을 표시하는 PrintArray();

ㅡㅡㅡㅡㅡㅡㅡ바로 정답 코드를 넣었습니다.ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

public class ArrayHandler {

private int[] arr;

private int length;

 

ArrayHandler(int n)

{

length = n;

arr = new int[n];

for(int j=0; j<n; j++)

{

arr[j] = ((int)(Math.random()*(n-1)));

}

}

ArrayHandler()

{

arr = new int [0];

}

public void partitionArray() {

for (int i = 0; i < arr.length - 1; i++) {

for (int j = 0; j < arr.length - 1 - i; j++) {

if (arr[j] > arr[j + 1]) {

int temp = arr[j];

arr[j] = arr[j + 1];

arr[j + 1] = temp;

}

}

}

}

public void printArray()

{

for(int m=0;m<arr.length;m++)

{

System.out.print(arr[m]+ " ");

}

System.out.println();

}

public static void main(String[] args) {

ArrayHandler t = new ArrayHandler(25);

t.printArray();t.partitionArray();t.printArray();

 

}

 

}

댓글