본문 바로가기

50초짜리 IT 기술 면접 답변

프로그래밍 대답준비-기본편

안녕하세요. 진또배기입니다. 오늘은 프로그래밍 대답준비 기본 답변에 대해 준비하는 시간을 가지겠습니다. 질문 한 가지가 나오면 그와 관계되어 있는 꼬리질문까지 준비해 여러분의 시각을 넓히고자 포스팅하게 되었습니다. 한 가지 개념만 아는 것을 지양하고 한 개념으로부터 파생되는 더 깊은, 더 넓은 개념을 가져가시길 바랍니다! 

제가 경험해본 바로는 'OO의 개념에 대해 설명해주세요'보다는 'OO과 OO의 차이점을 비교설명해주세요.'나 'OO의 장점과 단점은 어떤 것이 있나요?'또는 '~~을 하는(쓰는) 이유는 무엇인가요?와 같은 질문을 많이 받았기 때문에 이에 대한 답변을 준비했습니다.
매우 기본적인 50초의 답변으로 프로그래밍에 대해 좀 아신다하는 분들은 심화편에서 뵙겠습니다.

 

그럼 시작하겠습니다.

1. 객체지향 프로그래밍 OOP의 특징에는 어떤 것이 있나요?
OOP의 특징에는 추상화, 캡슐화, 정보 은닉, 상속, 다형성이 있습니다. OOP를 한다는 것은 어떻게 하면 유지보수를 잘할까의 관점이라고 생각합니다. 그 이유는 코드의 재사용과 중복제거를 통해 효율을 높이기 때문입니다.

부끄럽지만 저는 이것을 A C PI 랄 (에이씨피랄)로 외웁니다.... A(추상화 Abstract), C(캡슐화, Capsulation), P(정보은닉, Private), I(상속, Inheritance), 랄(다형성, Variety) 머리로 이해하려고해도 워낙 자주 나오는 문제 및 질문이다보니 이렇게 외우게 되었습니다...ㅎㅎ(좀 욕같아도 양해부탁드려요!)

1-1. 상속과 컴포지션(합성)의 차이에 대해서 설명해주세요
상속은 is a 관계, 컴포지션은 개체들 간의 has a 관계입니다. 상속은 클래스를 확장해 부모 클래스에서 속성 및 동작을 상속하는 기능이구 요. 컴포지션은 클래스가 구성원 데이터로 다른 클래스의 객체를 포함할 수 있는 능력입니다.

1-2 interface와 abstract(추상화)를 비교해서 설명해주세요.
인터페이스는 일종의 추상 클래스이며 오직 추상 메서드와 상수만 멤버로 갖 습니다. 상속의 관계가 없는 클래스간 서로 공통되는 로직을 구현하여 쓸 수 있습니다. abstract는 추상 메서드를 하나 이상 가진 클래스이며, 자신의 생성자로 객체 생성이 불가능합니다. 하위 클래스를 참조해 상위 클래스의 객체를 생성하여 하위 클래스를 제어하기 위해 사용합니다.

1-3 음 그러면 다형성이 뭔가요?.
다형성이란, 하나의 메소드나 클래스가 같은 형태이지만 다른 기능을 하는 것을 의미합니다. 예를 들면 +연산자는 숫자자료형 사이에사용하면 더하기 기능을 하지만, 문자열 사이에 사용하면 연결기능을 합니다. 이처럼 다형성은 오버라이딩 기능과 관련되어 있습니다.

1-4 오버로딩과 오버라이딩의 차이에 대해 설명해주세요.
오버로딩(Overloading)은 같은 이름을 갖고 있지만, 서로 다른 매개변수 형식을 가지고 있는 메소드를 여러개 정의하는 것입니다. 오버로딩의 조건은 메소드의 이름이 같아야 하고, 매개변수의 개수 또는 매개변수의 자료형이 달라야합니다. 메소드의 리턴타입은 같아도 되고 달라도 됩니다. 오버로딩을 사용함으로써 프로그램의 가독성을 증가시킬 수 있습니다.

2. 자바의 메모리 영역에 대해서 설명해주세요. 
자바의 메모리 영역은 3가지로 분류됩니다. 메서드 영역과 스택 영역, 힙 영역입니다.
메서드 영역은 static 변수, 전역 변수, 코드에서 사용되는 클래스 정보들이 올라갑니다. 코드에서 사용되는 클래스들을 로더가 읽고 클래스 별로 분류해서 저장합니다.  스택(Stack)영역은 지역 변수, 메서드 등이 할당되는 LIFO 방식의 메모리입니다. 힙(Heap)영역은 new 연산자를 통해 동적할당된 객체들이 저장되고, 메모리는 가비지 컬렉션에 의해 관리됩니다. 

2-1. 메모리 상수풀 영역에 대해 설명해주세요.
힙 영역에서 생성되고 자바 프로세스 종료까지 계속 유지되는 메모리 영역입 니다. 기본적으로 JVM에서 관리하고 있구요. 프로그래머가 작성한 상수에 대 해 최우선으로 찾아보고 없으면 상수풀에 추가한 후 그 주소값을 리턴해줍니다. 이로써 메모리 절약 효과를 가져올 수 있습니다. 

2-2 Garbage Collector란 무엇인지 설명해주세요.
가비지 컬렉터(Garbage Collector)는 메모리가 부족할 때 쓰레기, 즉 Garbage를 정리해주는 프로그램을 말합니다. 가비지는 유효한 메모리가 아니기 때문에 메모리가 낭비됩니다. 따라서 JVM의 가비지 컬렉터는 가비지를 다른 용도로 사용할 수 있게 '메모리 해제'를 시키는 프로그램입니다. 
JVM은 메모리를 부여받고 프로그램을 실행하다가 메모리가 부족해지는 순간이 오면 OS에게 추가로 메모리를 더 요청하게 됩니다. 바로 이 때 가비지 컬렉터가 실행됩니다.  

3. 인터페이스가 뭔가요? 
인터페이스는 모든 메서드가 추상 메서드로 이루어진 클래스입니다. 특징으로는 따로 abstract를 쓰지 않아도 모두 추상 메서드로 정의가 되구요. 선언한 변수는 자동으로 final static 키워드가 붙습니다. 인터페이스는 interface 키워드를 통해 선언할 수 있으며 implements 키워드를 통해 일반 클래스에서 인터페이스를 구현할 수 있습니다. 

3-1. 인터페이스를 왜 사용하나요?
객체지향 프로그래밍의 성격중 다형성을 극대화해 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 사용합니다. 예를 들면 인터페이스는 팀 작업을 할 때 개발코드와 객체 가 서로 통신하는 접점 역할을 지원합니다. 개발코드에서는 객체의 내부 구조를 모르더라도 인터페이스의 메서드 명만 알면 다른 팀의 작업을 기다리지 않아도 됩니다. 또한 해당 객체가 수정이 되더라도, 개발 코드 부분은 수정하지 않아도 되는 장점도 있습니다. 이처럼 인터페이스를 통해 팀 단위로 큰 프로젝트를 효율적으로 진행할 수 있습니다.

4. 직렬화란 무엇인가요?
자바에서 입출력에 사용되는 것은 스트림이라는 데이터 통로를 통해 이동합 니다. 하지만 객체는 바이트형이 아니기 때문에 스트림을 통해서 저장하거나 네트워크로 전송하는 것이 불가능합니다. 따라서 객체를 스트림으로 입출력 하기 위해서 바이트 배열로 변환하는 것을 직렬화라고 합니다. 반대로 스트림으로 받은 직렬화된 객체를 다시 원래로 돌리는 건 역직렬화라고 말합니다. 

5. 자바의 클래스 멤버 변수 초기화 순서에 대해 설명하세요
static 변수 선언부는 클래스가 로드 될 때 변수가 제일 먼저 초기화 됩니다. 필 드 변수 선언부는 객체가 생성될 때 heap 메모리에 올라가고 생성자 block보 다 앞서 초기화됩니다. 생성자 block은 객체가 생성 될 때 마찬가지로 heap 메 모리에 올라가는데요. 이때 필드 변수가 초기화 될 때까지 JVM에서 내부적으로 로킹해줍니다.

6. 객체지향과 절차지향 프로그래밍에 대해 비교설명해주세요.

1) 객체지향의 정의는 실제 세계를 모델링하여 소프트웨어를 개발하는 방법입니다. 대표적인 객체지향 언어에는 Java가 있습니다. 객체지향의 장점으로는 코드의 재활용성이 높고, 코딩 방식이 절차지향보다 간편하며 디버깅이 쉽다는 특징을 가지고 있습니다. 반면 단점으로는 처리속도가 절차지향보다 상대적으로 느리며, 설계에 많은 시간이 소요된다는 점이 있습니다.

2) 절차지향의 정의는 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시 되며, 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법입니다. 대표적인 절차지향 언어에는 C언어가 있습니다. 컴퓨터의 작업 처리 방식과 유사하기 때문에 객체지향 언어를 사용하는 것에 비해 더 빨리 처리되어 시간적으로 유리하다는 특징이 있습니다. 반면 객체 지향에 비해 유지보수가 어려우며 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다는 점과 디버깅의 어려움이 있습니다. 

+ 객체지향의 반대는 절차지향이 아니며 절차지향의 반대는 객체지향이 아닙니다. 절차지향은 데이터를 중심으로 함수를 구현하고, 객체지향은 기능을 중심으로 메소드를 구현합니다.

7. JVM이 하는 역할이 무엇인가요? 
JVM은 자바를 실행하기 위한 가상 기계입니다. 자바의 바이트 코드를 운영체 제에 맞게 해석해주는 역할을 하는데요. 자바 컴파일러가 .java 파일을 컴파일 하면, .class라는 자바 바이트 코드로 변 환시켜줍니다. 이때 바이트 코드가 기계어가 아니기 때문에 운영체제에서 바로 실행이 되지 않습니다. 이때 운영체제가 이해할 수 있도록 해석해주는 것이 JVM입니다.

8. 제너릭이 무엇인가요?
클래스를 선언할 때 타입을 결정하지 않고 객체 생성 시 유동적으로 재사용하 기 위한 것을 말합니다. 제너릭을 활용하면 따로 형변환할 필요가 없고, 타입에러가 발생하지 않기 때문에 유용하게 사용할 수 있습니다.

8-1. 컬렉션 클래스에서 제너릭을 사용하는 이유를 설명해주세요.
컬렉션 클래스에서 제너릭을 사용하면, 컴파일러는 특정한 타입만 포함될 수 있도록 컬렉션을 제한합니다. 컬렉션 클래스에 저장되는 인스턴스 타입을 제 한하여 런타임에 발생할 수 있는 잠재적인 모든 예외를 컴파일 타임에 잡아낼 수 있도록 도와주기 때문에 사용합니다. 

9. 전역변수와 지역변수는 각각 무엇이며 어떤 경우에 사용하는지 설명해주세요.
전역변수는 함수 바깥에 선언하여 클래스 전체에서 사용가능한 변수입니다. 여러 메소드에서 공통적으로 사용할 수 있습니다. 지역변수는 함수 속에 선언하여 해당 함수 속에서만 사용가능한 변수입니다. 지역변수는 해당 메소드가 호출되어 메모리를 할당받은 후 종료되면 소멸되어 다시 사용할 수 없습니다. 

10. Call by value와 Call by reference의 차이점에 대해 알려주세요.
함수 호출 방법에는 크게 두 가지가 있는데 Call by value와 Call by reference가 있습니다. Call by value(값에 의한 호출)같은 경우에는 함수에 인자로 받은 값을 복사해서 호출하는 방식입니다. 장점으로는 값을 복사해 사용하기 때문에 안전하다는 장점이 있지만, 메모리에 이 복사값이 쌓이게 되면 처리속도가 느려질 수 있다는 단점이 있습니다. Call by reference(참조에 의한 호출)의 경우에는 인자로 받은 값의 주소를 참조해 직접 값에 영향을 줍니다. 장점으로는 복사하지 않고 직접 참조를 하기 때문에 빠르지만 원본의 데이터 값을 훼손할 수 있다는 단점이 있습니다.

오늘은 50초 IT 기술면접 답변에 대해 준비해보았습니다. 수정 및 추가할 사항이 있으면 바로 포스팅하도록 하겠습니다.

진또배기 올림