6-1. 다음과 같은 멤버 변수를 갖는 SutdaCard 클래스를 정의하시오.
- int , num, 카드의 숫자(1~10사이의 정수)
- boolean, isKwang, 광이면 true 아니면 false
----------------------------------------------------------
class SutdaCard{
int num;
boolean isKwang;
public SutdaCard() {
num = (int)(Math.random()*10)+1;
}
}
----------------------------------------------------------
6-2. 문제 6-1에서 정의한 SutdaCard 클래스에 두 개의 생성자와 info()를 추가해서 실행 결과와 같은 결과를 얻도록 하시오.
----------------------------------------------------------
class SutdaCard{
int num;
boolean isKwang;
public SutdaCard() {
num = (int)(Math.random()*10)+1;
isKwang = true;
}
public SutdaCard(int num, boolean isKwang){
this.num = num;
this.isKwang = isKwang;
}
public String info(){
String result = "";
if(isKwang)
result = ""+num+"k";
else
result = ""+num;
return result;
}
}
public class ch06 {
public static void main(String[] args) {
SutdaCard card1 = new SutdaCard(3,false);
SutdaCard card2 = new SutdaCard();
System.out.println(card1.info());
System.out.println(card2.info());
}
}
----------------------------------------------------------
6-3. 다음과 같은 멤버 변수를 갖는 Student 클래스를 정의하시오.
- String, name, 학생이름
- int, ban, 반
- int, no, 번호
- int, kor, 국어점수
- int, eng, 영어점수
- int, math, 수학점수
----------------------------------------------------------
class Student{
String name;
int ban, no;
int kor, eng, math;
}
----------------------------------------------------------
6-4. 문제6-3에서 정의한 Student 클래스에 다음과 같이 정의된 두 개의 메서드 getTotal()과 getAverage()를 추가하시오.
1.
- 메서드명 : getTotal
- 기 능 : 국어, 영어, 수학의 점수를 모두 더해서 반환한다.
- 반환타입 : int
- 매개변수 : 없음
2.
- 메서드명 : getAveragel
- 기 능 : 총 점을 과목 수로 나눈 평균을 구한다. 소수점 둘째 자리에서 반올림할 것.
- 반환타입 : float
- 매개변수 : 없음
----------------------------------------------------------
class Student{
String name;
int ban, no;
int kor, eng, math;
public int getTotal(){
return kor+eng+math;
}
public float getAverage(){
return (int)((getTotal()/3f)*10+0.5f)/10f;
}
}
public class ch06 {
public static void main(String[] args) {
Student s = new Student();
s.name = "홍길동";
s.ban = 1;
s.no = 1;
s.kor = 100;
s.eng = 60;
s.math = 76;
System.out.println("이름 : "+s.name);
System.out.println("총점 : "+s.getTotal());
System.out.println("평균 : "+s.getAverage());
}
}
----------------------------------------------------------
6-5. 다음과 같은 실행 결과를 얻도록 Student클래스에 생성자와 info()를 추가하시오.
----------------------------------------------------------
class Student{
String name;
int ban, no;
int kor, eng, math;
public Student(String name, int ban, int no, int kor, int eng, int math){
this.name = name; this.ban = ban; this.no = no; this.kor = kor;
this.eng = eng; this.math = math;
}
public int getTotal(){
return kor+eng+math;
}
public float getAverage(){
return (int)((getTotal()/3f)*10+0.5f)/10f;
}
public String info(){
return name+","+ban+","+no+","+kor+","+eng+","+math+","+getTotal()+","+getAverage();
}
}
public class ch06 {
public static void main(String[] args) {
Student s = new Student("홍길동",1,1,100,60,76);
System.out.println(s.info());
}
}
----------------------------------------------------------
6-6. 두 점의 거리를 계산하는 getDistance()를 완성하시오.
[hint] 제곱근 계산은 Math.sqrt(double a)를 사용하면 된다.
----------------------------------------------------------
public class ch06 {
static double getDistance(int x, int y, int x1, int y1){
return Math.sqrt(Math.pow(Math.abs(x1-x), 2)+Math.pow(Math.abs(y1-y), 2));
}
public static void main(String[] args) {
System.out.println(getDistance(1, 1, 2, 2));
}
}
----------------------------------------------------------
6-7. 문제 6-6에서 작성한 클레스 메서드 getDistance()를 MyPoint 클래스의 인스턴스 메서드로 정의하시오.
----------------------------------------------------------
class MyPoint{
int x;
int y;
public MyPoint(int x, int y){
this.x = x;
this.y = y;
}
public double getDistance(int x1, int y1){
return Math.sqrt(Math.pow(Math.abs(x1-x), 2)+Math.pow(Math.abs(y1-y), 2));
}
}
public class ch06 {
public static void main(String[] args) {
MyPoint p = new MyPoint(1, 1);
System.out.println(p.getDistance(2, 2));
}
}
----------------------------------------------------------
6-8. 다음의 코드에 정의된 변수들을 종류 별로 구분해서 적으시오.
----------------------------------------------------------
class PlayingCard{
int kind;
int num;
static int width;
static int height;
PlayingCard(int k, int n){
kind = k;
num = n;
}
}
public class ch06 {
public static void main(String[] args) {
PlayingCard card = new PlayingCard(1, 1);
}
}
----------------------------------------------------------
- 클래스 변수 : width, height
- 인스턴스 변수 : kind, num
- 지역 변수 : k, n, card
6-9. 다음은 컴퓨터 게임의 병사(marine)를 클래스로 정의한 것이다. 이 클래스의 멤버 중에 static을 붙여야 하는 것은 어떤 것들이고 그 이유는 무엇인가? 틀림
(단, 모든 병사의 공격력과 방어력은 같아야 한다.)
----------------------------------------------------------
class Marine{
int x=0, y=0;
int hp = 60;
static int weapon = 6;
static int armor = 0;
static void weaponUp(){weapon++;}
static void armorUp(){armor++;}
void move(int x, int y){this.x = x;this.y = y;}
}
----------------------------------------------------------
-> 공격력과 방어력은 병사들의 공통 사항이므로 공용 변수의 특성을 가지게 하기 위해서 static으로 선언한다.
-> static변수에 대한 작업을 하는 메서드이므로 static으로 선언하여야 한다.
6-10. 다음 중 생성자에 대한 설명으로 옳지 않은 것은?(모두 고르시오)
- 모든 생성자의 이름은 클래스의 이름과 동일해야 한다.
- 생성자는 객체를 생성하기 위한 것이다.
- 클래스에는 생성자가 반드시 하나 이상 있어야 한다.
- 생성자가 없는 클래스는 컴파일러가 기본 생성자를 추가한다.
- 생성자는 오버로딩 할 수 없다.
6-11. 다음 중 this에 대한 설명으로 맞지 않은 것은?(모두 고르시오) 틀림
- 객체 자신을 가리키는 참조 변수이다.
- 클래스 내에 서라면 어디 서든 사용할 수 있다.
- 지역 변수와 인스턴스 변수를 구별할 때 사용한다.
- 클래스 메서드 내에서는 사용할 수 없다. (O)
-> 클래스 멤버(static이 붙은 변수나 메서드)에는 사용할 수 없다.
6-12. 다음 중 오버로딩이 성립하기 위한 조건이 아닌 것은?(모두 고르시오)
- 메서드의 이름이 같아야 한다.
- 매개변수의 개수나 타입이 달라야 한다.
- 리턴 타입이 달라야 한다.
- 매개변수의 이름이 달라야 한다.
6-13. 다음 중 아래의 add메서드를 올바르게 오버로딩 한 것은?(모두 고르시오)
- long add(int a, int b) { return a+b; }
- long add(int x, int y) { return x+y; }
- long add(long a, long b) { return a+b; }
- int add(byte a, byte b) { return a+b; }
- int add(long a, int b) { return (int)(a+b); }
6-14. 다음 중 초기화에 대한 설명으로 옳지 않은 것은?(모두 고르시오)
- 멤버 변수는 자동 초기화되므로 초기화하지 않고도 값을 참조할 수 있다.
- 지역 변수는 사용하기 전에 반드시 초기화해야 한다.
- 초기화 블럭보다 생성자가 먼저 수행된다.
- 명시적 초기화를 제일 우선적으로 고려해야 한다.
- 클래스 변수보다 인스턴스 변수가 먼저 초기화된다.
6-15. 다음 중 인스턴스변수의 초기화 순서가 올바른 것은?
- 기본값 - 명시적 초기화 - 초기화 블럭 - 생성자
- 기본값 - 명시적 초기화 - 생성자 - 초기화 블럭
- 기본값 - 초기화 블럭 - 명시적 초기화 - 생성자
- 기본값 - 초기화 블럭 - 생성자 - 명시적 초기화
6-16. 다음 중 지역변수에 대한 설명으로 옳지 않은 것은?(모두 고르시오)
- 자동 초기화되므로 별도의 초기화가 필요없다.
- 지역변수가 선언된 메서드가 종료되면 지역변수도 함께 소멸된다.
- 메서드의 매개변수로 선언된 변수도 지역변수이다.
- 클래스변수나 인스턴스변수보다 메모리 부담이 적다.
- 힙(Heap)영역에 생성되며 가비지 컬렉터에 의해 소멸된다.
6-17. 호출스택이 다음과 같은 상황일 때 옳지 않은 설명은?(모두 고르시오) 틀림
- peek [println] [method1] [method2] [main]
- 제일 먼저 호출스택에 저장된 것은 main메서드이다.
- println메서드를 제외한 나머지 메서드들은 모두 종료된 상태이다.
- method2메서드를 호출한 것은 main메서드이다.
- println메서드가 종료되면 method1메서드가 수행을 재개한다.
- main-method2-method1-println의 순서로 호출되었다.
- 현재 실행중인 메서드는 println뿐이다. (O)
-> 호출스택의 제일 위에 있는 메서드가 현재 수행중인 메서드이며, 호출스택 안의 나머지 메서드들은 대기상태이다.
6-18. 다음의 코드를 컴파일하면 에러가 발생한다. 컴파일 에러가 발생하는 라인과 그 이유를 설명하시오.
----------------------------------------------------------
class MemberCall{
int iv = 10;
static int cv = 20;
int iv2 = cv;
static int cv2 = iv; // 라인A
static void staticMethod1(){
System.out.println(cv);
System.out.println(iv); // 라인B
}
void instanceMethod1(){
System.out.println(cv);
System.out.println(iv); // 라인C
}
static void staticMethod2(){
staticMethod1();
instanceMethod1(); // 라인D
}
void instanceMethod2(){
staticMethod1(); // 라인E
instanceMethod1();
}
}
----------------------------------------------------------
라인A - 클래스 변수와 인스턴스 변수는 생성 시점이 다르므로 클래스 변수가 존재할 때 인스턴스 변수가 존재하지 않을 수 있다. 따라서 클래스 변수에 인스턴스 변수로 초기화 하는것을 금한다.
라인B - 클래스 메서드에서는 인스턴스 변수를 사용할 수 없다. 이유는 클래스 메서드는 객체 생성없이 사용 가능한 메서드이므로 이 메서드를 사용할 때 객체가 생성되지 않을 수 있으며 따라서 인스턴스 변수 또한 준비 되지 않았을 수도 있기에 사용을 금한다.
라인D - 클래스 메서드에서 인스턴트 메서드를 사용할 수 없다. 이유는 위와 같다.
6-19. 다음 코드의 실행 결과를 예측하여 적으시오.
----------------------------------------------------------
public class ch06 {
public static void change(String str){
str += "456";
}
public static void main(String[] args) {
String str = "ABC123";
System.out.println(str);
change(str);
System.out.println("After change: "+str);
}
}
----------------------------------------------------------
ABC123
After change: ABC123
6-20. 다음과 같이 정의된 메서드를 작성하고 테스트하시오.
[주의] Math.random()을 사용하는 경우 실행결과와 다를 수 있음.
- 메서드명 : shuffle
- 기능 : 주어진 배열에 담긴 값의 위치를 바꾸는 작업을 반복하여 뒤섞이게 한다. 처리한 배열을 반환한다.
- 반환타입 : int[]
- 매개변수 : int[] arr - 정수값이 담긴 배열
----------------------------------------------------------
public class ch06 {
public static int[] shuffle(int [] arr){
for(int i=0;i<100;i++){
int j = (int)(Math.random()*9);
int tmp = arr[0];
arr[0] = arr[j];
arr[j] = tmp;
}
return arr;
}
public static void main(String[] args) {
int[] original = {1,2,3,4,5,6,7,8,9};
System.out.println(java.util.Arrays.toString(original));
int[] result = shuffle(original);
System.out.println(java.util.Arrays.toString(result));
}
}
----------------------------------------------------------
6-21. Tv클래스를 주어진 로직대로 완성하시오. 완성한 후에 실행해서 주어진 실행결과와 일치하는지 확인하라.
[참고] 코드를 단순히 하기 위해서 유효성검사는 로직에서 제외했다.
----------------------------------------------------------
class MyTv{
boolean isPowerOn;
int channel;
int volume;
final int MAX_VOLUME = 100;
final int MIN_VOLUME = 0;
final int MAX_CHANNEL = 100;
final int MIN_CHANNEL = 1;
void turnOnOff(){
isPowerOn = !isPowerOn;
}
void volumeUp(){
if(volume < MAX_VOLUME)
volume++;
}
void volumeDown(){
if(volume > MIN_VOLUME)
volume--;
}
void channelUp(){
if(channel == MAX_CHANNEL)
channel = MIN_CHANNEL;
else
channel++;
}
void channelDown(){
if(channel == MIN_CHANNEL)
channel = MAX_CHANNEL;
else
channel--;
}
}
public class Ex6_21 {
public static void main(String[] args) {
MyTv t = new MyTv();
t.channel = 100;
t.volume = 0;
System.out.println("CH : "+t.channel+", VOL : "+t.volume);
t.channelDown();
t.volumeDown();
System.out.println("CH : "+t.channel+", VOL : "+t.volume);
t.volume = 100;
t.channelUp();
t.volumeUp();
System.out.println("CH : "+t.channel+", VOL : "+t.volume);
}
}
----------------------------------------------------------
6-22. 다음과 같이 정의된 메서드를 작성하고 테스트하시오.
- 메서드명 : isNumber
- 기능 : 주어진 문자열이 모두 숫자로만 이루어져있는지 확인한다. 모두 숫자로만 이루어져 있으면 true를 반환하고, 그렇지 않으면 false를 반환한다. 만일 주어진 문자열이 null이거나 빈문자열 “”이라면 false를 반환한다.
- 반환타입 : boolean
- 매개변수 : String str - 검사할 문자열
----------------------------------------------------------
public class Ex6_22 {
public static boolean isNumber(String str){
boolean result = true;
if(str.equals(null) || str.equals("")){
result = false;
}else{
for(int i=0;i<str.length();i++){
if(!(str.charAt(i) >= '0' && str.charAt(i) <= '9')){
result = false;
break;
}
}
}
return result;
}
public static void main(String[] args) {
String str = "123";
System.out.println(str+"는 숫자입니까? "+isNumber(str));
str = "1234o";
System.out.println(str+"는 숫자입니까? "+isNumber(str));
}
}
----------------------------------------------------------
6-23. 다음과 같이 정의된 메서드를 작성하고 테스트하시오.
- 메서드명 : max
- 기능 : 주어진 int형 배열의 값 중에서 제일 큰 값을 반환한다. 만일 주어진 배열이 null이거나 크기가 0인 경우, -999999를 반환한다.
- 반환타입 : int
- 매개변수 : int[]arr - 최대값을 구할 배열
----------------------------------------------------------
public class Ex6_22 {
public static int max(int[] arr){
int result = 0;
if(arr == null || arr.length == 0)
result = -999999;
else{
for(int i=0;i<arr.length;i++)
if(arr[i] > result)
result = arr[i];
}
return result;
}
public static void main(String[] args) {
int[] data = {3,2,9,4,7};
System.out.println(java.util.Arrays.toString(data));
System.out.println("최대값 : "+max(data));
System.out.println("최대값 : "+max(null));
System.out.println("최대값 : "+max(new int[]{}));
}
}
----------------------------------------------------------
6-24. 다음과 같이 정의된 메서드를 작성하고 테스트하시오.
- 메서드명 : abs
- 기능 : 주어진 값의 절대값을 반환한다.
- 반환타입 : int
- 매개변수 : int value
----------------------------------------------------------
public class Ex6_22 {
public static int abs(int value){
if(value < 0)
value *= -1;
return value;
}
public static void main(String[] args) {
int value = 5;
System.out.println(value+"의 절대값 : "+abs(value));
value = -10;
System.out.println(value+"의 절대값 : "+abs(value));
}
}
----------------------------------------------------------
'예전 포스팅 모음' 카테고리의 다른 글
[java] 제어자(modifier) (2) | 2014.08.12 |
---|---|
[java] 상속 & 오버라이딩 (0) | 2014.08.11 |
[C++] 생성자와 소멸자 (0) | 2014.08.04 |
[java] 객체지향 프로그래밍I 정리(클래스~초기화) (0) | 2014.08.01 |
[java] 단순 계산식 계산하기(Scanner, nextInt(), next().charAt()) (0) | 2014.08.01 |