개발이야기/기술면접준비

신입 자바 개발자 기술면접 대비(JAVA 편)

cafe-jun12 2019. 12. 30. 17:28
반응형

1. String,Stringbuffer,StringBuilder 의 차이에 대해서 설명하세요


자바에서 문자형을 다루는 클래스를 말하라고 하면 대표적으로 String 클래스를 말할수 있습니다. 하자만 String 클래스는 immutable(불변의) 클래스입니다. 즉 String 클래스를 이용하여 문자열을 추가할때 기존에 할당된 힙 메모리 영역에 문자열을 수정하는것이 아닌 새로운 메모리공간에 기존의 문자열을 복사하여 추가를합니다.

 

String 클래스 

data 변수를 그림과 같이 사용할때 Heap 메모리 영역에서는 데이터를 추가하기위해 += 할경우 기존의 메모리 영역을 수정하는것이 아닌 데이터를 기존 데이터를 복사해 새로운 메모리 영역을 할당합니다.그리고 추가한 데이터를 기존 문자열 데이터 뒤에 붙여 넣습니다. 이러한 String 클래스가 선언된 변수가 많으면 사용되지않는 메모리 공간이 많아지고 이것은 시스템 성능에 문제가 생길수 있습니다. String 클래스의 이러한 단점을 해결할 StringBuffer,StringBuilder 클래스가 있습니다. SringBufferStringBuilder클래스는 mutable(가변적인)한 클래스 입니다.

 

StringBuilder/StringBuffer 클래스 

 

StringBuilder,StringBuffer 클래스로 선언된 변수는 append() 메소드를 사용할수 있습니다. append() 메소드를 사용하면 기존에 Heap영역에 할당된 주소값에 접근하여 데이터를 추가 할수가 있습니다. 이것은 기본적으로 내부적으로 Buffer에 문자열을 저장하고 버퍼안에서 데이터를 추가하는 구조로 되어있으므로 String 처럼 새로운 메모리공간을 추가하지않고 문자열을 조작가능합니다.

 

좀 더 깊게 들어가면 StringBuffer에서는 별도로 synchronized 가 지원이 되어 멀티쓰레드 환경에서도 안전하게 실행되는 반면 StringBuildersynchronized가 지원되지 않으므로 멀티쓰레드환경에서는 StringBuffer 사용을 권장하고 단일 쓰레드 환경에서는 StringBuilder를 권장합니다. 

 

정리 

String 클래스는 불변의 클래스입니다.String 클래스를 이용하여 문자열을 수정할때 기존 할당된 Heap메모리 영역에 문자열을 수정할수 없고 새로운 매모리공간을 할당에 문자열을 조작하게됩니다. 이러한 변수가 많을수록 사용되지 않는 공간이 많아져 시스템 성능 악화를 초래할수 있습니다. 이러한 단점을 보안할수 있는 StringBuilder와StringBuffer클래스는 가변적인 클래스입니다. 두 클래스는 String 처럼 새로운 메모리공간에 할당하여 문자열을 조작하지 않고 기존의 할당된 공간에 접근하여 문자열을 조작할수 있습니다.

 

2. 프레임워크와 라이브러리의 차이점을 설명하세요


라이브러리와 프레임워크의 차이점을 말하라고 한다면 막상 설명하기가 힘들다 그래서 프레임워크와 라이브러리 특징을 정리하고 둘의 차이점을 설명해보겠습니다. 

프레임워크(Framework)

프레임 워크란 프로그램 및 소프트웨어를 개발할때 생기는 문제인 통합성,일관성 등을 해결하기 위해 상호 협력하는 클래스,인터페이스 등의 집합니다. 그리고 제어의 역전 개념이 적용된 대표적인 기술입니다.

 

프레임워크의 특징을 살펴보면 다음과 같습니다.

  • 미리 구현해둔 코드를 사용하기 때문에 개발속도 향상 
  • 일정한 품질을 보장
  • 구조적이고 안정적인 개발이 가능하며 유지보수가 쉽다

라이브러리(Libray) 

 

라이브러리는 간단히 말하면 활용가능한 도구들의 집합입니다. 즉 개발자가 만든 클래스를 호출하여 사용하는것이므로 개발자가 필요한 클래스를 호출하여 사용하는 방식을 가지고 있습니다.

라이브러리/프레임워크차이

프레임워크와 라이브러리의 차이점

라이브러리와 프레임워크의 가장 큰차이는 프로그램의 제어의 흐름에 대한 주도성이 누구에게/어디에 있는가에 초점을 맞추어져 있습니다. 즉 개발된 어플리케이션의 흐름을 누가 쥐고 있는냐 가 가장 큰 차이를 보입니다. 프레임워크는 전체적인 흐름은 스스로가 가지고 있으며 개발자는 그안에서 필요한 코드를 작성하는 반면에 라이브러리는 사용자가 전체적인 흐름을 만들어 필요할때 라이브러리를 가져다 사용한다고 말할수 있습니다.

 

호출관계

위에 그림을 본다면 프레임 워크가 개발자의 코드를 호출하고 개발자의 코드는 라이브러리를 호출하게 된다 즉 개발자의 코드 입장에서 본다면 프레임워크 안에서 개발자의 코드가 사용되는 구조이고(개발자의 코드가 수동적) 라이브러리는 개발자의 코드가 호출하는 입장이 된다(개발자의 코드가 능동적). 

 

프레임워크와 라이브러리의 차이를 잘 설명해 놓은 블로그가 있어서 링크를 해놓았습니다.

 

 

참고 https://webclub.tistory.com/458

 

프레임워크와 라이브러리의 차이점

Framework Vs Library 프레임워크와 라이브러리의 정확한 차이점은 무엇일까요? 대중 알것 같지만 정확히 어떠한 차이점이 있는지 모르고 있는 경우가 많을지도 모릅니다. 프레임워크는 단지 미리 만들어 둔 반제..

webclub.tistory.com

 

3. 인터페이스와 추상클래스가 무엇이고 차이점을 설명하세요


인터페이스란 간단하게 클래스의 템플릿이라고 생각하시면 됩니다. 단 인터페이스는 멤버변수 멤버함수등을 가질수가 없고 추상 메소드만 가질수 있습니다. 즉 껍데가만 있는 클래스인것입니다. 인터페이스를 사용하는 목적은 클래스를 사용하면서 인터페이스를 제공하기 위해서입니다. 인터페이스는 여러 클래스의 사용방법이 같음을 보장할수 있습니다. 그렇기 때문에 자신을 implement 하는 클래스에게 메서드 구현을 강제합니다. 

 

 

예를 들어 List 인터페이스를 implement 하는 클래스인 ArrayList와LinkedList 는 공통적으로 add(),clear(),indexOf(),get() 등의 메서드를 가지고 있습니다.이것을 List 인터페이스가 가지고 있는 메소드를 강제로 구현하였기 때문입니다. 

 

그렇다면 추성클래스무엇일가요 ? 추상클래스는 abstract로 정의 되어 있거나 클래스 내에 추상 메서드가 하나 이상 포함된 클래스 입니다. 인터페이스와 추상클래스는 사용하는 목적이 다릅니다. 클래스는 기본적으로 상속을 통하여 기능을 확장하려는 목적을 가지며 인터페이스는 구현한 객체들에게 동일한 동작을 약속하기 위해 사용을 합니다. 이 외에도 추상클래스는 다중 상속이 불가하고 인터페이스는 다중 implement가 가능합니다.

 

 

4. 직렬화(Serialization)/역직렬화(Deserialization) 에대해서 설명해보세요


 

 

  • 직렬화(Serialization) 는 메모리상에 있는 객체의 현재 상태를 디스크에 저장하거나 네트워크를 통해 전송되는 형식 즉 바이트 스트림으로 변환하는 작업을 의미합니다.

  • 역직렬화(Deserialization) 는 디스크에 저장되어있는 직렬화된 데이터를 읽거나 네트워크를 통해 전송된 바이트 스트림 형태의 데이터를 받아서 메모리상(Heap) 공간안에 할당하는것입니다.

클래스를 직렬화 하고 싶다면 Serializable 인터페이스를 구현해야합니다.

 

 

public class Human implements Serializable{
 
    private static final long serialVersionUID = 1L;
    
    String name;
       
    int age;
 
    public void setName(String name){
        this.name = name;
    }
 
    public void setAge(int age){
        this.age = age;
    }
 
    public String getName(){
        return this.name;
    }
 
    public int getAge(){
        return this.age;
    }
       
    @Override
    public String toString() {
        return new StringBuffer("Name : ").append(this.name).append(", Age : ").append(this.age).toString();
   }
}

 

참고사이트 https://m.blog.naver.com/PostView.nhnblogId=kkson50&logNo=220564174258&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

5. 배열(Array)와 연결리스트(Linked List)의 차이를 설명해보세요 


 

Array와 Linked List 차이

 

배열

배열은 내부 인덱스를 이용하여 자료의 검색이 한번에 이루어지기 때문에 빠른 검색 속도를 보이지만 데이터 삽입 삭제시 많은 데이터가 밀리거나 빈 자리를 채우기 위해 이동해야하기 때문에 많은 시간이 소요됩니다.

 

연결리스트

반면 연결리스트는 인근 노드들의 참조값만 수정해 줌으로써 데이터 수정 삭제가 빠르게 가능합니다. 단 데이터를 조회시 처음 노드부터 해당 노드 위치까지 사이에 있는 노드를 전부 탐색을 해야 하기 때문에 데이터 수가 많을수록 배열보다는 효율이 떨어집니다.

 

결론

데이터 양이 많아지고 데이터의 삽입/삭제가 거의없고 데이터 접근이(조회) 가 빈번하게 이루어 진다면 배열이 유리하고 데이터 양이 많지않고 데이터 삽입/삭제가 빈번하게 이루어 진다면 연결리스트가 유리합니다. 

 

 

 

6. HashMap에 대해서 설명해 보세요 


 

해쉬는 내부적으로 배열구조를 사용하여 데이터를 저장하기 때문에 빠른 검색속도를 가지고 있습니다.

그리고 데이터의 삽입과 삭제시 기존 데이터를 밀어내거나 채우는 작업이 필요 없도록 특별한 알고리즘을 이용하여 데이터와 연관된 고유한 숫자를 만들어 낸뒤 이를 인덱스로 사용한다.특정 데이터가 저장되는 인덱스를 그 데이터만의 고유한 위치이기 때문에 삽입시 다른 데이터의 사이에 끼어들거나 삭제시 다른 데이터로 채울 필요가 없으므로 삽입과 삭제시 데이터의 이동이 없도록 만들어진 구조입니다.

반응형