IT 면접족보/자바 면접족보

자바 면접 족보 정리(9일 차 )

낙산암 2020. 12. 7. 06:29

클래스패스, 접근제한자, 패키지

1.set classpath 에 대하여 설명하시오.

classpath

 

자바 가상머신의 클래스 탐색 경로

 

새로운 폴더를 만들고 그 안에 클래스 파일을 옮겨 넣게 되면 그 클래스의 인스턴스를 생성하려고 할 때 경로를 찾지 못해 에러가 발생한다. 그래서 이 때 **경로를 찾을 수 있도록** claasspath를 설정 해야 한다.

 

set classpath

 

클래스 탐색 경로 설정

 

cmd(터미널)에서 **set classpath**명령어를 통해 새로 만든 폴더에 있는 파일의 경로를 찾을 수 있도록 설정 해주면, 정상적으로 클래스 파일을 찾아 그 클래스의 인스턴스를 생성할 수 있게된다.

 

cmd(터미널)에서 set classpath 실행 방법

 

set classpath=.; 뒤에 절대경로, 혹은 상대경로를 추가하면된다.

 

C:\PackageStudy>**`set classpath=**.;`C:\PackageStudy\MyClass

 

. (): 현재디렉토리

;(세미콜론) 줘서 100개의 경로를 추가할 수 도 있다.

2.절대경로와 상대경로에 대하여 설명하시오.

루트 디렉토리를 시작으로 지정한 절대 경로

C:\PackageStudy>set classpath=.;C:\PackageStudy\MyClass

 

- 클래스 패스를 절대 경로로 고정시키면?

**현재 디렉토리를 기준으로 지정한 상대 경로

 

C:\PackageStudy>set classpath=.;.\MyClass

 

. (): 현재디렉토리

 

일반적으로 현재 디렉토리를 기준으로 경로를 지정한다.

이클립스를 새로 깔거나, 다른 곳에 옮겨서 사용하거나 파일을 옮기는 경우 등, 상위 폴더 자체의 경로가 변경 되는 경우가 있기 때문에, 절대 경로를 지정하면 경로를 찾지 못하는 상황이 당연히 발생하게 된다. 그렇기 때문에 일반적으로 상대 경로로 지정을 한다.

3. . 과 .. 의 차이는?

. 현재디렉토리, .. 이전 디렉토리

 

 

>cd . //현재 디렉토리로 이동

>cd.. //이전(한단계 상위) 디렉토리로 이동

>cd java_area //java_area로 이동

 

//cd (change directory) : 명령창의 디렉토리 변경(이동) 명령어

//위의 명령어, 옵션은 windows, linux 동일함

 

4.package의 용도는?

실제 업무에서는 자신이 만들지 않은 클래스 파일을 사용하는 경우가 많은데, 이 때 만들어진 클래스들의 이름이 겹치는 일이 충분히 발생할 수 있다. 기본적으로 같은 이름의 클래스 파일을 같은 폴더에 둘 수 없기 때문에 다른 package를 사용하면 같은 이름을 가진 클래스 파일을 사용해야 하는 경우 다른 폴더에 저장되기 때문에 별도로 관리할 수 있다.

 

공간: 동일 이름의 클래스 파일을 같은 위치에 둘 수 없다. // Circle.java Circle.java

접근방법: 인스턴스 생성 방법에서 두 클래스에 차이가 없다. // Circl circle = new Circle();

 

공간적, 접근적 충돌 해결을 위한 패키지 선언

클래스 접근 방법의 구분 - 서로 다른 패키지의 두 클래스는 인스턴스 생성 시 사용하는 이름이 다르다.

 

// com.bit.Circle... com.bat.Circle...

클래스의 공간적인 구분 - 서로 다른 패키지의 두 클래스 파일은 저장되는 위치가 다르다.

// com > bit > Circle.java com > bat > Circle.java

5.package 의 기본적인 명명법(이름짓는법)은?

- 기본적으로 회사의 도메인을 뒤에서부터 작성(www는 제외: 전세계 공통)하고 마지막은 팀 이름 또는 프로젝트 이름을 작성한다.

- 구분은 점(.)으로 한다.(폴더가 생성되는 단위)

예시) com.bit.class4 , com.oracle.팀 이름 o r프로젝트 이름 (www.oracle.com)

6.정보은닉에 대하여 설명하시오.

Java는 객체지향 언어! (반대는 절차지향 언어(c언어))**

 

객체지향 언어의 특징

1) 정보은닉 information hiding 2) 상속 inheritance

3) 다형성 polymorphism (중요! 70%) 4) 캡슐화 encapsulation

(+ 추상화 abstraction)

 

정보 은닉을 하지 않고 프로그램을 만들어 사용자에게 제공했을 때, 사용자가 클래스의 데이터에 직접적으로 접근했으나(예를 들어 논리적 오류를 가진 값을 대입하는 등으로) 에러가 발생하지 않고(컴파일 오류가 발생하지 않고)프로그램이 실행되어 원래의 프로그램의 의도와 전혀 다른 결과가 도출되는 문제가 생길 수 있다. (이것은 프로그램을 잘못 만든 것이긴 함.)

 

이런 문제들을 방지하기 위해서 접근 제한자를 이용해 외부에서의 직접적인 접근 권한을 제한하고 기능(메소드)을 통해 간접적으로 접근하도록 유도하는 것이다. (그래야 논리적 오류를 가진 값 등을 가지고 접근할 때 컴파일 오류로 이어지도록 만들 수 있다.)

 

정보은닉의 기본 원칙에 따라 인스턴스 변수는 public으로, 인스턴스 변수에 접근하기 위한 메소드 들은 public으로 선언하는 것이 관례이다.

7.접근제한자 4가지 종류에 대하여 설명하시오.

public > protected > default > private

 

각각의 접근 제한자는 변수, 메소드, 클래스의 접근 권한을 제한하기 위해서 사용되며, 변수, 메소드, 클래스 **이름의 맨 앞에 해당 키워드를 붙여 사용한다. (default는 아무것도 안붙임)

 

public

 

- 모든 파일에서 접근 가능, 어디서든 인스턴스 생성이 가능하다.

- private으로 선언된 데이터를 외부에서 활용하기 위해 getter, setter 같은 함수를 public으로 선언해서 사용한다.

- public 클래스는 **외부에 노출시키기 위한 클래스이다

- 사용 예시: public static void main(String[] args){}

 

default

 

- 동일 패키지로 묶인 클래스 내에서만**(같은 패키지 내에서만) 접근이 가능하고, 인스턴스 생성을 허용한다.

- 이름 앞에 접근제한자를 붙이지 않으면** defalut이다.

 

= 아무 선언도 하지 않은것, **default는 키워드가 아니다.**

 

- 사용 예시: class Circle { ... } /

 

protected

- 다른 패키지에 있더라도 상속받은 클래스에서는** 접근 가능하다. (아직 안배움)

private

 

- 같은 클래스 내에서만 접근 가능하다.

- 데이터를 private으로 선언하고 끝냈을 때 의미가 있는 경우도 있지만, 외부에서 접근해서 쓸 수 있어야 하기 때문에 값을 가져가기 위한 getter, 값을 저장 수정하기 위한 setter함수를 public으로 선언해서 사용한다.

접근 제한자 구분



8.class 에서 붙일수 있는 접근 제한자 2개를 설명하고, 해당 접근제한자의 사용 목적은?

클래스 정의 대상: public, default (class앞에 아무것도 안 붙인것이 default) 인스턴스 변수와 메소드 대상: public, protected, default, private (4가지 모두)

 

public

 

- 모든 파일에서 접근 가능, 어디서든 인스턴스 생성이 가능하다.

- public클래스는 외부에 노출시키기 위한 클래스이다.

 

= 열어보지 않아도 파일 이름만으로 내용을 유추할 수 있어야한다.

= 하나의 소스코드에는 하나의 public 클래스만 만들 수 있다.

= public 클래스의 이름은 .java의 이름과 동일해야한다.

 

 

public class AAA{ //파일의 이름은 public클래스이기 때문에 AAA.java여야만 함

...

}

 

default

 

-  패키지로 묶인 클래스 내에서만(같은 패키지 내에서만) 인스턴스 생성을 허용한다.

- 이름 앞에 접근 제한자를 붙이지 않으면 defalut이다. (= 아무 선언도 하지 않은 것, **default는 키워드가 아니다.**)

 

class ZZZ{ //.java 파일이름을 ZZZ외에 다른것으로 정하는 것도 가능함

...

}

 

9.가위, 바위, 보 게임 작성하시오.

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
import java.util.Scanner;
 
public class RspMain {
    
    public static void main(String[] args) {
         
        while (true) {
            System.out.println("가위, 바위, 보 중 하나를 입력하세요.");
 
            Scanner scanner = new Scanner(System.in);
            String myAnswer = scanner.next();
 
            RockScissorsPaper game = new RockScissorsPaper(myAnswer);
            game.getResult();
 
            System.out.println("계속하시겠습니까?(Y/N)");
            char yesOrNo = scanner.next().charAt(0);
            if (yesOrNo == 'y' || yesOrNo == 'Y') {
                continue;
            } else 
                break;
            
        }
        System.out.println("프로그램을 종료합니다.");
    }
 
}
 
public class RockScissorsPaper {
    private int com;
    private String me;
 
    public RockScissorsPaper(String myAnswer) {
        this.me = myAnswer;
    }        
 
    public void getResult() {
        com = (int) (Math.random() * 3 + 1);
 
        if (com == 1) {
            System.out.println("가위");
        }
        else if (com == 2) {
            System.out.println("바위");
        }
        else {
            System.out.println("보");
        }
 
        if ((me.equals("가위")) && (com == 1)) {
            System.out.println("비겼습니다.");
        } else if ((me.equals("가위")) && (com == 2)) {
            System.out.println("졌습니다.");
        } else if ((me.equals("가위")) && (com == 3)) {
            System.out.println("이겼습니다.");
        } else if ((me.equals("바위")) && (com == 1)) {
            System.out.println("이겼습니다.");
        } else if ((me.equals("바위")) && (com == 2)) {
            System.out.println("비겼습니다.");
        } else if ((me.equals("바위")) && (com == 3)) {
            System.out.println("졌습니다.");
        } else if ((me.equals("보")) && (com == 1)) {
            System.out.println("졌습니다.");
        } else if ((me.equals("보")) && (com == 2)) {
            System.out.println("이겼습니다.");
        } else {
            System.out.println("비겼습니다.");
        }
    }
}
 
 
 
 

 

10. 아래와 같이 계산기 프로그램을 작성하시오.

 

10 + 9 // 입력을 한칸씩 띄우도록 할것

10 + 9 = 19 계속하시겠습니까?

10 - 7 10 - 7 = 3 계속하시겠습니까?

 

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
import java.util.Scanner;
 
public class CalculatorMain {
 
    public static void main(String[] args) {
        int num1, num2;
        char operator;
        
        Scanner scanner = null;
        while(true) {
            scanner = new Scanner(System.in);
            
            System.out.println("계산하려는 식을 입력하세요.(예시:1 + 1)");
            num1 = scanner.nextInt();            
            operator = scanner.next().charAt(0);        
            num2 = scanner.nextInt();
        
            
            Calculator myCalculator = new Calculator(num1, operator, num2);
            myCalculator.operation();
            
            System.out.println("계속하시겠습니까?(Y/N)");
            char yesOrNo = scanner.next().charAt(0);
            if( (yesOrNo == 'y'|| (yesOrNo == 'Y') ) {
                continue;
            }else if( (yesOrNo == 'n'|| (yesOrNo == 'N')) {
                break;
            }else {
                System.out.println("다시 입력해주세요.");
                yesOrNo = scanner.next().charAt(0);
            }
        }
        System.out.println("프로그램을 종료합니다.");
 
    }
}
 
public class Calculator {
    private int num1, num2,result;
    private char operator;
 
    public Calculator(int num1, char operator, int num2) {
        this.num1 = num1;
        this.num2 = num2;
        this.operator = operator;
    }
    
    public void operation() {
        
        if(operator == '+') {
            result = num1 + num2;
            System.out.println(num1 + " + " + num2 + " = " + result);
        }else if(operator == '-') {
            result = num1 - num2;
            System.out.println(num1 + " - " + num2 + " = " + result);
        }else if(operator == '*'|| operator == 'x') {
            result = num1 * num2;
            System.out.println(num1 + " * " + num2 + " = " + result);
        }else if(operator == '/') {
            result = num1 / num2;
            System.out.println(num1 + " / " + num2 + " = " + result);
        }else if(operator == '%') {
            result = num1 % num2;
            System.out.println(num1 + " % " + num2 + " = " + result);
        }
    }
}