새소식

IT 기술 면접

[기술면접] 신입이 준비하는 JAVA 기술 면접

  • -

Java를 만든사람


제임스 고슬링

 

 RE. 취업하면서 여러 회사의 기술면접을 봤지만 절대 물어보지 않고 면접관도 모름...ㅎㅎ

 

Java의 대표적인 특징


1. OOP(객체 지향 프로그래밍)이다.
: 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립해 전체 프로그램을 완성하는 개발 기법이다.

2. '가비지 컬렉션'에 의해 메모리가 자동 관리 된다.

3. '멀티 쓰레드'를 지원한다.

4. JVM 위에서 동작하기 때문에 특정 OS에 종속적이지 않고 이식성이 좋으며 보안성도 좋다.

5. 다양한 Open라이브러리들이 존재한다.

가비지 콜렉터란? Click!!

더보기

가비지란?

정리되지 않은 메모리, 유효하지 않은 메모리 주소를 말한다.
이런 것을 프로그래밍 언어로 Dangling Object라고 하고 자바에서는 쓰레기, 즉 Garbage라고 한다.

가비지 콜렉터는 메모리가 부족 할 때 이런 쓰레기(Garbage)를 정리해 주는 프로그램을 말한다.
사용하지도 않으면서 공간을 차지하고 있는 메모리를 해제시키는 프로그램이다. 메모리를 부여받은 JVM이
메모리가 부족해서 OS에 추가요청할 때 가비지 콜렉터가 실행된다. 

 

3. OOP(객체 지향 프로그래밍)이란?

  • Object Oriented Programming의 약자 이다.
  • 객체 지향 프로그래밍은 컴퓨터 프로그램의 Object(객체)들의 모임이다.
  • 각 객체들은 서로 메시지를 주고 받을 수 있으며 데이터를 처리할 수 있다.

  • 위의 그림과 같이 자동차라는 하나의 객체를 만들기 위해서 엔진, 핸들, 타이어 등의 부품 객체들이 결 합하여 하나의 객체를 지향하는 프로그램을 oop라고한다.
  • 객체지향의 특징은 캡슐화, 은닉화, 상속, 다형성 등이 있다. (자세한 설명은 아래에 기술예정..)

 

4. OOP의 장점

  • 프로그램 코드의 재사용성을 높이고, 개발속도가 향상 된다.
  • 프로그램을 유연하고 변경이 용이하게 만든다.
  • 프로그램의 개발과 보수를 간편하게 만든다.
  • 직관적인 코드 분석을 가능하게 한다.
  • OOP의 경우 클래스 하나의 문제를 해결하기 위해 데이터를 모아 놓은 객체를 활용한 프로그래밍을 지향하므로 응집력을 강화하며, 클래스 간에 독립적으로 디자인함으로써 결합력을 약하게 할 수 있다.

 

5. 클래스와 객체의 차이점

  • Class: 현실 세계의 객체의 속성(변수)과 기능(함수)을 추려내 필드와 메소드로 정의한 것이다.
    (아직 메모리가 할당되지 않은 상태)
  • Object: 이 클래스를 설계도라고 보면, 이 설계도를 기반으로 실제 메모리가 잡힌것을 의미한다.
    이런 객체를 조합해 전체 프로그램을 완성해 나가는 방식을 OOP(객체지향프로그래밍)이라 한다.

 

6. 자바의 데이터 타입 중 기본형과 참조형

  [데이터 타입 기본형]
- 실제 값을 저장하는 공간이다.
- 자바가 제공하는 기본형은 byte, short, int, long, float, double, char, boolean 이있다.

  [데이터 타입 참조형]
- 위의 기본형 8가지를 제외하고는 모두 참조형이다. 
(String 문자열을 기본형이라 많이 알고 있는데, 기본형이 아니라 참조형이니 주의하자!!)
- 참조형 변수에 객체를 대입하면 객체가 변수에 저장되는 것이 아니라 메모리상에 객체가 있는 위치를 가리키는 주소만 변수에 저장된다.

  • 자바에서는 제공되는 클래스와 사용자가 만든 클래스 모두 자료형으로 사용될 수 있고, 클래스를 자료형으로 사용하여 저장 공간을 만들었을 경우, 생성된 것을 객체라고 한다.
  • 이때 사용된 클래스를 객체 타입이라 하고, 참조형 변수는 클래스에 정의된 생성자를 사용하여 만들어 진다. 참조형 변수의 default 값은 null이다.

 

7. Java 데이터의 메모리 영역

  JVM이 실행되면 OS 가 JVM에 필요한 메모리를 할당해준다. JVM은 OS로부터 받은 메모리를 나누어 관리한다. 이것을 Runtime Data Area라고 한다.

  • Method 영역 (Class Area)
    어떤 메소드가 호출되려면 먼저 그 메소드를 갖고 있는 클래스 파일이 메모리에 로딩되어 있어야 한다.
    그래서 클래스를 실행할 때 .class파일을 찾아서 메모리에 로딩하는 것이다.
    (그래서 Class 영영이라고도 부른다.)
  • Static 영역
    하나의 java파일을 필드,생성자,메소드로 구성된다. 그 중 필드 부분에서 선언된 변수, 즉 전역변수와 정적 멤버변수(static이 붙은 자료형) Static 영역에 데이터를 저장한다. 
    이 데이터는 프로그램의 시작부터 종료까지 메모리에 남아있게 된다.
  • Stack 영역
    매개변수,지역변수 컴파일 시 메모리를 할당한다.
    메소드내에서 정의하는 기본 자료형(byte,short,int,long,boolean등) 에 해당되는 지역 변수의 데이터의 값이 저장되는 공간이 Stack영역이다. 해당 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다.
  • Heap 영역
    new로 생성된 객체 
    인스턴스를 생성하는 방법은 "클래스명 변수 = new 클래스명();" 의 데이터 타입을 가지는 객체,배열 등은 Heap영역에 데이터가 저장된다.
    이때 변수(객체,객체변수,참조변수)는 Stack영역의 공간에서 실제 데이터가 저장된 Heap 영역의 참조값(메모리에 저장된 주소를 연결해주는 값) 을 new 연산자를 통해 리턴 받는다.
  • 실제 데이터를 갖고 있는 Heap영역의 참조값을 Stack영역의 객체가 갖고있다. 이렇게 리턴 받은 참조값을 갖고있는 객체를 통해서만 해당 인스턴스를 핸들 할 수 있다. 

 

8. 인스턴스란 무엇인가?

인스턴스는 클래스를 통해 표현하는 객체를 실체화한 상태이다.

  • 객체를 프로그램에 실체화 하면 그것을 인스턴스라고 한다.
  • 실체화된 인스턴스는 메모리에 할당한다.
  • 객체는 클래스의 인스턴스다. 
  • 객체 간의 링크는 클래스간의 연관 관계의 인스턴스다.
  • 자바에서는 클래스변수, 인스턴스변수, 지역변수 3종류가 있다. 그 중 클래스 변수와 인스턴스 변수를 합쳐 멤버변수라고 한다. 인스턴스변수는 클래스 내부에 위치하며 객체를 생성해야 사용할 수 있다. 인스턴스 변수의 값을 사용하기 위해서는 인스턴스화 해야 한다.

 

9. OOP의 특징

oop가 무엇인지 알아 볼때 oop의 특징은 자세하게 다루지 않았다. 기본적인 개념이 조금 학습이 된 상태로 특징을 읽으면 받아들이기 수월할 것 같아 뒤늦게 기술합니다.

캡슐화

외부객체에서 구현방식은 알 수 없도록 숨기고 별도로 접근할 수 있는 getter/setter 메소드를 통해 접근하도록 하는 방식이다.

public class CoffeeDTO {
	private int no;
	private String name;
	private String price;
	private String content;
	
}

위와 같이 CoffeeDTO 에 private 접근 제한자으로 변수에 구현방식을 알 수 없도록 구현

접근이 제한된 변수들을 아래와 같이 getter, 와 setter  메소드를 통해 접근을 할 수 있다.

public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}

 

상속

기존 클래스의 기능을 유지하며 추가적인 기능을 추가하여 클래스를 만들고 싶을 때 사용하는 방법이다.
새로운 클래스 생성 시 extends 상위 클래스를 통해 상위 클래스의 모든 기능, 속성을 제공받고 자신의 클래스에는 부가적인 기능, 속성을 추가 할 수  있다. 상속은 코드를 간결화하며, 재사용성을 높인다. 변수와 메소드를 그대로 사용하므로 코드중복을 줄인다.

다형성

하나의 클래스나 함수가 다양한 방식으로 동작 가능 한 것을 말함. 다형성의 효과는 하나의 타입으로 다양한 실행결과를 얻을 수 있어 객체를 부품화해 유지보수 용이하게 한다. 자식이 부모에 들어갈 수 있음. 같은 자료형에 여러가지 객체를 대입하여 다양한 결과를 얻어내는 성질.

class Parent{
	int i =5;
	public int get() {
		return i;
	}
}

class Child extends Parent{
	int i =10;
	public int get() {
		return i;
	}
	
	public void print() {
		System.out.println(i);
	}
}

public class test{
	public static void main(String[] args) {
		Parent a = new Child();
		System.out.println(a.i);
		System.out.println(a.get());
		//a.print();
	}
}

 

 

10. 접근제한자

 

11. Static 이란?

  • 클래스가 로딩될 때, 메모리 공간을 할당하는데 처음 설정된 메모리 공간이 변하지 않는 것을 뜻함
  • 객체를 아무리 만들어도 해당 변수는 하나만 존재한다.
  • static은 단 하나밖에 생기지 않기 때문에 모든 곳에서 이 하나뿐인 메모리 공간을 같이 쓴다
  • 특정한 값을 공유 해야할 때 static 을 쓴다.

 

12. Wrapper클래스란?

  • 기본자료형으로 표현된 데이터를 참조자료형으로 만들어야 할 경우 Wrapper클래스를 사용한다.
  • 기본자료형을 참조형화 해놓은 클래스를 말한다.
  • 주로 java.lang 패키지에 선언되어 있다.
  • 이렇게 8개의 기본타입에 해당하는 데이터를 객체로 포장해주는 클래스로 그것을 Boxing이라고 한다.
  • Wrapper클래스는 각각 타입에 해당하는 데이터를 인자로 전달받아, 해당 값을 가지는 객체로 만들어 준다.
  • 보통 특정 메소드에서 참조 자료형을 인자로 받거나, 기본 자료형이 아닌 객체 자료형으로 저장해야할 경우 객체간 비교가 필요할 경우에 사용한다.

 

Wrapper Class의 사용이유는 무엇일까?

기본 data 타입은 객체가 아니어서 Object로 받는 다형성을 지원할 수가 없다. 하지만, 메소드에서
실제로 기본데이터 타입을 다형성으로 넘겨주어야 하는 경우가 빈번히 발생하는데 이때, 기본데이터 타입을
객체로 변환시켜 전달하기 위해 사용되면 최근에는 AUTO Boxing, Auto UnBoxing 가 지원된다.

 

13. Java의 메소드는 무엇인가?

메소드는 기능 또는 함수이다. 자바에서 클래스는 멤버로 속성을 표현하는 필드와 기능을 표현하는 메소드를 가진다.
메소드는 어떤 특정 작업을 수행하기 위한 명령문의 집합이다. 클래스에서 메소드를 사용하는 이유는 중복되는 코드와 반복적 프로그래밍을 피할 수 있고 모듈화를 통해 코드의 가독성을 좋게 할 수 있다.

  • 접근 제어자                      : 해당 메소드에 접근할 수 있는 범위를 명시
  • 반환 타입(return type)       : 메소드가 모든 작업을 마치고 반환하는 데이터의 타입을 명시
  • 메소드 이름                      : 메소드를 호출하기 위한 이름을 명시
  • 매개변수 목록(parameters)  : 메소드 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시
  • 구현부                             : 메소드의 고유 기능을 수행하는 명령문의 집합

 

14. 생성자가 무엇인가?

  • 생성자는 인스턴스 생성할 때 딱 한번 호출되는 메소드이다.
  • 생성자메소드는 인스턴스 변수 초기화를 목적으로 정의된다.
  • 클래스를 가지고 객체를 생성하면 해당 객체는 즉시 메모리에 생성된다.
  • 이렇게 생성된 객체는 모든 인스턴스변수가 아직 초기화되지 않은 상태이다.
  • 클래스 이름과 같은 이름의 메소드여야하며 반환형이 선언되어있지 않으며, 반환하지 않는 메소드여야 한다.
  • 인스턴스 생성문과 생성자를 호출하는 호출문이 겹쳐있다.

Number num = new Number();

생성자의 특징

  • 생성자는 클래스의 이름과 항상 동일해야 한다.
  • 생성자는 반환값이 없지만, 반환 타입을 void형으로 선언하지 않는다.
  • 객체를 초기화하는 방법이 여러개 존재할 경우는 하나의 클래스가 여러개의 생성자를 가질 수도 있다.
  • 생성자도 하나의 메소드이므로, 메소드 오버로깅이 가능하다. 자바에서 new 연산자로 객체 생성시 자동으로 생성자가 호출됩니다.

 

15. 오버로딩 과 오버라이딩

Method 오버로딩

  • 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는 것이다.
  • 매개변수의 갯수나 타입이 달라야한다.
  • 반환형과 접근 제어자는 영향을 주지 않는다.
public class test {
	
	int width;
	int height;
	int depth;
	
	public test() {
		 width=1;
		 height=1;
		 depth=1;
	}
	
    //int w 매개변수
	public test(int w) {
		 width=w;
		 height=1;
		 depth=1;
	}
    //int w, int h 매개변수
	public test(int w, int h) {
		width=w;
		height=h;
		depth=1;
	}
    //int w, int h, int d 매개변수
	public test(int w, int h, int d) {
		width=w;
		height=h;
		depth=d;
	}
		
}

Method 오버라이딩

  • 상속에서 나온 개념
  • 부모클래스의 메소드를 자식클래스에서 재정의하는 것이다.
  • 오버라이딩 된 메소드는 부모클래스의 메소드보다 우선되어 자식 객체에서 호출 시 
    오버라이딩된 메소드가 호출됨
  • 원래 메소드와 동일한 리턴타입, 메소드 이름, 매개변수 리스트를 가져야함
  • 상속함을 통해서 부모클래스의 메소드를 다른 방식으로 사용하기 위해 재정의하는 것이다.
class Dog{
	public void bark() {
		System.out.println("woof");
	}
}

class Hound extends Dog{
	public void sniff() {
		System.out.println("sniff");
	}
    
    //Dog 클래스에서의 bark함수를 Hound 클래스가 상속받아 사용하였다.
	 public void bark() {
		 System.out.println("bowl");
	 }
}

 

16. 추상클래스란?

추상클래스는 추상메소드를 하나 이상 가진 클래스로 자신의 생성자로 객체생성이 불가한 클래스이다.
(new 연산자를 사용할 수 없다는 뜻이다.)

  • 일반메소드와 추상메소드로 이루어져있다.
  • 클래스에 추상메소드가 하나라도 존재하면 추상클래스이다.
  • 일반메소드가 추상메소드를 호출할 수 없다.
  • 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다. 이러한 추상클래스는 OOP에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해준다. 하위클래스를 참조하여 상위클래스 객체를 생성한다. 하위클래스를 제어하기 위해 사용된다.
  • 추상이란 :  덜 구체화된 좀 더 포괄적이고 개념적인것이다.

 

17. 추상메소드란?

  • 추상메소드는 선언부만 있고 구현부가 없는 메소드를 말한다.
  • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용한다.
  • 추상메소드는 선언만 되고 구현이 되지 않은 불완정한 메소드이므로 객체로 생성되어서는 안된다.
  • 추상메소드를 사용하기 위해서는 반드시 해당 메소드를 재정의해야만 한다.
  • 추상클래스를 상속받는 자손클래스에서 추상메소드의 구현부를 완성해야한다.

 

18. 인터페이스란?

  • 인터페이스는 일종의 추상클래스로 오직 추상메소드와 상수만을 멤버로 갖는 클래스이다.
  • Implements키워트를 사용한다.
  • 상속 관계가 없는 클래스간 서로 공통되는 로직을 구현하여 쓸 수 있도록 한다. 
  • 하나만 상속할 수 있는 Extends와 다르게 Interface는 다중상속이 가능하다.

 

19. 왜 인터페이스를 사용할까?

  • 팀작업시 개발코드 부분과 객체가 서로 통신하는 접점 역할을 지원하게 되는데, 이는 개발코드에선 객체의 내부구조를 모르더라도 인터페이스의 메소드 명만 알고 있으면 되기 때문이다.
  • 이를통해 얻을 수 있는 장점은 해당 메소드를 통해 나오는 결과물을 알고 있기 때문에 다른 팀의 작업을 기다리고 있지 않아도 되며, 또한 해당 객체가 수정될 경우 개발 코드 부분은 수정을 하지 않아도 된다.
  • 또한 부가적으로 객체를 파일에 쓰기 위해 Serializable 인터페이스를 구현하거나 , Collections.sort()를 하기 위해서 Comparable 인터페이스를 상속하는것, Cloneable을 구현하는 것처럼 특정 작업을 하겠다라는 "Mark"역할을 해주기도 한다.

 

20. String 과 StirngBuilder와 StringBuffer의 특징과 차이점

  • String은 불변객체이다. 문자를 수정하려면 지우고 다시 생성해야한다.
  • 문자열 연산이 많으면 성능이 떨어지는데 StringBuffer는 가변할 수 있다.
  • 한번 생성하고 필요할 때 크기를 변경하여 문자를 변경시킬 수 있다.
  • append() 처럼 StringBuilder는 동기화 지원하지 않는다. 멀티쓰레드 환경에 적합하지 않다.
  • 그러나 싱글쓰레드에서는 StringBuffer보다 낫다.

 

21. Thread가 무엇인가?

시스템 내부에서 실행되는 코드의 최소 실행단위를 의미한다. 자바에서는 사용자 프로그램을 통해 쓰레드를 생성하고, 멈추고, 재실행시키는 등의 제어가 가능하다. 쓰레드를 제어하는 작업도 역시 자바가 제공하는 클래스와 인터페이스를 이용한다.

어떤 방식으로 CPU를 할당해서 각 프로세스를 실행할 것인가 하는 것은 OS의 정책에 따라 달라진다. 쓰레드는 바로 이러한 프로세스내의 또 다른 실행단위이다. 자바의 쓰레드는 시분할 방식이 기본이며, 우선순위를 지정해서 실행 순서를 조절할 수 있다.

  • 프로세스: 운영체제로부터 자원을 할당받는 작업의 단위, OS로부터 메모리, 주소공간 등을 할당받음.
  • 쓰레드: 프로세스가 할당받은 자원을 이용하는 실행의 단위이다, 쓰레드는 할당받은 자원들을 내부쓰레드끼리 공유.

 

22. 컬렉션프레임워크(CollectionFramework)에 대해 아는만큼 말해 보시오.

  • Collection 인터페이스
  • List 인터페이스 : 배열과 유사하되, 추가할때마다 자동으로 Boundary를 늘려주는 구조로, 중복된 데이터를 허용하며, 순서가 존재한다. ex) - ArrayList : 배열로 구현됐으며, 인접해 있기 때문에 데이터 조회에 매우 빠르다 하지만, 빈번한 삽입, 삭제시 새로 배열을 만들고 데이터를 옮겨야 하기 때문에 LinkedList에 비하여 속도가 느리다.
  • LinkedList : 링크 구조로 되어 있기 때문에 조회는 ArrayList에 비해 느리지만, 삽입 삭제시 링크를 끊고 새로 추가되는 데이터에 링크만 연결하면 되기 때문에 삽입, 삭제에 유리하다.
  • Vector : 구현 방식은 ArrayList와 유사하지만 Vector를 개선한 것이 ArrayList이다. 또한 Vector의 경우에는 ArrayList와 달리 Synchronized(동기화)가 걸려 있어 여러 쓰레드에서 동시에 접근할 수 없다.

▼Synchronized 클릭!!

더보기

멀티쓰레드 프로그래밍에서는 하나의 객체를 여러 쓰레드가 동시에 접근할 수 있기 때문에 데이터의 일관성을 위해서는 동기화가 필요하다.

  • Set 인터페이스 : 집합처럼 중복된 데이터를 허용하지 않으며, 순서가 없다. 또한, 객체 내부의 중복된 데이터를 배제하고 싶은 경우 Object 클래스의 equals 메서드와 hashCode 메서드의 재정의가 반드시 필요하다. ex) - HashSet
    • TreeSet : 순서가 있는 HashSet으로 이진 트리 구조로 만들어 졌다. 순서에 맞게 정렬되어 저장되기 위해서 Comparable을 구현해야한다.
  • Map 인터페이스 : key와 value 쌍으로 데이터를 저장하며, key는 중복될 수 없고, value는 중복 저장이 가능하다. ex) - HashMap
    • TreeMap
    • Properties : key value 쌍으로 저장되지만 value의 타입이 String만 가능하다.
    • Hashtable : HashMap과 구조는 같으며, 단지 Synchronized(동기화) 되어져 있다는 점이 다른점이다.

 

23. LinkedList와 배열의 차이점은?

  • 배열 : 인덱스를 가짐, 원하는 데이터를 한번에 접근하여 접근 속도가 빠름. 크기 변경 불가. 데이터를 삽입, 삭제 후 그 위치의 다음위치부터 모든 데이터의 위치를 변경해야하는 단점.
  • 연결리스트 : 인덱스 대신 현재 위치의 이전/ 다음 위치를 기억. 크기가 가변적. 한번에 접근 불가, 연결되어 있는 링크를 따라가야 접근 가능하여 배열에 비해 속도가 떨어짐. 데이터 삽입/삭제는 논리적 주소만 바꿔주기 때문에 용이함.
  • 데이터 양이 많지만 삽입/삭제 없으며, 데이터 접근이 빈번할 때 (배열 추천)
  • 데이터 양이 적고, 삽입/삭제가 빈번할 때 (링크드리스트 추천)

 

24. ArrayList<>란?

  • 배열의 확장판이다. 배열의 크기를 임의적으로 변화시킬 수 있으며 list안에 들어가 데이터 타입을 설정할 수 있다. (add, remove, isEmpty, size, get, indexOf 등의 메소드가 있다.)

 

25. 제네릭이란?

  • 클래스에서 사용할 타입을 클래스 외부에서 설정하는 것이다.
  • 만들어져 있는 클래스를 내가 원하는 형태로 사용할 수 있다.
  • < > 안에 들어갈 수 있는 것은 참조자료형(클래스, 인터페이스, 배열) 뿐. 기본자료형을 사용하기 위해선 wrapper 클래스를 이용해야 한다.

 

26. 컬렉션 클래스에서 제네릭을 사용하는 이유는?

  • 컬렉션 클래스에서 제네릭을 사용하면 컴파일러는 특정 타입만 포함 될 수 있도록 컬렉션을 제한한다.
  • 컬렉션 클래스에 저장하는 인스턴스 타입을 제한하여 런타임에 발생할 수 있는 잠재적인 모든 예외를 컴파일타임에 잡아낼 수 있도록 도와준다.

 

27. Hash란?

  • 내부적으로 배열을 사용(HashTable)하여 데이터를 저장, 검색 속도가 빠름. 데이터 삽입/삭제시 기존 데이터를 밀어내거나 채우지 않고, 데이터와 연관된 고유한 숫자를 생성해 이를 인덱스로 사용.

 

28. Call by Reference, Call by Value

  • Call by Reference - 매개 변수의 원래 주소에 값을 저장하는 방식. 클래스 객체를 인수로 전달한 경우
  • Call by Value - 인수로 기본 데이터형을 사용. 주어진 값을 복사하여 처리하는 방식. 메서드 내의 처리 결과는 메서드 밖의 변수에 영향을 미치지 않는다.
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.