본문 바로가기

컴퓨터공학/Java

CS> 기술 면접 대비 기초 지식 모음 1

1. 객체지향언어(Java, C++)와 구조적 언어(C)의 차이점

클래스와 구조체

공통점은 멤버 필드를 갖는다.

차이점은 멤버 메소드 존재 여부이다.

클래스는 멤버 메소드를 갖지만 구조체는 멤버 메소드가 없다.

 

자료구조의 존재 유무(Collection, STL)

C++이나 JAVA는 자료구조(Collection, STL)이 있는데

C는 없다.

 

그 외로는 예외처리나 추상클래스, 인터페이스가 있냐 없냐이다.

 

추가) 객체 지향은 세 가지 특성

다형성 ( 오버로딩 )

캡슐화 ( 접근제어자 )

상속성 (오버라이딩)

 

2. 자바의 문자열 비교와 C언어의 문자열 비교

 자바

문자열 자료형이 있는데 (String) 자료형이면서 클래스이다.

동등 비교시 ==연산자 이용 / equals 메소드 이용

char = 2byte

 

C언어

문자열 관련 함수가 다량으로 보유. 

문자열 자료형이 없어서 char 배열이나 포인터를 문자열 처리에 사용

직접대입 불가해서 strcpy, sprinf 같은 문자열 함수를 사용한다. 

비교함수를 사용하거나 일일히 비교한다. 

char = 1byte

 

3. C언어 구조체와 공용체의 차이점

메모리 공유 할당의 차이

구조체는 멤버 변수가 각각 메모리 공간을 할당받지만 공용체는 같은 메모리 공간을 모든 변수가 공유하는 형태

참고) C는 32비트 단위로 메모리 할당

 

4. 자바의 배열과 리스트 컬랙션의 차이점

배열 

클래스 객체가 아님 

변수, 메소드 보유 X

 

리스트

배열처럼 순차적 구조

인퍼페이스/ 클래스 객체 멤버 메소드

 

5. Vector/ ArrayList 의 차이점

공통점

1차원 배열 구조 

둘 다 List 인터페이스 구현

 

스레드 동기화 지원(Vector)

동기화 미지원 (ArrayList)

 

6. HashTable과 HashMap 의 차이점

스레드 동기화 지원 (HashTable)

스레드 동기화 미지원(HashMap)

 

7. toString 메소드를 DTO(VO)에서 overrding 할 때 장점

 

디버깅시 정보를 한 눈에 알 수 있어서 편하다 

오류메시지를 로깅할 때 자동으로 호출할 수 있다.

객체 내용을 문자열화

직접 호출하지 않아도 사용될 수 있다.

그냥 출력할 경우?  " 패키지.클래스@해시코드 " 이렇게 출력함 

 

toString이란? (tistory.com)

 

toString이란?

Object 이란 모든 클래스의 가장 최상위 클래스인 "Object" 클래스 JAVA에 제공하는 모든 클래스들의 계충 구조로 되어있고, 그 최상위로 올라가면 "Object"이라는 클래스가 존재한다. 우리가 일반적으

backback.tistory.com

 

 

8.  DTO 모델에서 오버로딩된 생성자를 사용할 때 장점

오버로딩된 생성자에서 인자를 받아 멤버 필드에 대입한다.

인스턴스 생성 시 멤버 필드 초기화를 한 번에 할 수 있다.

그렇지 않으면 필드마다 일일히 setter(set 메소드) 사용해야한다.

 

9. 싱글톤 패턴

애플리케이션이 시작될 때 최초 한 번만 메모리 할당을 하고 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴.

생성자를 private 로 선언하여(보안성 강조) 외부 생성불가하게 하고 getInstance( )로 받아쓴다.

싱글톤 패턴은 단 하나의 인스턴스를 생성하여 사용하는 디자인 패턴이다.

고정된 메모리 영역을 얻으면서 한 번의 new 인스턴스를 사용해서 메모리 낭비를 방지한다.

전역 인스턴스라서 다른 클래스 인스턴스들이 공유하기 쉽다.

싱글톤 인스턴스가 많은 일을 하거나 많은 데이터를 공유하면 다른 클래스 인스턴스 간 결합도가 높아진다.

따라서 수정이 어려워지고 테스트가 어렵다. 

멀티 스레드 환경에서 동기화처리를 안 하면 인스턴스가 두 개가 생길 수 있다.

싱글톤 패턴(Singleton pattern)을 쓰는 이유와 문제점 (tistory.com)

 

싱글톤 패턴(Singleton pattern)을 쓰는 이유와 문제점

싱글톤 패턴(Singleton Pattern) 싱글톤 패턴 애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴. 생성자가 여러

jeong-pro.tistory.com

 

10. DTO getter/setter 의 역할

DTO란 계층 간 데이터 교환을 위한 객체

service나 controller 등으로 보낼 때 사용된다.

멤버 필드를 private화 한다.

객체 접근을 private으로 막아 정보은닉을 해야한다.

접근을 하고 수정을 하는 메소드를 따로 만들어준다. 

 

 

11. equals 메소드를 오버라이딩해서 쓸 때 장점

 

객체 내부 필드 별로 값을 비교, 객체 생성 여부, 객체 해당 클래스에서 비롯된 여부 확인(instanceof 사용)

 

12. split 과 StringTokenizer 공통점과 차이점

공통점은 문자열 분리가 가능하다. 

 

차이점 

split은 String 클래스의 메소드이다. 

지정된 구분자로 문자열을 나눠서 배열에 저장

| 으로 여러 개 구분자 지정 가능

공백도 문자열에 추가한다

ex) str.split("$" | "/" | "+");

 

StringTokenizer는 클래스이므로 객체를 생성하고 사용

반복자(Iterator) 패턴 방식 분리

그래서 속도 빠르다. 전문화된 클래스의 장점이다.

구분자 생략 시 공백이 기본 구분자

지정된 한 가지 구분자로만 문자열을 나눌 수 있음

공백 문자열은 무시

ex) StringTokenizer str = new StringTokenizer([문자열], "구분자");

countTokens( ) : 남아있는 토큰 수 int 반환

hasMoreTokens( ) : 토큰 남아있는지 여부 boolean 반환

nextToken( ) : 토큰 String 반환

 

 

13. Iterator를 사용하는 것과 Index를 사용한 반복문의 차이점

Iterator는 Index를 사용하지 않고 다음 요소를 검색하는 방식이다.

순번 검색보다는 다량 검색 시 성능이 빠르다.

Index는 상대적으로 느리지만 순번을 꼭 사용해야하는 경우

 

14. 리스트 내용을 역순으로 정렬하기 위한 컬렉션

descendingIterator : 역순정렬 반복자 지원 -> 인쇄
descendingSet : Set 자체를 역순정렬로 치환  -> Iterator 반복자 사용 -> 인쇄

 

ex)

Collections.sort( 컬랙션객체 , Collections.reverseOrder());

 

 

ArrayList<String> arrayList = new ArrayList<String>( );
arrayList.sort(Comparator.reverseOrder( ));

 

 

15. DAO를 싱글톤 패턴으로 사용하는 이유

DB조작은 중요한 작업으로 보안이 중요하기 때문이다. 

 

16. JDBC 커넥션 부분에 생성자 기입하는 것과 CRUD 메소드 별로 기입하는 방식 차이점

1) 생성자 기입 : DAO (싱글턴) 객체 생성시 연결 
 ---> 객체 소멸(연결 해제)
: DB 연결성 "유지(선점)" : 장점
: 작업하지 않을 경우 자원 낭비 : 단점

​2) CRUD 메소드별로 연결 -> 메소드 사용후 연결 해제
: 사용시만 연결 -> 해제 : 자원 효율적 사용 : 장점
: DB 연결 유지/선점 불이익 : 단점

 

17. ORM 정의

데이터베이스 전문 프레임워크로 데이터베이스 프로그래밍을 객체 지향적으로 할 수 있게 도와준다.

객체와 관계형 DB를 매핑한다는 뜻이다.

 

18. form validation 할 수 있는 방법

1) javascript/ Query 등의 client scprit을 이용하는 법

웹 브라우저 이외 별도 서버 불필요 (비동적 방법)

소스 노출, 보안 취약

웹 브라우저 별 호환성 고려해야 함

 

2) Spring이나 Struts 등 프레임워크 내장된 폼점검 툴 이용

Spring validator, Struts validator  사용하면 코드 은닉 장점

javascript 방법보다 서버/라이브러리 의존도가 높고 상대적으로 느림

폼점검 메소드에 오버라이딩하는 방식 사용 

 

3) JPA 프레임워크 폼 점검 사용

JPA는 자바 진영의 ORM 기술 표준이다. 

VO(DTO)에 폼점검 사항을 annotation으로 표기한다.

상대적으로 2)보다는 쉽다.

 

4) 자체 제작 java code

제작 어려움

javascript 보다는 느리고 보안은 안전

 

19. oracle 11g 에서는 level 이라는 필드를 만들 수 없는 이유

키워드 연관어는 사용 불가능

 

 

20. 제네릭 사용 이유

1) 성능측면

컬렉션에서 많이 사용하는데 유입 요소를 제한하여 성능을 강화한다.

비제네릭 코드는 불필요한 타입 변환을 해야 해서 프로그램 성능에 악영향
아래 코드를 보면 List에 문자열 요소를 저장했지만, 요소를 찾을 때는 반드시 String으로 타입 변환을 해야함. 

제네릭 코드로 수정하면 List에 저장되는 요소를 String 타입으로 제한해서 요소를 찾을 때 타입 변환 안해도 돼서 성능 향상.

ex) 

List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0);

 

List<String> list = new ArrayList<String>();
list.add("hello");
String str = list.get(0); 

 

2) 컴파일 시 강한 타입 체크

자바 컴파일러 코드에서 잘못 사용된 타입 때문에 발생하는 문제점을 제거하기 위해
제네릭 코드에 강한 타입 체크를 한다. 
런타임에 타입 에러가 나는 것보다 컴파일할 때 미리 타입을 체크해서 에러를 사전 방지하는 것이 좋다.

 

 

단점은 사용 안 할 때보다 코드량이 길어진다. 

 

 

21. C++ 에서 다중상속과 자바에서 다중상속의 차이점

C++ 

다이아몬드 상속(계승) : 조부모 클래스 같으면 부모/다른 조부모 계승(삼촌) 클래스에서 동시 상속 가능.

 

Java  

인터페이스는 다중 상속 가능. 
(추상/일반)클래스는 다중 상속 불가 !

 

 

22. 인터페이스와 클래스 차이점

인터페이스

멤버필드 상수만 허용

final 키워드 사용하지 않아도 묵시적으로 인식

인터페이스는 생성자가 없다. 

추상클래스는 생성자가 있지만 명시적으로 사용할 수 없다.

인터페이스는 추상 메서드 사용

 

23. 인터페이스를 사용하는 이유

이상적인 객체 지향 프로그래밍(OOP) 방법론

인터페이스는 지시와 명령에 관한 객체이다.

이걸 클래스로 구현한다. 

기능을 알 수 있고 다중 상속이 가능하다.

 

24. 확장 for와 일반 for의 차이점

순번이 아닌 반복자(Iterator) 패턴 방식의 검색이라서  빠르다.

향상된 for문, for-in문, for-each문 이라고도 불린다.

확장 for문의 for(int i : a)에서 ( ) 안의 콜론(:)은 "~의 안에 있는" 이라는 뜻이다. 

따라서 for-in문 이라고 불리는 이유이다.

일반 for문은 순번을 이용해서 상대적으로 느리다. 

 

25. while 과 do while의 차이점

조건문의 위치차이

 

26. for문을 무한 반복문으로 바꾸는 방법

한계치 조건문을 생략한다. 

 

27. HashSet 과 HashMap의 차이점

HashMap 과 HashSet은 Collection framework에 속한다. 
collection framework는 인터페이스나 구현된 클래스를 가지고 있다.
Set, List, Queue 인터페이스로 나눠진다.
Set은 객체를 받되 중복 허용 안됨
List는 인덱싱을 하여 중복 허용
Queue 는 FCFS 알고리즘

 

HashSet

중복 객체 허용 안됨
HashSet에 들어가는 객체는 반드시 equals( ) 와 hashCode( ) 메소드를 구현해야한다.
이 메소드를 가지고 HashSet에 들어갈 때 중복 객체가 있는지 체크한다. 

 

HashMap

중복된 key값은 허용되지 않는다. 
기본적으로 Map 인터페이스는 HashMap과 TreeMap 두 가지 클래스가 있다. 
TreeMap은 집어 넣은 순서를 유지한다. 
HashMap은 유지하지 않는다. 
HashMap은 null value와 null key value를 허용한다. 
HashMap은 기본적으로 동기화(synchronized)가 되지 않으나, collection framework가 메소드를 제공하니 이것으로 동기화하여 멀티 쓰레드 환경에서 사용할 수 있다.
public Object put(Object key, Object value) 메소드는 map에 데이터를 저장할 때 사용한다.

 

 

1. HashSet은 Set 인터페이스를 구현
2. HashSet은 객체만 저장
3. add() 메소드를 통해 데이터를 저장
4. 들어가는 객체를 이용하여 hashcode를 생성하고, equal() 메소드를 이용해 hashcode를 비교, 중복된 객체가 있는지 체크한다. (equal() 메소드는 중복된 객체가 있으면 true를, 없으면 false를 리턴한다.
5. HashMap에 비해 느리다.

 

1. HashMap은 Map 인터페이스를 구현했다.(implement)
2. HashMap은 데이터를 key-value 형식으로 저장한다.
3. put() 메소드는 데이터를 넣을 때 사용된다.
4. HashMap에서 hashcode 값은 key value를 이용하여 생성한다.
5. HashMap은 unique key를 이용하여 데이터에 바로 접근하기에 HashSet에 비해서 빠르다.

 

 

28. Vector에서의 size()와 capacity()의 차이점은?

size : 실제 요소의 수.
capacity : 벡터의 용량.

ex) 500 CC(용량:capacity) 그릇에 물 200CC(크기:size) 들어 있다.

 

29. C언어 void와 Java에서 void 공통점과 차이점

C void  : 인자, 결과값(리턴)이 없음.
Java void : 결과값(리턴)이 없음.

 

 

30. 예외처리 try~ catch 와 throws 차이점 

try ~ catch : 블럭 단위로 예외처리
throws : 메소드 단위로 예외처리

 

 

31. 예외처리에서 finally의 역할

예외처리에서 마무리 코드가 필요시 사용.

 

32. thread의 라이프 사이클

 

 

33. thread 동기화

스레드 간 경쟁이 심할 때 스레드 실행 기회를 균등하게 조정하는 기능

 

34. thread 우선순위를 사용할 때 주의 사항

기본 스레드 우선순위는 5

우선 순위 사용시 순위가 높은 스레드가 스레드 실행 기간 등의 점유율이 다소 증가

잘못 되면 교착상태 유발 가능성이 있다.

 

 

 

35. thread 에서 비추천 함수(deprecated) 항목이 많은 이유

시행 착오 과정에서 교착 상태에 대한 대응이 제대로 이루어지 않았다.
교착 유발하는 메소드가 생기면  -> 비추천.
예를 들면 suspend(), resume(), stop()
이 함수들은 쓰레드의 실행을 일시정지, 재개, 완전정지 시킨다.
교착상태에 빠지기 쉬워서 deprecated 되었다

 

36. byte stream 과 character stream의 차이점

전송단위

byte stream : 1byte

이미지나 미디어 파일과 같은 바이너리 파일을 다룰 때 사용

 

character stream : 2 byte

텍스트 파일을 다룰 때 사용되면 유니코드가 2바이트이기 때문이다.

byte stream character stream
reading/writing of any byte, raw data reading/writing of character, text
8 bit 16bit
InputStream/ OutputStream classes Reader/Writer classes

 

37.  이중 필터 스트림 장점

특정 부가 기능 사용이 가능하다

ex) BufferedInputStream

 

기존 코드

FileInputStream fis = new FileInputStream("c:/temp/java/test/test.txt");
byte[] byteBuff = new byte[9999];
int nRLen = fis.read(byteBuff);
fis.close();

 

적용 코드

FileInputStream fis = new FileInputStream("c:/temp/java/test/test.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] byteBuff = new byte[9999];
int nRLen =bis.read(byteBuff);
bis.close();
fis.close();

 

 

직접 코드를 읽어 파일에 접속 하는 것보다 8192바이트의 버퍼를 이용해서 속도를 증가 시킨다.

파일을 주로 다루는 프로그램을 만들 때  필수 

 

 

38.  접근 제한자 개방성과 폐쇄성 순서

public > protected > default(package) > private

 

 

39. final 키워드의 클래스, 메소드, 변수에서 의미

클래스 : 상속 금지

메소드 : 오버라이딩 금지

변수 : 상수화