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

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

낙산암 2020. 12. 4. 16:58

1. 키워드란 무엇인가?

자바는 예약어인 키워드들을 가지고있다. 키워드는 변수나, 메소드, 클래스, 식별자의 이름으로 사용될 수 없다.

 

우리가 아는 8개의 자료형 boolean, char, byte, short, int, long, float, double 도 여기에 포함되며, 상수를 나타내는 final, 메인함수에 사용되는 public, static, void 그리고class , if, for, while, else 등등 이 있다.

 

- 여기에서 더 많은 Java 키워드를 확인해 볼 수 있다.

 

2. 2의 보수법이란?

 

- 보수(complement)란 두 수의 합이 진법의 밑수가 되게 하는 수를 말한다. (10진수에서 6의 보수는 4, 7의 보수는 3)

- 컴퓨터에서는 음의 정수를 표현하기 위해서 2의 보수법을 사용한다.

 

2의 보수는 양수 2진수의 1의 보수를 구한 뒤 거기에 1을 더해 음수를 표현하는 방법을 말한다. 이 때 8비트를 넘어가는 맨 앞자리의 수는 전산적으로 버려주게 된다.

 

이진수의 1의보수는 비트를 반전시켜 얻을 수 있다. (01, 10)

3.컴퓨터에서 음의 정수 표현 방법에 대하여 설명하시오.

1) 맨 앞에 부호 비트를 1비트 사용한다. (**0 양수, 1 음수)

하지만 +25-25를 더했을 때 0이 나와야 하는데 부호 비트만 바꾸면 0이 나오지 않는다는 문제가 생긴다. 그래서 2의 보수법이 사용되기 시작했다.

 

2) 2의 보수법 사용(1의보수 +1 :맨 앞은 자동으로 부호 비트가 맞춰짐)

 

int num1 = -10;

 

1. 10에대한 2진수의 2의보수가 num1에 들어간다.

2. 메모리에 32개 방을 만든다.(int, 4byte = 32bit)

3. 102진수로 바꾸고 1의 보수를 구한 후 1을 더해(2의 보수를 구함)

4. num1에 들어간다.

4. -5의 컴퓨터 에서의 2진수 값을 나타내시오.

-52진수 값은 2의 보수법에 의해 구한 결과로 '11111011'이 나온다.

계산방법은 다음과 같다.

 

00000101

+51의 보수: 11111010

1을 더함(+52의 보수): 11111011

 

+5 : 00000101

-5 : 11111011

0 : 00000000

 

5. 실수에서 오차가 생기는 원인은 무엇인가?

 

실수는 두 실수 사이에는 무한대의 실수가 존재한다는 특성이 있다. 01 사이에도, 00.5 사이에도, 00.1 사이에도 무한대의 실수가 존재한다.

 

하지만 컴퓨터에 연산을 위해서는 무한한 실수를 유한한 메모리에 올리는 과정이 필수적이다. 그래서 실수 전체를 다 담을 수 없기 때문에 실수의 범위를 정해서 최대값과 최소값을 주고 그 사이에 표현할 수 있는 값을 미리 지정해 두고 근사값으로 사용한다. 예를 들면 double (-10^324~10^308) 의 범위가 정해져 있다.

 

그렇기 때문에 실수에는 오차가 존재할 수 밖에 없다.

 

6. 실수의 표현법(고정소수법, 부동소수법)을 설명하시오.

 

정수를 이진수로 표현하는 방법과 실수를 이진수로 표현하는 방법이 판이하게 다르기 때문에 정수와 실수의 데이터 타입을 나눌 수 밖에 없다.

 

고정소수점

 

: 소수점이 고정되어 있다는 의미이다.

1.0124,0.5421, 0.1234, 0.1234, 0.2648

 

부동소수점

 

: 소수점이 떠다닌다는 의미이다.

1.123x10^-1, 1.234x 10^-2, 0.1 1x10^-1, 0.001 1x10^-2 .....

3.4e3 -> 3.4 x10^3 (부동소수점) = 3400.0

3.4xe-3 -> 3.4x10^-3 (부동소수점) = 0.0034

 

7. 정밀도란 무엇인가요?

float f = 0.123456f; //값을 입력 시에는 소수점 이하 6자리 정밀도 표현가능

double d = 0.123456789012345; //값을 입력 시에는 소숫점이하 15자리까지 표현가능

 

하지만 둘 이상의 실수 연산을 실행하면 소수점 이하 셋째 자리에서도 오차가 발생할 수 있다.

사용 가능한 용량만큼 정밀도를 보장해준다. (정밀도를 낮추고 표현 가능한 양을 늘림)

 

반드시 프로그램 전에 소수점 몇 째 자리에서 반올림 할지 실무에서는 협의 해야 한다. (확답을 반드시 받아야 함)

 

8. 상수란 무엇이며 변수와의 차이는?

 

변수(variable)는 변하는 수로 프로그램 중에 값이 계속 바뀔 수 있는 수인 반면에 상수는 (constant) 한번 할당된 값이 변하지 않는 수를 말한다.

 

특히 final double PI = 3.141592 처럼 이미 만들어진(정해진) 값이 있어서 누군가 중간에 값을 변경시키면 안되는 것들에 반드시 상수를 사용해야 한다.

 

###특징

 

- 값을 딱 한 번만 할당할 수 있다.

- 한 번 할당된 값은 변경이 불가능하다.

- 키워드 final 선언이 붙는다.

 

### **상수 이름 지을 때 주의할 점**

 

- 상수의 이름은 모두 대문자로 짓는다.

- 둘 이상의 단어로 만들 때에는 언더바(_)로 연결한다. (snake 표기법)

 

- 상수 예시 01 : 상수 이름과 초기화

- 상수 예시 02 : 반지름의 넓이가 10인 원의 넓이를 구하는 프로그램

 

9. 초기화란 무엇인가?  

변수의 초기화의 의미는 해당 변수에 처음으로 값을 넣는 것이다.

변수의 경우 초기화 이후에 값을 넣어 변화시킬 수 있으나, 상수는 초기화 이후 값을 넣거나 변경시킬 수 없다.

 

//변수의 선언과 초기화 예시

int a = 1; //변수의 선언과 동시에 초기화

char ch = 'a'; //변수의 선언과 동시에 초기화

 

int b; //변수의 선언

b = 5; //초기화

 

//상수의 선언과 초기화 예시

final int MAX_SIZE = 100; //상수의 선언과 동시에 초기화

final char CONST_CHAR = ''; //상수의 선언과 동시에 초기화

 

final int CONST_ASSIGNED; //상수의 선언

CONST_ASSIGNED = 12; //상수의 초기화

 

CONST_ASSIGNED = 30; //에러. 상수는 한번만 값을 할당할 수 있다.

10. 리터럴이란 무엇인가요?

리터럴(Literals) 자료형을 기반으로 표현이 되는 상수를 말한다.

 

 

int num = 5 + 7; //57'정수형 리터럴'

double num2 = 3.3 + 4.5; //- 3.3 4.5'실수형 리터럴'

char ch = 'A' //A'문자형 리터럴'

 

 

위에서 57, 3.3, 4.5 모두 연산을 위해서 CPU로 보내기 위해 메모리에 올리는 과정이 동반된다. 그렇기 때문에 57int형으로 4byte의 메모리 공간을 할당받게 되고 3.34.5double형으로 8byte의 메모리 공간을 할당받게 된다. 이렇게 메모리 공간을 확보한 정수와 실수 모두는 메모리 공간에 값이 기록되면 값이 변하지 않기 때문에 리터럴 이라고 표현한다.

 

(리터럴이라는 표현은 상수라는 표현으로 대신하는 경우가 많다.)

 

- 참고

 

정수형 리터럴(예시)

 

 

//long- L 써야함

long l = 3147483647L;

 

sysotu(3147483647 + 3147483647);

//=> integer number too large 오류메세지 출력

 

//이진수로 넣으려면 -OB또는 ob붙여서 이진수 표현

byte seven = 0B111; //10진수로 7

int num205 = 0B11001101;

 

//원하는 위치에 언더바를 넣을 수 있다.

//언더바는 가독성을 위해 넣어주는 것일 뿐, 아무 영향이 없다.

int num = 100_000_000;

int num = 12_34_56_78_90;

 

실수형 리터럴(예시)

 

sysout(3.0004999 + 2.0004999);

sysout(3.0004999D + 2.0004999d);

//실수는 기본 double형이다. double임을 명시하기 위해 d또는D삽입 (안넣어도 됨)

 

sysout(3.0004999F + 2.0004999f);

//실수형 상수를 float형으로 표현하려면 fF삽입 (!)

 

Boolean, 문자형 상수 (예시)

true false: 부울형 상수 (boolean)

 

'' '' 'A' 문자형상수

11. 아래의 내용이 에러가 나는 이유와 수정 방법은?

System.out.println(3147483647 + 3147483648); //에러남

 

//수정방법

System.out.println(3147483647L + 3147483648L);

 

정수 리터럴은(3147483647 : 이것도 리터럴) 기본적으로 4byte으로 잡는다.(int) 여기서는 이미 연산 전의 정수 리터럴이 int의 범위를 넘었다.

 

리터럴 상수에서 숫자 뒤에 L(소문자l도 상관없음)붙이면 long(8byte)으로 인식해서 long형 상수로 표현해 달라고 요청 하는 것이다.

 

12.자동 형변환과 명시적 형변환에 대하여 설명하시오.

 

**형 변환(casting)

 

자료형 변환의 의미와 필요한 이유는 기본적으로 연산 시킬때 두 데이터 타입이 일치해야 하기 때문이다. (반드시 같아야 한다. 맞춰야 한다.)

 

형변환은 (자료형크기x 범위o)크고/소수점 보존하는 방향으로 이루어진다.

 

int num1 = 50;

long num2 = 3147483647L //<-21억넘음

 

sysout(num1+num2); //num1에 저장된 값이 long형으로 형 변환된다. (자동형변환)

 

두 피연산자 자료형이 일치하지 않을 때 형 변환으로 일치 시켜야 한다. 자동으로 오류 없이 컴파일 된다면 어느 한쪽으로 자동 형 변환이 일어난 것이다. 정수와 정수의 연산 에서는 데이터 타입이 큰 쪽으로 맞춘다.(int 보다 작은 데이터 타입은 다 int로 바꾼다.)

 

강제 형 변환을 하게 될 경우에는 값을 자른다. 자를 때는 앞 부분을 삭제하고 뒤에 있는 바이트가 사용된다.

 

자동형변환(Implicit Conversion)

 

자동 형변환 

자동 형 변환은 자료형의 크기가 일치하지 않지만 강제로 변환하지 않아도 묵시적으로 형 변환이 되는 것을 말한다. 자동 형 변환은 작은 데이터 타입이 큰 쪽으로 변경되거나, 정수형이 실수형으로 변하는 것만 가능하다.

 

규칙

 

1) 자료형 크기가 큰 방향으로 형변환 일어남

2) 자료형 크기에 상관없이 정수 자료형보다 실수 자료형 우선(소수점 보존)

원래의 값을 최대한 보존하는 쪽으로 형변환한다.

 

long num1 = 3; //4 byte

float num2 = 22.1f; //8byte

 

Sytem.out.print(num1+num2);

```

 

이 경우 float형으로 자동형변환이 일어남

 

1) float이 적은 메모리에 더 많은 수를 표현 가능함(범위가 더 넓다)

2) 소수점을 보존하기 위해서

 

명시적형변환(Explicit Conversion) : 강제적 형변환

 

자동형변환 규칙에 부합하지 않지만 형변환이 필요한 상황이면 명시적으로 형변환을 진행한다.

 

이 경우는 데이터가 큰 타입을 작은 타입으로 형 변환을 하는 것도 가능하지만, 실제 데이터의 변형이 일어날 수 있기 때문에 주의해야한다.

 

//명시적 형변환 예시

 

double pi = 3.12415;

int wholeNumber = (int)pi; //정수형 소수점 버리고 결과값은 3

 

short num1 = 1;

short num2 = 3;

short num3 = (short) (num1 +num2); //num1num2 int로 계산될건데 short로 강제 형변

 

int num4 = (int)num1;

 

13.아래의 에러가 나는 이유를 설명하고 수정 하시오.

int a = 3;

int b = 4;

 

double c = a / b;

System.out.println(result);

 

결과 0.0

 

int 연산 결과는 int인데(소수점 날림) 그 값을 num3으로 대입 하면서 double로 대입해서 .0이 붙게 된다.

 

1. 원하는 결괏값인 0.75를 얻기 위해서는 num1, num2의 자료형 중 하나는 double로 선언해야 한다.

 

int a = 3;

int b = 4;

 

double result = a/ (double)b

System.out.println(result);

 

2. 혹은 연산전에 하나를 double형으로 명시적으로 바꿔주면 제대로된 값을 받을 수 있다.

 

 

int a = 3;

double b = 4.0;

 

double result = a/ b;

System.out.println(num3);

 

 

3. 위에 둘중 하나 자료형만 double로 바꿔되 된다.

 

4. 연산시에 숫자가 나온다면 형을 따로 쓰지 않고 3.0 같은 소수점이 있는 수를 사용하면 자동으로 double로 인식해서 계산된다.

 

 

14. 이스케이프 시퀀스의 종료를 나열하고 기능을 설명하시오.

 

이스케이프 시퀀스는 특수 문자로, 백 슬러시 뒤에 문자가 오는 것들을 말한다.

 

(화면상의 어떠한 상황 또는 상태를 표현하기 위해 약속된 문자)

 

\b 백스페이스 문자 back

\t tab

\\ 주석처리

\" 작은따옴표문자

\" 큰따옴표문자

\n 개행 line new

\r carrige return :커서를 처음으로 옮겨서 그 자리에 있던 문자를 지우면서 쓰고 개행도 시킴. 결과로 cb나옴 (타자기에서 한번씩 치면 땡기면서 한 칸아래 맨 앞줄로 이동하는 것처럼)

 

 

public class Hello {

   public static void main(String[] args) {

      System.out.println("\'아아\'") ;

  }

}

 

결과

'아아'

 

```java

public class Hello {

    public static void main(String[] args) {

      System.out.println("AB" + '\b' + 'c');

      System.out.println("AB" + '\t' + 'c');

      System.out.println("AB" + '\n' + 'c');

      System.out.println("AB" + '\r' + 'c');

   }

}

 

- 결과 (이클립스에서 에러. 터미널에서 실행한다.)

15. 아래의 출력 결과를 확인하고, 130이 나오는 이유를 설명하시오.

 

System.out.println('A'); //char형으로 인식, 메모리에 올라갈 때 65값이 들어감

System.out.println('A' + 'A'); //char형으로 65메모리에 올리고, int형으로 자동형변환

 

결과

A

130

 

- 'A'(리터럴)를 뿌리기 위해 메모리에 방을 잡아야 한다. 이때 데이터 타입이 필요하고 A에 대한 데이터 타입은 char, 메모리에는 아스키코드 값 65가 들어간다.