EnjoyCSStudy / CS-Knowledge-Source

0 stars 0 forks source link

240114 Java & Spring Interview Question #10

Open BaeYoungSuk opened 5 months ago

BaeYoungSuk commented 5 months ago

Java & Spring 관련 면접 질문 달아주세요!

이전 질문들

BaeYoungSuk commented 5 months ago

추상 클래스와 인터페이스를 정의하고 둘의 차이를 설명해주세요.

skydreamer21 commented 5 months ago

Call By Value와 Call By Reference에 대해 간략히 설명하고 Java에서는 어떠한 방식으로 동작하는지 설명해주세요.

soun997 commented 5 months ago

스프링 Bean이 무엇인가요?

rt3310 commented 5 months ago

war와 jar의 차이점에 대해 설명해주세요

rt3310 commented 5 months ago

추상 클래스와 인터페이스를 정의하고 둘의 차이를 설명해주세요.

먼저 추상 클래스(abstract class)는 클래스 내에 추상 메서드가 하나 이상 포함된 클래스를 말한다. 클래스 안에 메서드가 하나 이상 있다면 그 클래스 앞에는 반드시 abstract 클래스명으로 표기되어야 하며 abstract와 final 키워드를 동시에 표기할 수 없다. 일반 클래스에서 추상 클래스를 상속을 받는다면 추상 메서드가 있을 경우 모두 구현해주어야 한다. 반면 인터페이스(interface)는 모든 메서드가 추상 메서드인 경우이다. 추상 클래스와 인터페이스는 두 부분에서 큰 차이점을 말할 수 있는데, 첫째로 상속이다. 자바는 다중상속이 불가능하다는 특징이 있다. 때문에 추상클래스는 여러 개 상속하여 구현하는 것이 불가능하다. 반면 인터페이스는 여러 개를 구현할 수 있다. 둘째로 목적에 차이가 있다. 추상 클래스는 상속받아서 기능을 이용하고 확장시키는데 목적이 있다. 반면 인터페이스는 함수의 구현을 강제하여 구현 객체의 동작을 보장시킨다는 목적이 있다. 즉, 추상 클래스의 경우 is a, 인터페이스의 경우 has a의 관계로 볼 수 있다. 현대에선 인터페이스의 private 메서드 지원, default 메서드 지원 등으로 그 구분이 더 모호해지고 대부분의 개발자들이 인터페이스를 더 많이 사용하는 추세이다.

Call By Value와 Call By Reference에 대해 간략히 설명하고 Java에서는 어떠한 방식으로 동작하는지 설명해주세요.

함수의 매개변수에서 값 복사와 주소 값 참조에 따라 구분되는 용어이다. 자바에서는 call by reference는 존재하지 않는다. 왜냐하면 C와 달리 자바에서는 포인터를 철저하게 숨겨 개발자가 직접 메모리 주소에 접근하지 못하게 조치했기 때문이다. 즉, 자바에서 파라미터는 call by value로서만 동작하며, 원시값이 복사되느냐 주소값이 복사되느냐의 차이가 있을 뿐이다. 그리고 매개변수에 복사된 값에 따라 원시값이면 바로 연산을 하고 주소값이면 해당 메모리 주소를 참조해 값을 가져와 연산할 뿐이다. 다만 외부적인 관점에서 보면 주소값이 복사되든, 포인터를 이용해 참조하든, 메모리 안에 있는 데이터를 참조해 연산하는 동작 자체는 같기 때문에 사용하는 입장에서는 차이가 없다고 볼 수 있다.

스프링 Bean이 무엇인가요?

스프링 빈은 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트이다. 즉, 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 하나 이상의 빈을 관리한다. 빈은 인스턴스화된 객체를 의미하며, 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다. @Bean 어노테이션을 통해 메서드로부터 반환된 객체를 스프링 컨테이너에 등록한다. 빈은 클래스 등록 정보, Getter/Setter 메서드를 포함하며 컨테이너에 사용되는 설정 메타데이터로 생성된다.

war와 jar의 차이점에 대해 설명해주세요

JAR는 자바 애플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 파일이다. class 및 라이브러리 파일을 포함한다. jar는 필요한 경우 이 파일을 직접 실행할 수 있고, 다른 곳에서 라이브러리로 사용할 수 있다. 직접 실행하는 경우 메인 메서드가 필요하고, MANIFEST.MF 파일에 실행할 메인 메서드가 있는 클래스를 지정해두어야 한다. WAR는 Servlet / Jsp 컨테이너에 배치할 수 있는 웹 애플리케이션 압축파일 포맷이다. JSP, Servlet, JAR, Class, XML, HTML, Javascript 등 웹 관련 자원을 포함하며 별도의 웹서버 또는 WAS를 필요로 한다. JAR 파일이 JVM 위에서 실행된다면, WAR는 웹 애플리케이션 서버 위에서 실행된다. 그리고 WAR는 지정된 구조를 지켜야한다.

BaeYoungSuk commented 5 months ago

추상 클래스와 인터페이스를 정의하고 둘의 차이를 설명해주세요.

추상 클래스는 클래스 내에 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 것을 말합니다. 인터페이스는 모든 메서드가 추상 메소드로만 이루어져 있는 것을 의미합니다. 인터페이스는 다중 상속이 가능하지만, 추상 클래스는 다중 상속이 불가능하다는 특징이 있습니다. 인터페이스는 정의된 메소드를 각 클래스에 목적에 맞게 기능을 구현하는 느낌이라면, 추상 클래스는 자신의 기능들을 하위 클래스로 확장시키는 느낌을 가지고 있습니다.

Call By Value와 Call By Reference에 대해 간략히 설명하고 Java에서는 어떠한 방식으로 동작하는지 설명해주세요.

함수가 인수를 전달하는 방식에 따라 Call by Value와 Call by Reference로 나눌 수 있습니다. Call by Value는 매개변수의 값을 직접 복사하며, Call by Reference는 주소값을 복사합니다. 따라서 함수에 의해 매개변수가 변경될 가능성이 있으며, 자바에서는 Call by Value 방식으로 동작합니다.

스프링 Bean이 무엇인가요?

빈은 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트입니다. 즉 스프링 컨테이너가 관리하는 자바 객체를 의미합니다.

war와 jar의 차이점에 대해 설명해주세요

모두 압축된 아카이브 파일로 Jar가 War의 상위 개념입니다. War는 특정한 웹 컨테이너에서 호스팅하는데 적합하며, 독립적인 Java 애플리케이션에는 Jar를 사용하는 것이 적합합니다.

skydreamer21 commented 5 months ago

추상 클래스와 인터페이스를 정의하고 둘의 차이를 설명해주세요.

추상 클래스와 인터페이스는 모두 구현되지 않은 메서드를 가질 수 있습니다. 그러나 추상 클래스의 경우 구현된 메서드 또한 가질 수 있고 클래스로 정의되어 있어 다중 상속이 불가능합니다. 이러한 기능의 차이로 사용하는 목적에 차이가 생깁니다. 추상클래스는 자신의 기능을 하위클래스에 확장할 때 쓰게 되고 인터페이스의 경우 각 클래스의 목적에 맞기 인터페이스의 기능을 구현하고자 할 때 쓰게 됩니다.

또한 추상클래스는 설계시 논리적인 클래스 상속 구조가 있기 때문에 하위 클래스의 구현에 제약을 줄 수 있습니다. 하지만 인터페이스는 이러한 상속 구조가 없어 전혀 관계가 없는 클래스에 형제 관계를 부여해줄 수 있기 때문에 다형성을 좀 더 자유롭게 쓸 수 있습니다.


Call By Value와 Call By Reference에 대해 간략히 설명하고 Java에서는 어떠한 방식으로 동작하는지 설명해주세요.

두 방식은 함수가 인수를 전달할 때 사용되는 방식을 나타냅니다. Call By Value는 함수가 인수로 전달받은 값을 복사하여 처리하는 방식 입니다. 복사했기 때문에 해당 값을 수정하더라도 원본 값은 변경되지 않아 불변성이 보장됩니다. 하지만 복사를 하기 때문에 메모리 사용량이 늘어납니다. Call By Reference는 함수 호출 시 인수로 전달되는 변수의 참조값을 함수 내부로 전달하는 방식입니다. 복사를 하지 않기 때문에 성능 상에서 이점이 있으나 수정에 의해 원본 값이 변경될 수 있습니다.

Java는 Call By Value로 동작합니다. 객체를 함수의 인수로 넘길 시 해당 객체의 주소값이 복사되어 독립된 메모리 공간에 저장됩니다. 따라서 함수 안에서 해당 파라미터에 새로운 객체를 할당하더라도 원본 객체는 변하지 않습니다.


스프링 Bean이 무엇인가요?

Bean은 스프링 컨테이너가 관리하는 인스턴스화 된 객체를 의미합니다. Spring에서 Bean을 사용함으로써 더욱더 객체지향적인 프로그래밍을 할 수 있습니다. Bean으로 관리되는 객체는 개발자가 직접 객체를 생성하는 코드를 만들 필요없이 외부에서 주입받는 것, 즉 Dependency Injection이 가능합니다. 따라서 클래스가 내부의 구체 클래스에 의존하지 않고 인터페이스에 의존하게 할 수 있고, 클래스 로딩 시점이 아닌 런타임 시에 의존관계가 결정되는 유연한 설계가 가능합니다.

soun997 commented 5 months ago

추상 클래스와 인터페이스를 정의하고 둘의 차이를 설명해주세요.

추상 클래스 클래스 내에 추상 메서드가 하나 이상 포함되거나 abstract로 정의된 클래스

인터페이스 모든 메서드가 추상메서드인 클래스


Call By Value와 Call By Reference에 대해 간략히 설명하고 Java에서는 어떠한 방식으로 동작하는지 설명해주세요.

Call By Value

메서드의 호출자가 넘겨준 값과 메서드의 수신자가 파라미터로 받은 값인 복사된 서로 다른 변수이다.

Call By Reference

메서드의 호출자가 참조를 넘겨주기 때문에 메서드의 수신자가 파라미터로 받은 값은 동일한 변수에 대한 참조이다.

Java에서의 동작 방식

Java는 오직 Call by Value로만 동작한다.


스프링 Bean이 무엇인가요?

스프링 컨테이너에 의해 관리되는 재사용 가능한 자바 객체이다. 객체의 생명주기 관리를 스프링 컨테이너에 위임하고, 스프링이 객체 간 의존관계를 관리하도록 하기 위해 사용한다.


war와 jar의 차이점에 대해 설명해주세요

war

jar

스프링부트는 톰캣을 jar 파일 안에 내장하고있기 때문에 jar 파일로도 빌드와 배포가 가능하다.