IT/Java

기술 면접용 자바 정리 (2)

김효랑이 2018. 11. 14. 23:32
728x90
반응형

 호야의 블로그 

[Java] 기술 면접용 자바 정리 (2)

기술 면접용 자바 용어 및 정의가 정리되어 있는 자료입니다.

자바 정리

리스트와 맵의 차이점

 리스트와 맵은 데이터를 저장한다는 공통점을 가졌지만 데이터를 저장하는 구조가 다릅니다. 리스트는 배열로 되어 있어 데이터를 순차적으로 표현할 때 유리한 자료 구조입니다. 반면에 맵은 특정 데이터를 표현할 때 유리한 자료 구조입니다.


 추상클래스란 

 abstract로 정의되거나, 클래스 내에 추상 메서드가 하나 이상 포함된 클래스입니다. 근본적인 차이점은 사용 목적입니다. 클래스는 기본적으로 상속을 통해 기능을 확장하려는 목적으로 사용하며, 인터페이스는 해당 인터페이스를 구현한 객체들에 대해 동일한 동작을 약속하게 하기 위해서 사용합니다. 이 외에 추상클래스는 다중상속이 불가능하고 인터페이스는 가능하다는 차이점도 있는데, 목적이 달라서 기능이 다른 것 뿐이지, 인터페이스는 다중상속을 보완하려고 존재하는게 아닙니다.


인터페이스란 

클래스가 상속을 통해 구현하기에 한계가 있는 경우, 자바에서 불가능한 다중상속을 흉내내기 위한 도구로써 사용됩니다. 추상클래스보다 추상정도가 높으며 추상메서드와 상수만을 가질 수 있습니다. Implements를 통해 구현합니다.


상속은 부모의 클래스의 특징들을 물려받는 것이고, 다형성은 클래스에 동일한 메소드를 사용할 수 있는 것입니다. 추상 클래스는 클래스를 상속 받아 기능을 이용하고 확장시키는 반면 인터페이스는 메소드를 강제 구현하며 구현된 객체의 같은 동작을 보장합니다.


추상 클래스(상속)를 사용하는 이유

기존에 만든 것을 재사용할 수 있다. Human이라는 클래스를 만드는 것으로 사람의 공통적인 부분을 만들어 프로그래머나, 디자이너, 퍼블리셔 등이 갖는 사람의 특징을 정의하는 수고를 덜 수 있다.


인터페이스(다형성)를 사용하는 이유

동작 방식을 다르고 주고 싶을 때 사용, 예를 들어 키보드를 누르면 ESC가 될 수도, Enter가 될 수 도 있다.


동기식와 비동기식의 차이에 대해 설명

동기식은 어떤 동작이 완전히 끝나고 제어를 반납하는 방식이며, 비동기식은 동작이 끝나지 않아도 일단 제어권을 반납하고 할 일을 계속하는 방식

이메일의 예를 들어 설명하자면 만명에게 이메일을 보내고자 합니다. 한명에게 메일을 보내는 시간을 1초라고 한다고 할 때 동기식의 경우는 발행을 누르면 1초당 한명씩 보내게 되며 만초가 걸리는 동안 기다려야합니다. 비동기식의 경우 발행을 누르면 이메일을 보내는 시스템에데 만명에게 이메일을 보내라고 위임을 하는 것으로, 시스템이 일을 처리하는 동안 전송완료의 메시지를 받고 백그라운드에서 메일을 보내는 것입니다.


선택 정렬(Selection sort)

주어진 리스트에 최소값을 찾아 맨 앞에 위치한 값과 교체하며 리스트를 반복해 교체하는 알고리즘


삽입 정렬(Insertion sort)

자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘


버블 정렬(Bubble sort)

매번 연속된 두 개 인덱스를 비교하여, 정한 기준의 값을 뒤로 넘겨 정렬하는 알고리즘


머지 정렬(Merge sort)

분할 정복 알고리즘의 종류로 큰 문제를 반으로 쪼개 문제를 해결해 나가는 방식으로 배열의 크기가 1보다 작거나 같을 때까지 반복해 정렬하는 알고리즘


퀵 정렬(Quick sort)

분할 정복 알고리즘의 종류로 pivot을 선정하여 pivot을 기준으로 좌측과 우측으로 pivot보다 작은 값을 왼쪽, pivot보다 큰 값을 오른쪽으로 재배치를 하고 계속하여 분할하여 정렬하는 알고리즘

*pivot : 리스트 가운데서 고른 하나의 원소


 머지 정렬 와 퀵 정렬의 차이

병합 정렬은 정확하게 이분할을 하는 반면에 퀵 정렬의 경우에는 정확하게 이분할되지 않습니다.


클래스와 인스턴스, 객체

클래스로부터 객체를 만드는 과정을 인스턴스화, 클래스로부터 만들어진 객체를 인스턴스(Instance)

클래스(Class)는 객체를 프로그램적으로 만들기위한 설계 코드(객체들의 집합)

객체(Object)는 SW(소프트웨어)에 구현할 대상

예를 들어 자동차의 상태와 정보를 담은 것이 클래스, 자동차 주인과 차의 종류를 정의한 즉 클래스에 대한 변수를 선언한 것이 인스턴스, 객체는 자동차 종류로 모닝, 소나타, 그랜져 등을 의미


함수와 메소드

함수와 메소드는 특정한 로직을 처리하는 점에서 의미는 같다.

절차지향언어에서 사용하는 것은 함수, 객체지향언어에서 사용하는 것은 메소드

일반적으로 function A(){}으로 감싸져 있는 것은 함수

클래스 내에서 속해 사용하는 것이 메소드


 Finalize method 파이널라이즈 메소드 -> finalizer

최상위 클래스인 object 클래스에는 finalize라는 이름의 protected 메소드가 있다.

이 메소드는 JVM이 자원의 누수를 방지하기 위해 실행하는 가비지 컬렉션이 수행될 때 더 이상 사용하지 않는 자원에 대한 정리 작업을 진행하기 위해 호출되는 종료 메소드

자바 가상 머신(JVM)이 그 객체가 가지고 있는 메모리가 반환되기 전에 이것을 수행

클래스의 객체가 더 이상 사용되지 않으면 JVM의 가비지 컬렉터가 메모리에서 객체를 없애기 전에 finalizer()를 호출한다.

어쩔 수 없이 파이널라이저를 사용해야 하는 경우에는 super.finalize()를 호출해야 한다.

단점 : 예측이 되지 않아 조심히 사용해야 하며 성능 저하의 문제를 가져올 수 있다.


트라이 캣치 파이널

예외 처리 문으로 try는 예외가 발생할 가능성 있는 범위를 지정하는 블록, 예외가 발생하게 되면 catch블록을 수행, finally는 try, catch에 상관없이 무조건 수행(항상 수행해야 할 필요가 있는 경우에 사용)


 배열과 컬렉션(리스트)

배열은 크기가 정해져 있다. (크기가 확정된 경우에 배열을 사용), 인덱스를 가지며 인덱스는 변경되지 않는다. Array는 정적인 길이를 제공하는 배열(삽입, 삭제 시 리스트보다 느림)

컬렉션(리스트)의 경우 자동으로 엘리먼트를 수용할 수 있는 크기가 조정되고 리스트 내의 엘리먼트 실제 개수를 알려준다. 컬렉션의 경우 처음, 중간, 끝에 엘리먼트를 추가/삭제가 가능(검색 시 배열보다 느림)


자바스크립트와 jquery, 부트스트랩에 대해 설명

자바스크립트는 웹 브라우저는 동적으로 제어하기 위해 개발된 언어로 웹 개발에서 필수 지식입니다. jQuery는 자바스크립트의 라이브러리로 자바스크립트를 조금 더 편리하게 사용되기 위한 언어로 document.getElementById()를 $(‘#’)으로 간단하게 대체할 수 있다. 또한 jquery는 크로스브라우징(어느 브라우저에서도 작동)을 지원한다.


부트스트랩은 CSS를 다루는 프레임워크


DDL(Data Definition Language)과 DML(Data Manipulation Language)의 차이

DML : 데이터베이스에 들어 있는 데이터를 조회하거나 검색하기 위한 명령어(SELECT, UPDATE, INSERT, DELETE)

DDL : 테이블 구조를 정의하는 데 사용되는 명령어(CREATE, ALTER, DROP 등)


TCL(Transaction Control Language) : Commit과 rollback의 사용은 누가 하는 가?

논리적 작업의 단위를 묶어서 DML에 의해 조작된 결과를 제어하는 명령어


인덱스가 무엇?

인덱스란 검색속도를 높이기 사용하는 하나의 기술

책으로 비유하자면 Full scan은 책을 한 장씩 넘기면서 찾는 방식

Index는 찾고자 하는 페이지를 바로 찾을 수 있는 방식


inner join, outer join 이너조인과 아우터 조인

 INNER JOIN은 교집합이라면 OUTER JOIN은 합집합. INNER JOIN은 두 개의 테이블에 공통된 값을 조회, OUTER JOIN은 Left, Right, Full 3가지로 나뉘는 데 Left와 Right의 경우 모든 결과를 조회한 후 반대쪽에 매칭되는 값이 없어도 보여주는 조인. Full은 모든 결과를 조회하고 양쪽에 매칭되는 값이 없어도 보여주는 조인.


HTTP와 HTTPS의 차이

http의 경우 서버로 전송하는 정보들을 보안 장치 없이 그대로 전송, 해커가 입력한 정보를 모두 볼 수 있게 된다.

http와 SSL(Secure Socket Layer)이라는 보안 소켓 계층 프로토콜을 합친 것이 https로 서버로 전송하는 정보를 암호화하기에 보안성이 높다. 

https를 사용하는 홈페이지는 SSL인증서를 발급받아 사용한다. 인증서를 통해 신뢰할 수 있는 사이트임을 확인할 수 있다.보안 기능이 추가하다 보니 속도가 http보다는 느리다는 점이 있다. 그래서 평소에 http를 사용하다 개인정보를 입력하는 페이지로 이동하는 경우 https를 사용함


Wrapper Class

 기초 자료형으로 표현할 수 있는 데이터를 객체로 만들어야 하는 경우의 지원하는 클래스


JDK란

자바 프로그램 개발도구로써 개발을 위한 클래스, 컴파일러, 실행 및 배포도구를 포함하여 개발을 위한 전반적인 환경을 제공하는 것입니다.


캡슐화란

관련된 데이터와 메서드를 하나의 단위로 묶는 원리입니다. 그로 인해 캡슐내부와 외부를 구별하게 됩니다. 캡슐화를 하게 되면 클래스의 필드 값에 권한을 설정할 수 있습니다. 또한 사용자는 데이터가 클래스에 어떻게 저장되는지 알 수 없습니다. 그리고 클래스의 결합도가 낮아져 재사용이 용이하게 됩니다.


SDK란

Software Development Kit의 약자로, 개발을 위한 클래스, 컴파일러, 실행도구, 디버깅 툴, 예제 코드, 튜토리얼 등을 모아놓은 환경을 제공하는 것입니다. 모형배 만들기 키트에 재료 뿐만 아니라 자, 목공용 풀, 돋보기가 포함된 것 처럼, 개발을 위한 도구 세트입니다.


뮤텍스와 세마포어

프로세스 혹은 쓰레드 간의 통신 시에 shared memory 등을 쓰는 경우 하나의 자원에 두 개 이상의 프로세스 혹은 쓰레드가 접근하는 경우에 문제가 발생.

이를 제어하기 위해 쓰레드에서는 뮤텍스를 사용하며, 프로세스에서는 세마포어를 사용 함


뮤텍스

상호배제라고도 하며, Critical Section을 가진 스레드의 Running time이 서로 겹치지 않도록 각각 단독으로 실행하게 하는 기술

synchronized 또는 lock을 통해 해결


세마포어

리소스 상태를 나타내는 간단한 카운터

공유 리소스에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근하여 사용할 수 있음. 

쓰레드가 하나의 자원을 공유함에 따라 데이터 일관성의 문제가 생기는데, synchronized 처리를 해줌으로써, 하나의 쓰레드만 접근할 수 있도록 함


교착상태(데드락)

데드락은 두 개 이상의 프로세스나 쓰레드가 서로 자원을 기다리면서 무한히 기다리게 되는 상태를 말합니다. 


데드락을 피하는 방법

상호 배제: 하나의 자원을 특정 시기에 하나의 프로세스/쓰레드만 소유할 수 있는 형태 

자원 점유: 하나의 자원을 소유하고 다른 프로세스 혹은 쓰레드의 자원을 요청하는 상태

선취 불가능: 하나의 프로세스/쓰레드에게 주어진 자원은 해당 프로세스/쓰레드가 스스로 놓기 전에는 놓게 만들 수 없는 상태

순환 대기: 두 개의 프로세스/쓰레드의 경우, A->B, B->C, C->A에게 서로 자원을 요청하고 기다리는 상황으로 서로 꼬리를 물고 기다리는 상황


4가지 중 하나라도 불충족하면 데드락이 발생하지 않음. 

연간된 자원을 순차적으로 realese하는 방안과 전체를 제거하는 방안이 있음


startWith: 문자열이 지정한 문자로 시작하는지 판단 같으면 true반환 아니면 false를 반환한다.(대소문자구별)

String str = "apple";

boolean startsWith = str.startsWith("a");

System.out.println("startsWith: " + startsWith);

결과값:true


endWith:문자열 마지막에 지정한 문자가 있는지를 판단후 있으면 true, 없으면 false를 반환한다.(대소문자구별)

String str = "test";

boolean endsWith = str.endsWith("t");

System.out.println("endsWith: " + endsWith);

결과값:true


equals:두개의 String에 값만을 비교해서 같으면 true, 다르면 false를 반환한다.(대소비교)

String str1 = "java";

String str2 = "java";

boolean equals = str1.equals(str2);

System.out.println("equals: " + equals);

결과값:true


indexOf:지정한 문자가 문자열에 몇번째에 있는지를 반환한다.

String str = "abcdef";

int indexOf = str.indexOf("d");

System.out.println("indexOf: " + indexOf);

결과값:3


lastindexOf:문자열에 지정한 문자가 마지막몇번째에 있는 int를 반환한다.

String str = "AdnroidApp";

int lastIndexOf = str.lastIndexOf("A");

System.out.println("lastIndexOf:" + lastIndexOf);

결과값:7


length:문자열의 길이를 반환한다.

String str = "abcdef";

int length = str.length();

System.out.println("length: " + length);

결과값:6


replace:문자열에 지정한 문자" "가 있으면 새로 지정한 문자" "로 바꿔서 출력한다.

String str = "A*B*C*D";

String replace = str.replace("*", "-");

System.out.println("replace: " + replace);

결과값: A-B-C-D


replaceAll:정규표현식을 지정한 문자로 바꿔서 출력한다.

String str = "AB CD";

String replaceAll = str.replaceAll("\\p{Space}", "*");

System.out.println("replaceAll: " + replaceAll);

결과값: AB*CD


split:지정한 문자로 문자열을 나눌수 있다.(배열로 반환)

String str = "A:B:C:D:abcd";

String[] split = str.split(":");

System.out.println("split: " + split[1]);

결과값:B


substring:문자열에 지정한 범위에 속하는 문자열을 반환한다.(시작범위에 값은 포함하고, 끝나는 범위에 값은 포함하지않는다.)

String str = "ABCDEF";

String substring = str.substring(0, 2);

System.out.println("substring: " + substring);

결과값:AB


toLowerCase: 문자열에 대문자를 소문자로 변환한다.

String str = "abcDEF";

String toLowerCase = str.toLowerCase();

System.out.println("toLowerCase: " + toLowerCase);

결과값:abcdef


toUpperCase:문자열에 소문자를 대문자로 변환한다.

String str = "abcDEF";

String toUppercase = str.toUpperCase();

System.out.println("toUppercase: " + toUppercase);

결과값:ABCDEF


toString:문자열을 그대로 반환해준다.

String str = "1234";

String toString = str.toString();

System.out.println("toString: " + toString);

결과값:1234


trim:문자열에 공백을 없에준다.

String s = "     java java java     ";

String v;

v = s.trim();

System.out.println("trim:" + v);

결과값:java java java


valueOf:지정한 개체의 원시 값을 반환

int i = 12345;

long l = 1L;

char c = '1';

System.out.println("valueOf: " + String.valueOf (i));

System.out.println("valueOf: " + String.valueOf (l));

System.out.println("valueOf: " + String.valueOf (c));

결과값: valueOf: 12345; valueOf: 1; valueOf: 1


compareTo:두개의 String를 앞에서부터 순사적으로 비교하다가 틀린부분이 있으면 비교하는 String에 캐릭터값을 반환한다.(대소문자를 구별)

String str1 = "A";

String str2 = "B";

int compareTo = str1.compareTo(str2);

if(compareTo > 0){

       System.out.println(str1 + " > " +str2);

} else if (compareTo == 0){

       System.out.println(str1 + " = " +str2);

} else{

       System.out.println(str1 + " < " +str2);

}

결과값: A < B


contains:두개의 String을 비교해서 비교대상 String을 포함하고 있으면true, 다르면 false를 반환한다.

String str1 = "abcd";

String str2 = "c";

boolean contains = str1.contains(str2);

System.out.println("contains: " + contains);

결과값:true


charAt:지정한 index번째에 문자를 반환한다.

String str = "charAt";

char charAt = str.charAt(2);

System.out.println("charAt: " + charAt);

결과값:a


concat:문자와 문자를 결합해준다.

String str1 = "Han";

String str2 = "SeeJin";

String concat = str1.concat(str2);

System.out.println("concat: " + concat);

결과값:HanSeeJin


format:서식문자열을 이용해서 서식화된 문자열을 반환한다.

int i = 123456789;

String str = String.format("%,d", i);

System.out.println("format: " + str);

결과값:123,456,789


matches:지정한 정규 표현과 일치 할때 true를 반환한다.

int i = 123456;

String str1 = String.format("%,d", i);

String str2 = "123456";

boolean matches = str1.matches(str2);

System.out.println("matches: " + matches);

결과값:false


replaceFirst:문자열에 지정한 문자" "가 있으면 첫번째만 새로지정한 문자" "로 바꿔서 출력한다.

String str = "Aman";

String replaceFirst = str.replaceFirst("A", "super");

System.out.println("replaceFirst: " + replaceFirst);

결과값:superman



조금의 도움이 되셨다면 로그인 없이도 가능한 댓글과

왼쪽 아래 ♥공감 버튼을 꾹 눌러주세요! 



728x90
반응형