관리 메뉴

번데기 개발자의 메모장

JAVA 관련 면접 대비 질문 모음 본문

신입 개발자의 취업기/면접 질문 대비

JAVA 관련 면접 대비 질문 모음

번데기 개발자 2018. 5. 25. 00:31
반응형


String,StringBuilder,StringBuffer의 차이를 설명하세요.

String 객체는 immutable 합니다. 

한번 생성이 되면 변경이 불가능 합니다. 

예를 들면 String 2개를 연결하는 작업을 할 때에 새로운 String을 객체를 이용하여 문자열을 참조하게 됩니다.


StringBuilder와 StringBuffer의 차이점은 멀티쓰레드 상태에서 동기화의 지원 여부가 다릅니다.

StringBuffer은 멀티쓰레드 환경에서 동기화를 보장하지만 StringBuilder은 동기화를 보장하지 않습니다.


*JDK 1.5버전 이하에서는 String을 사용할때 StringBuilder와 성능 차이가 있었지만 1.5버전 이후부터는 String을 컴파일 할때 자동적으로 StringBuilder로 컴파일 하여 실행되므로 성능 차이가 사라졌다고 합니다. ^^


객체지향 언어의 특징을 3가지만 설명해보세요.


상속 추상화 캡슐화 다형성 (상추 캡이다)


추상화 : 

객체들의 공통적인 특징을 뽑아내는 것입니다. 객체들의 공통적인 데이터와 기능을 도출하는 것을 말합니다. (ex) class )


캡슐화 : 

객체가 맡은 역활을 수행하기 위한 하나의 목적을 위해 데이터와 기능들을 묶는 것을 말합니다 

(외부로 공개 안할수도 있음)


상속 :

새로운 클래스가 기존의 클래스의 자료와 연산을 이용하게 해주는 것


다형성 :

한 요소에 여러 개념을 넣어 놓은것 (오버라이딩,오버로딩)



객체지향에 대해서 설명해보세요.


객체지향이란 실세계의 사물을 추상화하여 멤버 변수와 메소드를 정의하는데서 출발합니다. 

캡슐화를 통해 이와같은 멤버변수와 메소드의 이용가능 범위를 적정하게 제한 할 수 있고 상속을 이용하여 부모 클래스의 기능을 자식클래스에서 물려받거나 재정의를 통해 다른 기능을 구현하는 다형성까지 포함됩니다.

객체지향의 장점으로는 코드의 재사용성이 있습니다. 

따라서 개발 및 유지보수에 효율적이고 캡슐화를 통한 데이터의 올바른 값 유지, 다형성을 이용한 메소드의 활용 등이 있습니다.



JAVA에서 바이트코드에 대해 설명해보세요. (+ 자바 언어의 장점)


바이트코드는 자바의 장점중의 하나입니다. 자바는 JVM을 이용한 플랫폼 독립적이라는 특징이 있습니다.

자바에서 코드를 컴파일하면 바이트코드 즉 (.class)형태로 출력이 되는데 이 Class형태는 JVM에 의해 런타임시완벽한 기계코드로 변경되어 실행됩니다. 

따라서 JVM만 있으면 재컴파일 없이 여러 플랫폼에서 똑같이 실행되는 장점이 있습니다.

추가적으로 자바의 장점으로는 포인터 연산이 필요 없고 객체지향이라는 점, 그리고 멀티쓰레딩, 네트워킹 API를 제공한다는 점을 들 수 있습니다.


단점으로는 JVM을 사용하기 때문에 발생하는데요, JVM은 많은 메모리를 사용하고 실행속도 또한 빠르지 않습니다

바이트 코드를 완전한 기계코드로 변환하는 과정에서 일반적인 컴파일 언어보다 속도가 많이 느리다는 단점이 있습니다.


NIO(New Input-Output)에 대해 설명하세요.

기존의 자바 IO의 단점을 보완하여 JDK 1.4버전 이상에서 제공되는 IO패키지를 의미합니다. 

blocking이란 IO작업에서 주로 사용되는 메소드의 실행속도가 느려서 잠시 멈춰있는 상태를 말합니다.

이 문제를 해결하기 위해서 멀티 쓰레딩을 통해 문제를 해결하였습니다. 

하지만 이런 작업이 수 만개가 동시해 진행할 가능성이 있는 서버 프로그램일 경우 쓰레드가 너무 많아져서 생기는 Context Switching이 발생하게 되어, 이러한 수 많은 쓰레드가 모두 작업을 하지 않고 자원을 낭비하는 상태로 유지됩니다.

따라서 모든 IO에 대해 쓰레드를 생성하는 방식이 아닌 채널관리자(Selector)을 이용하여 실제 IO가 발생한 채널만 쓰레드를 생성하여 관리하는 방식입니다.

단점으로는 이러한 프로그래밍은 기존의 다중쓰레드를 이용한 방식보다 구현하기 어려운 단점이 있습니다.




자바의 기본자료형과 참조 자료형에 대해 설명해 보세요

기본자료형은 byte,short,int,long,float 등이 존재합니다. 


오버로딩과 오버라이딩의 차이점을 알려주세요

오버로딩메소드 이름은 같지만 매개변수를 다르게 정의하는 것을 말합니다.

오버라이딩상위클래스(부모클래스)가 가지고 있는 메서드를 자식클래스에서 재정의하여 사용하는 것을 말합니다.


Call by Value Call By Reference 차이는 무엇인가요?




Q4. 접근제어자(access modifier)에 대해 설명하시오.

접근제어자는 객체지향 프로그래밍에서 클래스의 멤버 변수 또는 메소드에 설정하는 키워드로 접근 영역을 제한하는데 사용합니다. 
public, default, protected, private이 존재합니다. 
접근제어자를 사용하지 않았을 경우에는 기본적으로 default를 갖습니다. 
public접근 제한을 하지 않음을 의미합니다. default는 같은 패키지 내에서만 접근이 가능함을 의미합니다. 
protected같은 패키지 내 혹은 다른 패키지의 자식 클래스에서 접근이 가능함을 의미합니다. private같은 클래스 내에서만 접근이 가능함을 의미합니다.

Q5. 추상 클래스(abstract class)와 인터페이스(interface)에 대해 설명하시오.

인터페이스는 추상 클래스보다 추상화 정도가 높은 상태를 정의할 때 사용합니다. 

인터페이스는 기능의 재정의에 큰 의미를 두고 있습니다. 

멤버 변수와 일반 메소드를 가질 수 없으며 오직 상수와 추상 메소드만을 선언할 수 있습니다. 

implements 키워드를 이용하여 상속을 진행하며 자식 클래스에서 반드시 메소드를 재정의해야합니다. 

그 밖에 인터페이스는 클래스에서 지원하지 않는 다중상속이 가능합니다.

추상클래스abstract을 이용한 미완성 메서드로 형태만 정의해두고 몸체는 없는 상태의 클래스를 말합니다. 

추상클래스는 상속을 진행하고 상속받은 자식클래스에서 반드시 재정의를 하여야 합니다. 

그렇지 않으면 컴파일 에러가 발생합니다. 

추상클래스는 상속을 통해 기능을 확장하는데에 의미가 있습니다.

인터페이스는 추상클래스보다 추상화 정도가 높은 상태를 정의할때 사용됩니다. 

예를들면 사람,원숭이,닭이라는 클래스가 있을때 숨을쉰다, 이동한다, 먹는다 이런 개념은 추상클래스로 표현을 할 수 있습니다.

만약 그렇지만 새라는 클래스가 있을때 '난다'라는 메소드를 가지지만 새의 종류가 다 틀려 자식 메소드에서 어짜피 구현해야될 부분이므로 부모 클래스에서 굳이 그 내용을 구현 할 필요가 없습니다.

이럴 때 추상메소드 대신 인터페이스를 사용하게 됩니다.


Q8. 컬렉션(collection) 클래스에서 제네릭을 사용하는 이유를 설명하시오.


컬렉션 클래스에서 제네릭을 사용하면 컴파일러는 특정 타입만 포함 될 수 있도록 컬렉션을 제한합니다. 

컬렉션 클래스에 저장하는 인스턴스 타입을 제한하여 런타임에 발생할 수 있는 잠재적인 모든 예외를 컴파일타임에 잡아낼 수 있도록 도와줍니다.


Q11. 래퍼 클래스(wrapper class)에 대해 설명하시오.


기본 자료형으로 표현된 데이터를 참조 자료형으로 만들어야 할 경우 래퍼 클래스를 사용합니다. 
보통 특정 메소드에서 참조 자료형을 인자로 받거나, 기본 자료형이 아닌 객체 자료형으로 저장해야할 경우, 객체간 비교가 필요할 경우에 사용합니다.

Q12. 자바에서 쓰레드를 구현하기 위한 2가지 방법을 간단하게 설명하시오.


lang 패키지내에 구현되어있는 Thread 클래스를 상속받거나 Runnable 인터페이스를 상속받아 run 메소드를 재정의하여 구현합니다.

Q17. 자바의 call-by-value, call-by-reference에 대해서 예를 들어 설명하시오.


자바에서는 기본 자료형은 call-by-value, 참조 자료형은 call-by-reference에 의해 메소드의 인자 값을 전달합니다. 
예를 들어 아래와 같은 소스 코드에서 swap 함수 내부에서는 a와 b의 값이 변경되나, 메인 메소드에서는 적용되지 않습니다. 
메소드의 인자로 a, b가 call-by-value에 의해 복사된 값이 넘어가기 때문입니다.
public class Main {
public static void main(String args[]) {
int a = 1;
int b = 2;
System.out.println(a + " " + b); // 결과 : 1 2
swap(a, b);
System.out.println(a + " " + b); // 결과 : 1 2
}
private static void swap(int a, int b) {
int tmp = a;
a = b;
b = tmp;
}
}

따라서 이를 해결하기 위해서 아래와 같은 임시방편적인 코드를 사용할 수 있습니다. 
(근본적인 swap 함수를 구현하기 위해서는 변수 자체를 객체화 시켜 객체의 멤버 변수 값을 교환하는 방식을 가장 많이 사용합니다.)
public class Main {
public static void main(String args[]) {
int a = 1;
int b = 2;
System.out.println(a + " " + b); // 결과 : 1 2

b = swap(a, a = b);
System.out.println(a + " " + b); // 결과 : 2 1
}

private static int swap(int a, int b) {
return a;
}
}
참조 자료형인 경우에도 메소드의 인자로 넘어갈 때 래퍼런스의 복사 값이 넘어가기 때문에 객체간의 교환은 불가능합니다. 
복사된 래퍼런스 값끼리만 복사가 되기 때문입니다. 
예를들어 아래와 같은 경우가 있습니다.

public class Main {
public static void main(String args[]) {
Person p1 = new Person("이순신");
Person p2 = new Person("홍길동");
System.out.println(p1.name + " " + p2.name); // 결과 : 이순신 홍길동

swap(p1, p2);
System.out.println(p1.name + " " + p2.name); // 결과 : 이순신 홍길동
}

private static void swap(Person p1, Person p2) {
Person tmp = p1;
p1 = p2;
p2 = tmp;
}

private static class Person {
public String name;

public Person(String name) {
this.name = name;
}
}
}

따라서 name 멤버 변수를 변경하기 위해서는 다음과 같이 변경해줍니다. 
이 경우 래퍼런스의 복사 값이 메소드의 인자로 넘어왔지만 결국 가리키는 객체는 동일하기 때문에 name 멤버 변수 값을 성공적으로 교환할 수 있습니다.

public class Main {
public static void main(String args[]) {
Person p1 = new Person("이순신");
Person p2 = new Person("홍길동");
System.out.println(p1.name + " " + p2.name); // 결과 : 이순신 홍길동

swap(p1, p2);
System.out.println(p1.name + " " + p2.name); // 결과 : 홍길동 이순신
}

private static void swap(Person p1, Person p2) {
String tmp = p1.name;
p1.name = p2.name;
p2.name = tmp;
}

private static class Person {
public String name;

public Person(String name) {
this.name = name;
}
}
}


쓰레드풀이란 무엇인가요?


컬랙션이란 무엇인가요?


JAVA EE와 SE의 차이점이 무엇인가요?

Java SE란 Java Platform Standard Edition의 약자로 데스크톱, 서버, 임베디드를 위한 표준 자바 플랫폼을 말합니다.  

안드로이드를 개발할 때 보통 Java SE로 개발을 합니다.

Java EE란 Java Platform EnterPrise Edition의 약자로 자바를 이용한 서버측 개발을 위한 플랫폼입니다.

SE에 서버측을 위한 기능을 추가하여 SE의 모든 기능을 이용 할 수 있습니다.






반응형
0 Comments
댓글쓰기 폼