카테고리 없음

2018.5.29(화) 예비시험

설총이 2018. 5. 29. 17:41

1. C/C++ 프로그램에서는 대소문자가 구별된다. 

   자바 프로그램은 어떠한가? 

구별된다


2. 클래스 이름은 명사형으로 붙이고 대문자로 시작하며 

   메소드 이름은 동사형의 소문자로 시작하는 관례가 있다. 

   반드시 지켜야 하는가?


지키지 않아도 이클립스내에선 돌아가지만, 내가 아닌 누가봐도 이건 클래스이름이구나, 메서드이름이구나 하고 프로그래머들끼리의 약속. 이해하기쉽게


3. 클래스 이름 정할때  지켜야할 규칙


첫글자는 대문자, 두단어이상이합치면 단어의 첫글자만 대문자,

특수문자 안됨. 시작을 숫자로 하면안됨. 


4. 변수란 무엇인가?

'하나의' 값을 저장하는 공간.

   

5. 자바에서 제공하는 기본 데이터형을 모두 나열하라. 

boolean byte short char int long float double


6. 2진수 "0 1 1 1 1 1 1 1"을 16진수,8진수, 10진수로 표현하라. 


정답 

16진수 : 네자리씩 끊어서 1,2,4,8 (16은안되니까)

0111 1111

8421 8421 -> 7F


8진수 :  세자리씩 끊어서 1,2,4씩 (8은 안되니까)

01 111 111

21 421 421 -> 177


10진수 : 127



7. 자바 언어에서 char형은 부호 없는 정수로 취급 될 수 있다.

   이때 최대값은 얼마가 되는가?


정답 => 2의 16승 - 1 =65,535 (부호 업는 정수는 0부터 양수부분만 해당)

 


8. double 형의 값을 float 형의 변수에 대입하려는 경우 

   에러가 발생한다. 발생하는 이유 와 수행시키는 방법은 무엇인가? 

보기) double d = 10.55555;

         float f = d;


답 => float f = (float)d; ::  큰타입의 double형에서 작은타입의 float로 갈때에는, 자동캐스팅이 되지않기때문에 반드시 명시해야한다



9. 상수의 선언을 위해 필요한 자바 명령어는 무엇인가?


답 => final  -> 참조변수는 전부 대문자.



10. 다음 문장을 수행한 후 i와 n이 가지는 값은 얼마인가? 

     int i = 10; 

     int n = i++ % 5;   


답 => i = 11

n = 0


%는 나머지값


11. 아래와 같은 명령행으로 프로그램을 실행하였을 때 결과는 무엇인가? 

     C:\>java TestJava 123 (빈공백이없기때문에 123이라는 값 하나를 넣어 Run한다는 의미)

     public class TestJava {

           public static void main(String args[]) {

                  System.out.println(args[1]);

          }

    }


내 답 => args[1]번이 출력된다


해답 =>  C:\>java TestJava 123 (빈공백이없기때문에 123이라는 값 '하나'를 넣어 Run한다는 의미)

근데 출력은 1번 인덱스라서 'array index out'인 에러가 발생한다.(인덱스는 0번부터 시작한다)




12. 다음 프로그램의 컴파일 결과를 예상하라. 

     class Test {

              static int a = 1;

              public static void main(String[] args) {

                        int a;

                        System.out.println(a);

              }

     }

내 답 => main안에 있는 int a; 는 안써도되는값

처음에 스테틱 올라갈때 올라감

1 출력되고 줄 바뀜


해답 => 메서드 안에서는 지역변수가 우선권을 가지기때문에, a를 출력하면 static int a가 아니라 메인 안에있는 int a를 읽는다.

지역변수 int a는 값이 없기때문에 출력할 수 없다



*13. 다음 프로그램에서 메소드 add()의 기능은 무엇인가? 출력 결과는 무엇인가? 

    class Test {

         public static void main(String args[]) {

          int[] x={0, '0', 'A', 'a'};

            System.out.println(add(x));

         }

         public static int add(int arr[]) {

            int x = -1;

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

                  x= x < arr[i] ? arr[i] : x;

            return x;

        }  

    }

내 답 => 'a'가 가지는 아스키코드표로 출력됨.


해답 => int[] x ={0,48,65,97}(작은 ''는 char타입이라 아스키코드표에 의해 숫자로 바뀌어야한다)

-1 < 0

0 < 48

48 < 65

65 < 97

위의 배열에 있는 값이 앞순서부터 꺼내서 덮어씌여지면서 마지막 x는 97이 된다.


14. 다음의 출력 결과를 생성하는 자바 프로그램을 반복문, 

    배열을 사용하여 각각 작성하라.


     *

     * *

     * * *

     * * * *

     * * * * *

  

답 => 반복문 


class Test{

public static void main(String args[]){


for(int i=0;i<5;i++){

       for(int j=0;j<i;j++){

        System.out.print("*");

    }

    System.out.println("*");

}


}

}


답 => 배열

  class Test {

         public static void main(String args[]) {

          String [] x={"*","**","***","****","*****"};

            for(int i = 0; i < x.length; i++){

System.out.println(x[i]);

}        

}

}


해답 => 생략




15. 다음 프로그램의 문제점을 지적하라. 

   final class First {

          private int a = 1;

          int b = 2;

   }

   class Second extends First {

         public void method() {

               System.out.println(a + b) ;

         }

   }


내 답 =>   1. final 클래스는 다른클래스의 조상이 될 수 없다.(확장이 될 수 없으니까)

추가 답 2. private int a를 자손 클래스에서 사용할 수 없다.



16. 다음 프로그램은 컴파일되지 않는다. 이유는 무엇인가? 

   public class Fred {

       public int x = 0;

       public fred (int x) {

           this.x = x;

       }

   }


내 답 => 객체화 하지 않아서 인스턴스가 메모리에 올라가지않는다


해답 => 컴파일 :: 클래스 생성

클래스는 Fred인데 밑에 fred가 클래스 이름과달라서 생성자가 아닌데, 리턴값도없다 (return , void)

생성자는 클래스 이름과 같아야한다. 메서드이면 void나 return이 들어가야한다.


17. 다음 프로그램의 출력 결과가 무엇인지 설명하라. 

   class Test {

       String s;

       public static void main(String[] args) {

           Test t = new Test();

           t.go();

       }

       void Test() {

            s = "constructor";

       }

       void go() {

            System.out.println(s);

       }

  }   


내 답 => 에러? 메서드는 쓰고나서 사라지기때문에, s에 저장되지않는다

 string s 는 참조형으로 주소 값이 저장되니까 null값이 나온다.


해답 => 리턴타입이 void이므로 두개다 메소드로 객체값에 올라간다.

String s는 값이 저장되지않았으니 기본형으로 null 



18. 다음 프로그램의 문제점은 무엇인가?

   protected class Fred {

          private int x = 0;

          private Fred (int xval) {

               x=xval;

          }

   }


내 답=> xval이란 값을 x에 저장해야하는데 Fred에 private가 있어 접근제어자가 걸려 들어올수가없다.


해답 => protected (X)


class 앞에 올 수 있는 접근제어자는 public이랑 생략할수있는 (default)값이다.

알고 있음에도 틀렸음. 제대로 기억하자



19. 다음 프로그램은 컴파일되지 않는다. 이유는 무엇인가?

   public class Test {

       int x; 

       public static void main (String args[]) {

            x = 8;

       }

   }


내 답=> int x 는 static이 붙지않은 인스턴스변수인데, 객체화가되지않으면 메모리상에 올라가질않는다

그래서 메인이 실행될때 x를 읽지못한다.


해답 => 스테틱에서 인스턴스 변수 x를 사용할 수 없다. 인스턴스변수는 메모리에 올라가지 않았기때문에.


20. 다음 프로그램의 실행 결과는 무엇인가? 

   class Test {

         int x;

         public Test(int x) {

this.x = x; 

}

   }

   public class Example {

         public static void main(String args[]) {

                Test x1 = new Test(10);

Test x2 = new Test(10);

                method(x1, x2);

                System.out.println(x1.x + ", " + x2.x);

         }

         public static void method(Test v1, Test v2) {

                v2.x = 20;

                v1=v2;

         }

   }


내 답=>  스테틱 정보가 먼저 로딩되기때문에, method(x1, x2); 가 먼저 올라가고


해답 => 10,20(노트에 19번)

method(x1, x2)는 v1 , v2에 들어가서 v1,v2가 가지는객체의 주소값이 x1,x2가 가지고있던 주소값을 공유한다.

v2.x는 v2=x2가 가지고있는 주소값의 x에 20을 저장했지만,

v1 = v2 는 v1에 v2가 가지고있는 주소 값을 주었다.




21. 조상 클래스에서 다음과 같은 메소드가 존재할 때,

    자손 클래스에서 오버라이딩을 못하게 하는것을 고르고 설명하라. 


a) final void methoda() {X} :: final 메서드는 오버라이딩할수없다    

b) final methoda() {X} :: final 메서드는 오버라이딩할수없다 .

c) static void methoda() {O}  

d) final abstract void methoda() {X} :: final 메서드는 오버라이딩할수없다


해답 = > a.

b. 생성자라 안된다.

d. 문법자체가 (X) final과 abstract 둘이 같이 쓸 수 없다.




22. 생성자에서 자신의 생성자를 호출 하는 명령어와 조상클래스 의 기본 생성자를 호출하는 명령어 와 주의점 을 쓰시오.


내답 => 클래스명(){} 

내답 => 조상클래스명(){} 단, 조상클래스에 매개변수값이 저장되어있다면, 자손클래스에서도 super(매개변수) 를 적어주어야한다.


해답 => this()

super()

클래스의 첫번째에만 가능. 두개 같이 쓰면 안됨.



23. 아래 프로그램에서 modify 메소드는 static 데이터 a의 값을, 인자로 전달되는 값만큼 증가시킨다. modify()메서드를 완성하고 출력 결과를 설명하라. 

    public class Test {

         private static int a=2;

         public static void main(String args[]) {

                modify(a);

                System.out.println(a);

         }

         public static void modify(int b) {

//....

         }

    }


내 답 => 


해답 =>  a+=b; (a라는 값을, b라는 인자로 전달되는 값만큼 증가시킨다)

결과 값은 4




24. 다음 프로그램의 실행 결과를 예상하라.

    class Super {

         int index = 5;

         public void printVal() {

              System.out.println("Super");

         }

    }

    class Sub extends Super {

         int index = 2;

         public void printVal() {

               System.out.println("Sub");

         }

    }

    public class Runner {

         public static void main(String[] args) {

                 Super sup=new Sub();

                 System.out.println(sup.index + " ");

                 sup.printVal();

         }

   }


내 답 => 5 (인스턴스를 출력할때는 참조변수를 따라간다)

      2 (메서드를 호출할때는 현재 인스턴스 Sub를 따라간다.)


해답 => sup.index 의 index는 변수기때문에 변수는 참조하고있는 Super 클래스를 따라가고,

sup.printVal(); 는 메서드를 호출하는것이기때문에, 메서드는 현재 인스턴스인 Sub를 따라간다.



25. 인터페이스의 특징과 사용방법에 대해 정의 하시오..


내 답 => 1.다중상속이 가능 2.class와 동일 3. 구현(implements)를 사용. 4. 추상메서드와 상수만 사용 가능

5. 추상메서드를 사용한다는건 반드시 오버라이딩을해야하기때문에 다양한 코드가 나올 수 있다.


사용방법 ::interface를 클래스처럼 적고, 



해답 => class와 동급, 상수와 추상메서드, 다중상속가능, 다중구현가능, 일반클래스에서 구현해서 쓴다.


interface A{

int method1(int i);

int method2(int j);

}

class B implements A{

  int method1(int i){return i;}

  int method2(int j){return j;}

}



26. 다음에 주어진 인터페이스를 구현하는 클래스 B의 가장 간단한 정의를 작성하라. 

     interface A {

          int method1(int i);

          int method2(int j);

     }


답 => class B implements A{

public void 

}



27. 클래스, 멤버변수, 지역변수 에서 사용가능한 제어자를 각각 쓰시오.


내 답 =>class : public (default) 

멤버변수 : public (default) protected private

지역변수 : 불가능l


해답 => class : public (default) protected private

멤버변수 : public (default) protected private static final

지역변수 : final




28.생성자에  대한 설명으로 옳지 않은 것은?

1.모든 생성자의 이름은 클래스의 이름과 동일하다.

2.생성자는 객체를 생성하기 위한 것이다.

3.클래스에는 생성자가 하나 이상 있어야 한다.

4.생성자가 없는 클래스는 컴파일러가 기본 생성자를 추가한다.

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


답 => 3,5


해답 => 2,5

생성자는 멤버를 초기화하기위함, 객체 생성은 new가 한다.(2번이 완전히 틀린 말은 아님. new뒤에 생성자를쓰기때문에)

오버로딩은 가능, 오버라이딩 X


29.this에 대한 설명으로 맞지 않는 것은?

a.객체 자신을 가르키는 참조변수이다.

b.클래스 내에서라면 어디서든 사용할 수 있다.

c.지역변수와 인스턴스 변수를 구별할때 사용한다.

d.클래스메서드(static메서드)내에서는 사용할 수 없다.


답 => a


해답 => b

d -> 스테틱메서드 내에서는 사용할 수 없다. (아직 객체가 생성되지 않았기때문에)



30.다음 중 아래의  add메서드를 올바르게 오버로딩 한 것은?

long add(int a, int b){return a+b;}


a.long add(int x, int y){return x+y;}

b.long add(long a, long b){return a+b;}

c.int add(byte a, byte b){return a+b;}

d.int add(long a, int b){return (int)( a+b);}


내 답 => a,b,c


해답 => a : 중복정의라서 안됨.

b : 가능

c : 가능

d : 가능


31.다음 중 지역변수에 대한 설명으로 옳지 않은 것은? 

a 자동 초기화되므로 별도의 초기화가 필요없다 .

b 지역변수가 선언된 메서드가 종료되면 지역변수도 함께 소멸된다.

c 매서드의 매개변수로 선언된 변수도 지역변수이다

d 클래스변수나 인 스턴스변수 보다 메모리 부담이 적다

e 힙 (heap) 영역에 생성되며 가비지 컬렉터에 의해 소멸된다.


내 답 => a,c


해답 => a, e

a -> 자동초기화 되지 않는다.

e -> 인스턴스 변수를 설명


32.다음 중 오버라이딩의 조건으로 옳지 않은 것은? 

a. 조상의 메서드와 이름이 같아야 한다

b. 매개변수의 수와 타입이 모두 같아야 한다.

c. 리턴타입이 같아야 한다

d  접근 제어자는 조상의 메서드보다 좁은 범위로만 변경할 수 있다.

e. 조상의 메서드보다 더 많은 수의 예외를 선언할 수 있다.


내 답 => d,e


해답 => d,e

d -> 넓은 범위로만 변경 가능

e -> 많은 수의 예외 선언 X, 같거나 작은수만 선언가능


추가) c -> 조상타입으로 캐스팅전환 가능



33.다음 중 접근 제어자에 대한 설명으로 옳지 않은 것은?

a. public은 접근제한이 전혀 없는 접근 제어자이다 .

b . ( default )가 붙으면 같은 패키지 내에서만 접근이 가능하다 .

c 지역변수에도 접근 제어자를 사용할 수 있다.

d. protected 가 붙으면,  같은 패키지 내에서도 접근이 가능하다 .

e. protected 가 붙으면 ,  다른 패키지의 자손 클래스에서 접근이 가능하다.


내 답 => c


해답 => c (접근 제어자를 사용할 필요없다)




34.다음 중 제어자 finaI 을 붙일 수 있는 대상과 붙였을 때 그 의미를 적은 것이다 .

옳지 않은 것은? (모두 고르시오)

a. 지역변수 - 값을 변경할 수 없다.

b. 클래스 - 클래스에 새로운 멤버를 추가할 수 없다 .

c .메서드 - 오버로딩을 할 수 없다.

d. 멤버변수 - 값을 변경할 수 없다


내 답 => b (가능하다) 


해답 => c. 오버라이딩을 할 수 없다.




35. 오버로딩 과 오버라이딩의 차이점은 무엇인가?


내 답 => 오버로딩 :: 새로운 메서드를 정의한다 => new

오버라이딩 :: 상속받은 메서드를 현재 객체에 맞게 변경하는것 => toString


해답 = > 오버로딩 :: 같은 클래스내에서 같은 이름의 새로운 메서드를 생성

  오버라이딩 :: 상속받은 메서드에 구현물을 재 정의한다.



36.각각의 메서드  특징, 호출 방법 서술하시오.



내 답 => 클래스메서드(static메서드) :: static이 붙은 메서드는 시작할때 바로 로딩된다.

인스턴스 메서드 :: 객체화 했을때 호출가능

추상메서드 :: 오버라이딩으로 호출가능

파이널메서드 :: 고정돼있는 값..?


해답 => 클래스메서드 :: 프로그램 시작후 바로 로딩된다.// 클래스명.호출

인스턴스 메서드 :: 객체 생성 후 // 참조변수.메서드명

추상메서드 :: 일반 클래스에서 상속받아서 // 오버라이딩

파이널 메서드 :: 오버라이딩 불가능. 





37.상속이란 무엇인지, 상속이 되지않는 클래스의 멤버는 무엇인지 서술하시오.

 

내 답 => abstract :: 메서드인데 선언만하고 바디가 없는애

멤버 :: ?



해답 => 상속 :: 기존의 클래스를 가지고 새로운 클래스를 만들때 둘간의 관계를 상속으로 가져서 기존의 클래스를 물려받는것


생성자 초기화 블럭이 상속 X




38-40. 멤버변수와 생성자, 메소드를 가지는 Car 클래스를 작성하시오

*클래스 이름  : Car

*멤버변수 : protected int speed //자동차 속도

    protected String name //자동차 이름


*생성자  작성

-모든 멤버변수를 0 또는 null 로 초기화 하는 생성자

-자동자의 이름을 매개변수로 받아 초기화 하는 생성자

*메소드 작성

메소드명 리턴타입 매개변수 접근제어 용도

speedUp    void    없음   public 자동차 속도 1증가

speedDown    void    없음   public 자동차 속도 1감소

stop    void    없음   public 자동차 속도 0으로설정

display    void    없음   public 자동자의 이름과 속도 출력


class Car{

protected int speed;

protected String name;

Car(){

this.speed = 0;

this.name = null;

}

Car(String name){

this.name = name;

}

public void SpeedUp(){

this.speed = this.speed + 1; }

public void SpeedDown(){

this.speed = this.speed - 1 ;}

public void stop(){

this.speed = 0;}

public void display(){

System.out.println(name);

System.out.println(speed);

}


}




39. 위 38번에서 작성한 Car 클래스를 상속받는 Taxi 클래스 작성 

*클래스 이름 : Taxi

*멤버변수 : private int charge //택시요금

  private boolean fare //할증여부

  private String company //택시회사이름

*생성자

- 택시회사 이름을 매개변수로 받아 초기화하는 생성자


*메소드 작성

메소드명 리턴타입 매개변수 접근제어 용도

accounts   void 없음           public 요금계산(속도 *10 , 할증시 속도*12)

setFare           void          boolean   public 할증여부 설정

display   void 없음   public 택시회사이름, 요금, 할증여부 출력



답 => class Taxi extends Car{

private int charge;

private boolean fare;

private String company;

Taxi(String name){

this.name = name;

}

public void Account(){

}

public void setFare(boolean fare){

}

public void display(){

}


}

40. 위 39번의 Taxi 클래스 객체를 생성하여, 할증을 설정하고, 속도를 2까지 올린 상태에서 요금을계산하시오

*객체생성시 택시회사 이름은 "서울택시" 라고 설정한다.

  public static void main(String[] args){


Taxi t = new Taxi("서울택시");

}


38 해답


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Car{
    protected int speed;    //자동차 속도
    protected String name;    //자동차 이름
    
    Car(){}
    Car(String name){this.name = name;}
    
    //접근제어자 리턴타입 이름(매개변수){기능}
    
 
    public void SpeedUp() {
        this.speed = this.speed + 1;
    }
 
    public void SpeedDown() {
        this.speed = this.speed - 1;
    }
 
    public void stop() {
        this.speed = 0;
    }
 
    public void display() {
        System.out.println(speed+name);
    }
 
}
 
 
cs


39 해답


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Taxi extends Car {
    private int charge; // 택시요금
    private boolean fare; // t: 할증, f:할증 아님
    private String company; // 택시회사이름
 
    Taxi(String company) {
        this.company = company;
    }
 
    public void Account() {
        if (fare == true) {
            this.charge = this.speed * 10;
        } else
            this.charge = this.speed * 12;
    }
 
    public void setFare(boolean fare) {
        this.fare = fare;
    }
 
    public void display() {
        String fare_s = "할증";
        if (!fare) {
            fare_s = "아님";
        }
        System.out.println("택시회사이름 : " + company);
        System.out.println("요금 : " + charge);
        System.out.println("할증여부 : " + fare);
    }
}
cs


(40)


1
2
3
4
5
6
7
8
9
10
public class TexiTest {
    public static void main(String[] args) {
        Taxi t = new Taxi("서울택시");
        t.setFare(true);
        t.SpeedUp();
        t.SpeedUp();
        t.Account();
        t.display();
    }
}
cs


(38-40)총 해답 =>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
class Taxi extends Car {
    private int charge; // 택시요금
    private boolean fare; // t: 할증, f:할증 아님
    private String company; // 택시회사이름
 
    Taxi(String company) {
        this.company = company;
    }
    
    public void Account() {
        if (fare == true) {
            this.charge = this.speed * 10;
        } else
            this.charge = this.speed * 12;
    }
 
    public void setFare(boolean fare) {
        this.fare = fare;
    }
    
    public void display() {
        String fare_s = "할증";
        if(!fare) {
            fare_s = "아님";
        }
        System.out.println("택시회사이름 : "+company);
        System.out.println("요금 : " + charge);
        System.out.println("할증여부 : " + fare);
    }
    
    
}
 
class Car{
    protected int speed;    //자동차 속도
    protected String name;    //자동차 이름
    
    Car(){}
    Car(String name){this.name = name;}
    
    //접근제어자 리턴타입 이름(매개변수){기능}
    
 
    public void SpeedUp() {
        this.speed = this.speed + 1;
    }
 
    public void SpeedDown() {
        this.speed = this.speed - 1;
    }
 
    public void stop() {
        this.speed = 0;
    }
 
    public void display() {
        System.out.println(speed+name);
    }
 
}
    
 
 
 
public class TexiTest {
    public static void main(String [] args) {
        Taxi t = new Taxi("서울택시");
        t.setFare(true);
        t.SpeedUp();
        t.SpeedUp();
        t.Account();
        t.display();
    }
 
}
 
 
cs