본문 바로가기

TIL

기술면접 대비: 백엔드 신입에게 자주 물어보는 질문들

면접 일정이 잡혔다.

많은 개발자, 백엔드 신입 개발자라면 다른 취준생과 다르게 겪는 관문이 있다.

하나는 기술면접, 다른 하나는 코딩테스트이다.

마음 같아서는 면접 한 번만에 휘~익 합불 여부가 결정되었으면 좋겠으나,

어디까지나 취준하는 사람의 입장일 뿐..

 

아무튼, 이번 면접은 기술면접이며, 백엔드를 목표로 하는 많은 신입 개발자들에게 물어보는,

보편적인 기술적(?) 질문들을 훑어보고자 한다.

 

객체지향 언어(OOP)와 절차지향 언어(POP)의 차이점이 뭐에요?

정보처리기술사를 준비하는 사람이라면 꼭 듣는 내용 중 하나이다.

절차지향(Procedural Oriented Programing)과 객체지향 (Object Oriented Programing) 과의 차이는 무엇일까?

사실 단어에서도 이미 답이 적혀있듯, 절차지향은 순서를 중점으로 진행되는 것이고,

객체지향은 객체, 즉 Object로 단위단위로 묶은 다음, 필요할 때 꺼내 쓰는 방법이다.

이해를 돕기 위해 간단한 그림을 가져왔다.

좌: 절차지향, 우: 객체지향

좌측은 절차지향 프로그램의 동작 방식의 예시이다. 초중고시절에 많이 그렸던 모식도와 비슷하지 않은가...?

우측은 객체 지향, 즉, 미리미리 엔진이라던지, 운전자라던지, 자동차라던지.. 객체로 만들어 놓은 다음에,

이를 필요할 때 꺼내서 구현하는 방식이다.

 

그럼, 필요할 때 꺼내기 위해서는 어떻게 해야 할까?

(1) 바로 캡슐화(Encapsulation)를 하면 된다.

캡슐이라고 하면 단어에서도 내포하듯 안에 어떠한 물체를 동봉시키는 것이다.

객체를 캡슐로 동봉을 하여 그 내부를 보호하는 것이 객체지향 언어의 특징이다.

이전에서도 기술하였듯, class(클라스)를 선언하고 그 안에 내용을 적는 것이, 일종의 캡슐화로 볼 수 있다.

이렇게 class로 선언된 내용물은 instance(인스턴스)로 복제되어(필요할 때 꺼내어) 사용이 되어진다.

내용물의 경우 함수로 작성이 된다. 여기서 함수는 서로 식별이 가능해야 하는 데(꺼내서 쓰려면 당연히 알아야 하니),

함수의 이름을 같게 쓰더라도, 반환값 혹은 인자값이 다르더라도 식별이 가능하다.

하지만 이런 경우 과적하다라는 용어를 사용하여 오버로딩(Overloading)이라고 표현을 한다.

class OverloadingMethods {
	public void print() {
		System.out.println("오버로딩1");
	}

	String print(Integer a) {
		System.out.println("오버로딩2");
		return a.toString();
	}

	void print(String a) {
		System.out.println("오버로딩3");
		System.out.println(a);
	}

}

위의 코드가 대표적인 예시가 되겠다.

 

 

자, 바로 객체지향 언어의 첫 번째 특징, 캡슐화가 나왔다.

(2) 다음은 상속(Inheritance)이다. 상속은 원래 그 의미와 동일하다. 부모로 부터 물려받는 다는 것!

class는 캡슐화 되어 있다고 해서 서로 영향을 아얘 안 주는 것이 아니다.

class를 선언하고 어느 한 개는 부모, 다른 한 개는 자식 class 로 선언하여, 자식이 부모의 성질을 물려받을 수 있는 게 가능하다.

(이 부분은 얘전에 설명을 하였기 때문에 넘어간다. 양해 부탁드린다..)

 

여기서, 만약 자식이 부모의 성질을 좀 바꿔서 영향을 받고 싶다면? 예를 들어, 부모는 원화를 물려주었는데, 나는 달러로 받고 싶다면?

이럴 경우 자식이 부모로 부터 물려받는 내용물(함수)를 틀 안에서 조금 바꿔서 사용이 가능하다.

그리고 이러한 행위를 오버라이딩(Overriding)이라 한다.

 

 

(3) 다음으로는 추상화(Abstraction)가 있다.

위에서 말했듯 class는 인스턴스로 찍어내어서, 심지어 오버라이딩을 해서 자기가 원하는 방식대로 각자 구현이 가능하다.

하지만, 이렇게 다양한 용도로 찍어내서 사용하는 만큼, 원본인 class를 어느정도 다용도에 맞게 맞춰야 하고, 이것이 추상화다.

 

예를 들어 다양한 리모콘을 만들어야 한다고 가정하자. 에어컨 용 리모콘, TV 용 리모콘, 마사지기계 리모콘...

하지만 각각 별개로 만들기 보단, 리.모.콘이라는 하나의 유사한 틀을 만들어 찍어낸 다음, 

각각 용도에 맞게 조금씩 변형하여 쓰면 된다. 여기서 그 하나의 유사한 틀은 추상화 작업으로 이루어진다.

 

 

(4) 마지막, 바로 다형성(polymorphism)이다.

단어가 좀 어려울 수 있다. 한자어를 해석해 보면 性, 즉, 다양한 종류의 모형을 띌 수 있는 성질을 의미하는데,

사실 이는 위에서 설명이 들어갔다!

 

바로 오버라이딩오버로딩이다. 부모에서 선언된 함수를 자식 클라스에서 오버라이딩 하여 틀 안에서 바꿀 수 있고,

같은 함수 명이라도 인자나 반환값이 다르면 각각 다르게 인식되는 일종의 유연함으로 이해를 하면 되겠다.

실제로 위키피디아에도 이와 유사하게 적혀있다. 다형성이란,

"프로그램 언어의 각 요소들(상수, 변수, , 오브젝트, 함수, 메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질을 가리킨다."

 

 

그럼 오늘도...

끝!

 

글 작성에 도움을 준 영상입니다: https://youtu.be/ryDeTfmSY_o

나마스테~