동아리 면접 예상질문
9/8일 6시까지 제출했던 1차 서류전형에 통과를 했다... 하하 행복하다... 근데 면접도 있지 참...
(현재 면접을 보고 온 직후고, 이번주 일요일 발표)
이번에 합격할지도 모르고, 내 다음 면접이 언제일지 모르지만, 기록겸 그냥 면접준비했던 예상질문과 답을 업로드 해본다. (임시저장만 해놔야겠다 지원자 모두 다 면접 끝나면 올려야지)
사실 기술면접 외 질문들은 조금 많이 비어있다.. 한번 해보니 능숙하게 답할 수 있을 것 같아서 굳이 안적고 말로 준비했다.
0. 자기소개 해주세요.
안녕하십니까 _________ 파트에 지원하게된 지원자 홍해담 입니다.
저는 어릴 때부터 창업에 관심이 많아 다양한 경험을 쌓아봤습니다.
포차주방에서 요리를 배우고, 의류 쇼핑몰에서 일하면서 직접 쇼핑몰을 운영해본 경험이 있습니다.
이러한 경험들을 통해 저는 아이디어를 사업화하고, 실패하더라도 포기하지 않고 계속 도전하는 것이 제 꿈이라는 것을 확신하게 되었습니다.
그 과정에서 저는 초기자본 이 적게 들어도 지속적으로 창업할 수 있는 개발자의 길을 걷기로 결심했습니다.
특히, 백엔드 개발자가 되어 사이드 프로젝트로 다양한 서비스를 만들어가며 살고 싶다는 구체적인 목표를 가지게 되었습니다.
하지만 현재의 지식과 실력은 제가 원하는 서비스를 구현하기에는 아직 부족하다는 것을 느끼고 있습니다.
그래서 저는 ________에 입문하여 6개월 동안 서버에 대한 기본적인 개념을 배우고, Spring Boot와 같은 Java 웹 프레임워크를 능숙하게 다루고 싶습니다.
________ 에서 훌륭한 팀원들과 함께 팀 프로젝트에 참여하며 서비스를 만드는 전반적인 과정을 경험하고 싶습니다.
이를 통해 저의 목표를 향해 한 걸음 더 나아갈 수 있을 것이라 믿습니다. 감사합니다.
1. 지원동기를 말씀해주세요.
어릴 때부터 창업에 관심이 많아 포차주방에서 요리를 배우고, 의류쇼핑몰에서 일하며 2년간 제 쇼핑몰도 운영해봤습니다.
제 꿈은 아이디어를 사업화하고, 실패해도 '계속' 다시 도전하는 것입니다.
때문에 자본이 거의 없이 창업을 지속할 수 있는 '개발자'가 되고 싶다고 생각했었습니다.
구체적으로는 한 회사의 백엔드 개발자로서, 사이드 프로젝트로 제 서비스를 하나씩 만들어가며 살고 싶습니다.
하지만, 아직 목표에 비해 아는 지식과 실력이 턱없이 부족합니다. 아직 원하는 서비스를 구현할 수 있는 단계가 아닙니다.
제 목표를 이루기 위해서, UMC 서버파트에 입문해서 6개월간 서버에 대한 기본적인 개념을 배우고 싶습니다. 기본적인 개념 위로 spring boot라는 자바 웹프레임워크를 능숙하게 다룰 수 있게 되고 싶습니다.
UMC에서 매일매일 후회없이 공부해서 성장하고, 훌륭한 팀원들과 함께 팀 프로젝트에 참여하여 서비스를 만드는 전반적인 과정도 경험하고 싶습니다.
제 목표를 위해 공부하는 매일이 행복할 것 같습니다. 제 커리어의 첫번째 스텝으로 UMC가 정말 간절합니다.
아까 자기소개에서 말씀드렸듯이 제 꿈은 백엔드 개발자가 되어 사이드 프로젝트로 제 서비스를 하나씩 만들어가며 사는 것입니다.
하지만 아직 목표에 비해 아는 지식과 실력이 부족하기 때문에,
UMC라는 훌륭한 동아리에서 서버에 대한 기본적인 개념부터 백앤드개발자로서 프로젝트 전반에 참여해보는 과정을 경험하고 싶습니다.
제가 비약적으로 성장할 수 있는 소중하고 절실한 기회라고 생각합니다.
2. 스프링부트 커리큘럼을 선택한 이유를 말해주세요. 왜 다른파트는 지원하지 않으셨나요?
Node.js도 훌륭한 백엔드 개발 도구이며, 많은 장점이 있지만, 제가 **스프링(Spring Boot)**을 선택한 이유는
저는 객지2와 웹서버프로그래밍 등의 수업으로 Java를 다뤄봤고, 개인프로젝트도 자바로 진행했습니다.
그만큼 JAVA에 익숙해졌기 때문이기도 하지만, 구체적으로는 자바 호환 웹프레임워크인 스프링을 배워 상대적으로 더 빠르게 제 실력을 더 높고 견고하게 만들고 싶은 갈증 때문입니다.
3. 지원서에 적어주신 프로젝트 내용에 대해서 설명해주세요.
원피스 프로젝트
식물질병진단
쇼핑몰 프로젝트
C로 구현한 미로
4. 다른팀원과 팀 개발중 갈등이나 불화가 생길 수도 있는데 그렇다면 어떻게 해결하실 건가요?
5. Umc는 한학기+방학동안 이루어지며 3학점 짜리 전공 급시간 할애가 필요한 활동이다. 자신의 스케줄에 지장이 갈수 있는데 괜찮을지?
UMC에 얼마나 시간투자가 가능하신가요?
우선, 저는 현재 제 목표인 개발자로 성장하기 위해 UMC에서 제공하는 교육과 팀 프로젝트 경험이 매우 중요하다고 생각합니다.
UMC 활동이 제 개발 역량을 키우는 데 있어 매우 중요한 기회라고 생각하기 때문에,
그만큼의 시간과 에너지를 기꺼이 투자할 계획입니다.
전공과목의 과제, 시험일정 등을 미리 파악하고 시간을 효율적으로 관리해본 경험이 있습니다.
결론적으로, 저는 UMC 활동에 필요한 시간과 노력을 충분히 투자할 준비가 되어 있으며, 주어진 기간 동안 후회 없이 최선을 다해 참여할 것입니다.
6. 프로젝트나 어떤 일을 오랫동안 열심히했던 경험을 말해주세요.
7. 전공 공부든 어떤 것을 공부할때 어려움을 겪을텐데 자신만의 해결법
8. UMC에서 개발 하고싶은 프로젝트가 있는지.
9. 서버 개발을 해본적이 있는지?
10. 어떠한 일에 몰입해서 해결한 경험이 있다면?
11. UMC 활동을 통해 이루고자 하는 최종 목표?
12. 전공 공부든 어떤 것을 공부할때 어려움을 겪을텐데 자신만의 해결법
13. 협업하면서 힘들었던 경험
14. 팀 프로젝트 시 가장 중요하다고 생각하는 것
15. UMC 활동 각오
16. 깃, 깃허브 사용경험이 있는지?
17. 책임감이 강하다고 지원서에 작성하셨는데 본인의 강한 책임감이 드러난 경험에 대해 말해주세요.
18. UMC의 가치나 지향하는 바 알아놓기, UMC 뜻 말하기
19. 깃허브 사용 경험이 있나요?
깃허브를 사용하여 프로젝트를 한 경험은 없습니다.
하지만 이번학기에 팀플이 꽤 있어 팀원들에게 민페가 될까봐 인프런에서 깃, 깃허브 강의를 샀고, 절반정도 들었습니다.
이번주까지 들으려 합니다.
20. 지원서에 어플 제작하고싶은 것 잘 보았는데, 구체적으로 설명
21.마지막으로 할말
<기술면접 예상>
1. 서버가 뭔지 설명하시오.
서버는 네트워크를 통해 클라이언트에게 정보나 서비스를 제공하는 컴퓨터 시스템입니다.
서버는 데이터를 제공하거나, 파일을 저장하고 관리하며, 온라인 서비스를 운영하는 역할을 합니다.
서버와 클라이언트의 역할은 상황에 따라 바뀔 수 있습니다.
예를 들어, 맛집 추천 프로그램의 서버는 사용자(클라이언트)에게 맛집 정보를 제공하지만, 필요할 때 네이버 지도 서버에 지리정보를 요청할 때는 그 서버가 클라이언트 역할을 하게 됩니다.
2. 서블릿은 뭐고 jsp는 뭐에요?
**서블릿(Servlet)**은 자바로 작성된 서버 측 프로그램으로, 클라이언트의 요청을 처리하고 응답을 생성하는 데 사용됩니다. 주로 비즈니스 로직을 구현하고 HTTP 요청과 응답을 다루는 역할을 합니다.
**JSP(JavaServer Pages)**는 HTML에 자바 코드를 삽입하여 동적인 웹 페이지를 생성하는 기술로, 주로 프론트엔드에 사용됩니다. JSP는 내부적으로 서블릿으로 변환되어 실행됩니다.
두 기술은 함께 사용되어, 서블릿은 컨트롤러, JSP는 뷰 역할을 하며 MVC 패턴을 구현하는 데 활용됩니다.
3. 웹서버와 웹 어플리케이션 서버를 설명하시오
웹 서버는 HTTP 요청을 받아 정적 콘텐츠(HTML, 이미지 등)를 제공하는 프로그램이고, **웹 애플리케이션 서버(WAS)**는 비즈니스 로직을 처리하고 데이터베이스와 상호작용하여 동적 콘텐츠를 생성합니다. 웹 서버는 정적 요청을 직접 처리하고, 동적 요청은 WAS로 전달하여 처리하는 방식으로, 두 서버가 보완적으로 작동합니다. 이 구조는 3계층 아키텍처로 불리며, 확장성과 유지보수성을 높이는 데 효과적입니다.
4. java에 static 키워드에 대해서 설명하시오
static 키워드는 클래스 레벨에서 변수나 메서드를 정의할 때 사용됩니다. static 변수는 클래스의 모든 인스턴스가 공유하는 변수로, 클래스 로더가 로드할 때 한 번만 초기화되며, 클래스명으로 직접 접근할 수 있습니다. static 메서드는 인스턴스 생성 없이 호출 가능한 메서드로, 클래스에 속하며 인스턴스 변수나 메서드를 참조할 수 없습니다. 즉, static은 인스턴스와 무관하게 클래스 자체에 속하는 공용 멤버를 정의할 때 유용합니다.
5. 자바 가비지 컬렉터의 기능을 설명해보세요
Java의 **가비지 컬렉터(Garbage Collector, GC)**는 자바 가상 머신(JVM)에서 자동으로 메모리를 관리하는 기능을 합니다. 가비지 컬렉터는 사용되지 않는 객체를 탐지하고, 메모리에서 이를 제거하여 메모리 누수를 방지하고 애플리케이션이 안정적으로 실행될 수 있도록 돕습니다. 이를 통해 개발자는 메모리 관리에 신경 쓰지 않고 비즈니스 로직 구현에 집중할 수 있습니다.
6. 자바 try-catch 예외문에 관해 설명하시오
Java의 try-catch 문은 예외 발생 시 프로그램이 비정상적으로 종료되지 않도록 예외를 처리하는 구조입니다.
try 블록은 예외가 발생할 수 있는 코드를 감싸고, 예외 발생 시 catch 블록으로 흐름이 이동하여 해당 예외를 처리합니다.
catch 블록은 발생한 특정 예외 타입에 따라 다른 처리를 수행합니다.
finally 블록은 예외 발생 여부와 관계없이 항상 실행되며, 자원 해제 같은 작업에 사용됩니다.
**throw**는 명시적으로 예외를 발생시키는 데 사용되며, 예외 처리 흐름을 제어할 수 있습니다.
이 구조는 예외를 안전하게 처리하여 애플리케이션의 안정성을 높이는 데 필수적입니다.
7. 정적웹은 뭐고 동적 웹은 뭔가요?
**정적 웹(Static Web)**은 고정된 HTML, CSS, JavaScript로 작성되어 서버에 저장된 그대로의 콘텐츠를 제공하는 웹 페이지로, 서버 부하가 적고 구현이 간단하지만, 콘텐츠 업데이트가 번거롭습니다.
**동적 웹(Dynamic Web)**은 사용자 요청에 따라 서버에서 프로그램이 실행되고 데이터베이스와 상호작용하여 실시간으로 콘텐츠를 생성하는 웹 페이지로, 사용자 맞춤형 콘텐츠 제공이 가능하지만, 서버 부하가 크고 구현이 복잡합니다.
정리하면, 정적 웹은 고정된 콘텐츠를 제공하고, 동적 웹은 사용자 요청에 따라 실시간으로 콘텐츠가 생성되는 웹 페이지입니다.
8. MVC 웹프레임워크가 뭔가요?
MVC 웹 프레임워크는 웹 애플리케이션 개발 시 코드를 구조화하고, 유지보수와 협업을 용이하게 하기 위해
MVC 아키텍처 패턴을 사용하는 프레임워크입니다.
Model은 데이터와 비즈니스 로직을 처리하고, (데이터와 관련된 일을 하는 곳입니다.)
View는 사용자에게 보여지는 화면을 구성하며,
Controller는 사용자 요청을 처리하고 Model과 View를 연결하여 중개자 역할을 합니다.
이 패턴을 사용하면 유지보수성과 확장성이 높아지고, 프론트엔드와 백엔드 개발을 분리하여 협업이 용이합니다. 대표적인 MVC 프레임워크로는 Spring MVC, Django, Laravel 등이 있습니다.
9. 쿠키, 세션, 캐시가 뭔가요?
**쿠키(Cookie)**는 클라이언트 측 브라우저에 저장되는 작은 데이터로, 로그인 정보나 사용자 설정을 유지하는 데 사용됩니다.
**세션(Session)**은 서버 측에서 사용자 상태를 관리하는 방식으로, 로그인 상태와 같은 사용자 정보를 서버에 저장합니다.
<저장 위치>
쿠키: 클라이언트 측(브라우저)에 저장됩니다. 사용자의 컴퓨터에 텍스트 파일 형태로 저장되며, 서버에 요청 시마다 함께 전송됩니다.
세션: 서버 측에 저장됩니다. 클라이언트는 세션 ID를 쿠키나 URL을 통해 전달받아 서버에서 해당 세션을 참조합니다.
<보안>
쿠키: 클라이언트에 저장되기 때문에 변조나 도용의 위험이 있습니다. 민감한 정보는 쿠키에 직접 저장하지 않고, 필요 시 암호화가 필요합니다.
세션: 서버에 저장되므로 상대적으로 안전합니다. 클라이언트에 노출되지 않아 보안성이 높습니다.
<수명>
쿠키: 만료 시간이 설정될 수 있습니다. 설정된 시간 동안 유지되며, 브라우저가 닫혀도 유지될 수 있습니다.
세션: 기본적으로 브라우저가 닫히면 세션이 종료됩니다. 서버에서 세션 타임아웃을 설정할 수도 있습니다.
10. 객체지향 프로그래밍(OOP)이 뭔가요?
"말 그대로, 어떤 문제를 코딩으로 해결할 때, 문제를 처리할 수 있는 객체들을 만들어 객체 간의 상호작용을 통해
해결해 나가는 것이 **객체지향 프로그래밍(OOP)**입니다.
각 객체는 자신의 역할과 책임을 가지고 있으며, 문제를 해결하기 위해 협력합니다.
OOP의 핵심은 현실 세계를 추상화하여 코드로 표현하고, 객체들 간의 관계와 상호작용을 통해 복잡한 문제를 해결하는 데 있습니다."
11. 절차지향형 프로그래밍은 뭔가요?
절차지향형 프로그래밍은 문제를 해결하기 위해 함수를 중심으로 프로그래밍하며, 순차적 흐름에 따라 코드를 작성하는 방식입니다.
코드를 재사용하기 위해 자주 사용하는 로직을 함수로 묶어서 사용하며, 함수 호출을 통해 프로그램의 흐름을 제어합니다.
12. 함수형 프로그래밍은 뭔가요?
13. REST API가 뭔가요?
REST API는 웹에서 클라이언트와 서버 간의 통신을 위해 설계된 아키텍처 스타일로, HTTP 메소드를 사용하여 리소스를 생성, 조회, 수정, 삭제하는 방식입니다. REST는 리소스 기반으로 동작하며, 각 리소스는 고유한 URI로 식별됩니다.
14. HTTP가 뭔가요?
**HTTP(HyperText Transfer Protocol)**는 웹 브라우저와 서버 간에 데이터를 주고받기 위한 비연결형 통신 프로토콜입니다. GET, POST, PUT, DELETE 등의 메서드를 사용해 웹 자원을 조회, 생성, 수정, 삭제하는 작업을 수행합니다.
14-1. HTTPS가 뭔가요?
HTTPS는 HTTP의 보안 버전으로, 데이터 암호화, 무결성 보장, 서버 인증을 통해 웹 브라우저와 서버 간의 안전한 통신을 제공합니다. 이를 통해 사용자 정보 보호와 신뢰성을 보장 합니다.
14-2. HTTP는 포트 80 / HTTPS는 포트 443을 이용한다.
14-3. HTTP는 포트 80 이라는데 포트가 무얼 의미하나요?
**포트(Port)**는 컴퓨터 네트워크에서 특정 프로세스나 서비스가 통신을 위해 사용하는 논리적인 통신 경로를 의미합니다. 포트는 IP 주소와 함께 사용되어 네트워크에서의 데이터 송수신 경로를 구체화하며, 하나의 컴퓨터에서 여러 네트워크 서비스를 구분하고 관리할 수 있도록 합니다.
15. API가 뭔가요?
**API(Application Programming Interface)**는 서로 다른 소프트웨어 시스템 간의 상호작용을 가능하게 하는 인터페이스입니다.
API는 애플리케이션이 다른 애플리케이션의 기능을 호출하거나 데이터를 주고받을 수 있게 합니다.
이를 통해 애플리케이션의 기능 확장을 효율적으로 수행할 수 있습니다.
16. SOLID 원칙에 대해 설명하시오
17. 싱글톤 패턴을 설명하시오
싱글톤 패턴은 특정 클래스의 인스턴스가 하나만 생성되도록 보장하는 디자인 패턴입니다. 주요 특징:
하나의 인스턴스: 클래스의 인스턴스가 하나만 존재하도록 보장합니다.
전역 접근점: 프로그램 어디서든 동일한 인스턴스에 접근할 수 있는 전역 접근점을 제공합니다.
Lazy Initialization: 필요할 때까지 인스턴스를 생성하지 않는 지연 초기화를 사용할 수 있습니다.
예를 들어, 데이터베이스 연결 관리, 설정 관리, 로깅 객체 등에 활용됩니다.
18. 깃허브는 왜쓰나요?
GitHub는 Git을 기반으로 한 코드 버전 관리와 협업을 효율적으로 지원하는 플랫폼으로, 개발팀이 프로젝트를 관리하고 협업할 때 주로 사용합니다. GitHub를 사용하는 주요 이유는 다음과 같습니다:
코드 버전 관리: GitHub는 Git을 사용하여 코드의 모든 변경 이력을 관리하고, 언제든지 이전 버전으로 되돌릴 수 있습니다.
효율적인 협업: 여러 개발자가 동시에 작업할 수 있도록 브랜치, 풀 리퀘스트(Pull Request), 코드 리뷰 기능을 제공하여 협업을 원활하게 진행할 수 있습니다.
이슈 및 프로젝트 관리: 버그, 기능 요청 등을 관리하는 이슈 트래커와 프로젝트 보드를 통해 작업을 체계적으로 관리할 수 있습니다.
CI/CD 통합: 자동 빌드, 테스트, 배포 파이프라인을 쉽게 설정할 수 있어 개발 효율성을 높입니다.
오픈 소스 및 커뮤니티: 오픈 소스 프로젝트를 호스팅하고, 다른 개발자들과 협업하며 커뮤니티를 형성하는 데 중요한 플랫폼입니다.
결론적으로, GitHub는 버전 관리, 협업, 프로젝트 관리, CI/CD 지원 등 다양한 기능을 통해 개발 생산성을 높이고, 팀이 보다 효율적으로 작업할 수 있도록 도와줍니다.
19. 깃과 깃허브는 뭐가 다른가요?
Git은 **분산 버전 관리 시스템(DVCS)**으로, 코드의 변경 사항을 추적하고 여러 개발자가 협업할 수 있게 해주는 도구입니다.
GitHub는 Git 저장소를 호스팅하는 웹 플랫폼으로, Git을 기반으로 한 버전 관리와 함께 코드 리뷰, 이슈 관리, 협업 도구 등을 제공합니다.
즉, Git은 버전 관리 도구이고, GitHub는 온라인 Git 저장소이자 협업 플랫폼입니다.
20. ORM이 뭔가요?
21. 라이브러리와 프레임워크의 차이는 뭔가요?
22. 자바 접근제어자에 대해 설명하시오.
Java의 **접근 제어자(Access Modifiers)**는 클래스, 변수, 메서드 등의 접근 범위를 설정하여, 외부로부터의 접근을 제어하는 데 사용됩니다.
Java에서는 네 가지 접근 제어자가 있습니다: public, protected, default(아무 키워드도 없을 때), private.
public : 모든 클래스에서 접근 가능하며, 가장 개방적인 접근 수준입니다. public으로 선언된 멤버는 패키지 내외부 어디서든 사용할 수 있습니다.
protected : 같은 패키지 내의 클래스나, 상속받은 자식 클래스에서 접근 가능합니다.
default(패키지 프라이빗) : 같은 패키지 내의 클래스에서만 접근할 수 있고, 패키지 외부에서는 접근할 수 없습니다.
private : 선언된 클래스 내에서만 접근이 가능하며, 가장 제한적인 접근 수준입니다.
정리하자면, 접근 제어자는 클래스나 멤버의 접근 범위를 설정하여 코드의 캡슐화, 보안, 유지보수를 용이하게 하는 역할을 합니다.
23. 오버로딩과 오버라이딩 차이?
오버라이딩은 부모 클래스에서 상속받은 메서드를 자식 클래스에서 다시 정의하는 것을 말합니다. 이때 메서드의 이름, 반환 타입, 매개변수 목록이 모두 같아야 합니다. 반면, 오버로딩은 동일한 클래스 내에서 또는 상속 관계에서 메서드 이름은 같지만, 매개변수의 수나 타입을 다르게 정의하는 것을 의미합니다.
24. 연결리스트에 대해 설명해주세요
리스트는 동일한 자료형의 원소들이 모여 있는 구조를 말하며, 선형 리스트와 연결 리스트의 두 가지 종류가 있습니다. 이 중 연결 리스트는 프로그램 실행 중에 동적으로 생성되거나 삭제되기 때문에, 크기를 미리 예측할 필요가 없습니다. 또한, 논리적으로는 연속되어 있지만 물리적으로는 메모리상에서 분산된 구조를 가지고 있습니다.
25. 객체지향언어에서의 객체의 정의
필드와 메드로 구성된 소프트웨어의 묶음이라고 할 수 있습니다. 필드는 객체의 변수로서 객체의 상태를 저장하고, 메서드는 객체의 함수로서 객체의 행동을 정의합니다.
26. 클래스의 정의? 클래스와 객체의 차이점이 무엇인가
클래스는 객체를 생성하기 위한 설계도라고 할 수 있습니다. 클래스를 기반으로 여러 객체가 생성되며, 이렇게 만들어진 객체를 해당 클래스의 인스턴스라고 합니다. 클래스는 하나만 존재하지만, 그 클래스로부터 여러 개의 객체를 만들 수 있습니다.
27. 객체지향 프로그래밍 특징 4가지
캡슐화: 캡슐화는 관련된 필드와 메서드를 하나의 객체로 묶어 사용하는 것을 의미합니다. 캡슐화의 목적은 두 가지로 나뉩니다. 첫째, 관련된 데이터와 알고리즘을 함께 묶어 개발자가 더 편리하게 사용할 수 있도록 하는 것입니다. 둘째, 정보 은닉을 통해 일부 정보만 공개하고 내부 구현을 숨김으로써 객체의 실제 구현 내용을 외부에서 볼 수 없도록 하는 것입니다.
상속: 상속은 상위 개체의 속성과 메서드가 하위 개체로 전달되어, 하위 개체가 상위 개체의 속성을 가지게 되는 것을 의미합니다. Java에서는 자식 클래스가 부모 클래스로부터 상속을 받으면, 부모 클래스의 기존 코드를 재사용할 수 있으며, 필요한 기능을 추가하여 확장할 수 있는 특징이 있습니다.
다형성: 다형성은 동일한 이름의 메서드가 클래스나 객체에 따라 다르게 동작할 수 있도록 구현되는 것을 말합니다. 예를 들어, 부모 클래스에서 정의된 메서드를 자식 클래스에서 동일한 이름으로 다시 정의하는 오버라이딩과, 같은 클래스 내에서 이름은 같지만 매개변수가 다르거나 기능이 다른 오버로딩이 있습니다.
추상화: 추상화는 공통적이고 중요한 속성만을 추출하여 프로그램을 단순화하는 기법입니다. 공통된 필드와 메서드만을 묶음으로써 복잡성을 줄일 수 있습니다. Java에서는 추상 클래스와 추상 메서드를 사용하여 서브클래스가 반드시 구현해야 할 메서드를 명확히 정의하는 인터페이스 역할을 하며, 이를 통해 다형성을 실현할 수 있습니다.
28. 생성자
생성자는 객체가 생성될 때 객체를 초기화하는 특수한 메서드입니다. 생성자의 목적은 객체가 생성될 때 필요한 초기 작업을 수행하는 데 있습니다. 생성자는 클래스 이름과 동일해야 하며, 반환 타입을 가질 수 없습니다. 또한, 생성자는 오버로딩이 가능하고, 객체를 생성할 때 한 번만 호출된다는 특징이 있습니다.
29. static과 final
static 멤버는 클래스당 하나만 생성되어, 해당 클래스로 만든 모든 객체가 공유할 수 있습니다. 객체를 생성하지 않고도 사용할 수 있기 때문에 "클래스 멤버"라고도 부릅니다. 주로 전역 변수나 함수, 공유 멤버를 만들 때 사용됩니다. 또한, static 메서드는 객체 없이 존재할 수 있기 때문에 다른 static 멤버들만 사용할 수 있으며, this를 사용할 수 없습니다.
final 키워드로 필드를 선언하면, 해당 필드는 상수가 되어 한 번 초기화된 후에는 값을 변경할 수 없습니다. final 메서드는 오버라이딩이 불가능하며, final 클래스로 선언된 클래스는 상속받아 자식 클래스를 만들 수 없습니다.
30. super
super 키워드는 자식 클래스에서 부모 클래스의 멤버(필드, 메서드, 생성자)를 참조할 때 사용됩니다.
- 부모 클래스의 생성자 호출:
- 자식 클래스의 생성자에서 super(...)를 사용하면, 부모 클래스의 생성자를 명시적으로 호출할 수 있습니다. 이는 부모 클래스에서 정의된 초기화 작업을 수행하기 위해 필요합니다.
- 예를 들어, public User(String name) { super(name); }는 부모 클래스 Thread의 생성자를 호출하여 스레드 이름을 설정하는 것입니다.
- 부모 클래스의 메서드 호출, 필드접근:
- 자식 클래스에서 부모 클래스의 메서드를 호출하고 싶을 때 super.methodName()을 사용할 수 있습니다.
- 자식 클래스에서 부모 클래스의 필드를 참조할 때도 super.fieldName을 사용할 수 있습니다.
즉, super 키워드는 상속 관계에서 부모 클래스의 멤버에 접근하거나, 부모의 생성자를 호출할 때 사용됩니다.
31. 프로그래밍에서 소프트웨어 모델의 설계품질을 평가하는 두가지 개념인 결합도와 응집도를 설명하세요.
1. 결합도 (Coupling) -> 낮은 것이 유리합니다.
모델 간 결합도라고 생각하면 될 듯 합니다. 모델 간 얼마나 결합되어 있는가이죠. 독립적으로 분리되어야 좋은 모델이라 할 수 있기 때문에 결합도는 직관적으로 낮은 것이 한 모델을 변경할때 다른모델도 수정할 필요가 없으므로 유리합니다.
정확히는,
결합도는 한 모듈이 다른 모듈에 얼마나 의존적인지를 나타내는 척도입니다. 결합도가 높으면 모듈들이 서로 강하게 연결되어 있어 하나의 모듈을 변경할 때 다른 모듈들도 영향을 받을 가능성이 큽니다. 반면 결합도가 낮으면 모듈들이 독립적으로 동작하며, 하나의 모듈을 변경해도 다른 모듈에 미치는 영향이 적습니다. 낮은 결합도는 유지보수성과 재사용성이 높은 시스템 설계에 유리합니다.
결합도는 다음과 같은 종류로 나뉩니다:
- 내용 결합 (Content Coupling): 한 모듈이 다른 모듈의 내부를 직접 접근하는 경우.
- 공통 결합 (Common Coupling): 여러 모듈이 동일한 전역 데이터를 사용하는 경우.
- 제어 결합 (Control Coupling): 한 모듈이 다른 모듈의 흐름을 제어하기 위해 매개변수를 사용하는 경우.
- 스탬프 결합 (Stamp Coupling): 모듈 간에 복잡한 구조체나 레코드 형태의 데이터를 전달하는 경우.
- 자료 결합 (Data Coupling): 모듈 간에 단순한 데이터만을 주고받는 경우. (이상적)
2. 응집도 (Cohesion)-> 높은 것이 좋습니다.
응집도는 모듈 하나! 내의 요소간의 관련성 정도입니다. 결합도는 모듈간, 응집도는 모듈 내 요소간 레벨 입니다.
정확히는,
응집도는 하나의 모듈 내의 요소들이 얼마나 밀접하게 관련되어 있는지를 나타내는 척도입니다. 응집도가 높을수록 모듈이 특정 기능을 수행하는 데 집중하고, 모듈 내 요소들이 강하게 연결되어 있습니다. 높은 응집도는 모듈의 이해와 유지보수를 쉽게 하고, 코드의 가독성을 높이며, 모듈의 재사용성을 증가시킵니다.
32. 모듈이라 하셨는데 그럼 모듈이 정확히 뭔가요?
"모듈"이라는 용어는 문맥에 따라 다른 의미로 사용될 수 있습니다. 프로그래밍에서 "모듈"은 일반적으로 소프트웨어의 독립적인 구성 요소를 의미하며, 이 구성 요소는 특정 기능을 수행하는 코드 집합을 포함할 수 있습니다.
예로,
- 클래스 (Class):
- 객체 지향 프로그래밍(OOP)에서는 "모듈"이 클래스일 수 있습니다. 클래스는 관련된 데이터와 메서드를 캡슐화하여 하나의 단위로 구성되며, 특정 기능을 수행하는 논리적 모듈로 간주될 수 있습니다. 예를 들어, 결합도와 응집도를 논할 때 클래스 내부의 메서드와 필드 간의 관계를 고려할 수 있습니다.
- 파일 또는 라이브러리:
- 다른 프로그래밍 언어에서는 "모듈"이 파일 단위이거나 라이브러리일 수 있습니다. 예를 들어, 파이썬에서는 하나의 .py 파일이 모듈로 간주됩니다. 이 파일에는 함수, 클래스, 변수 등이 포함될 수 있으며, 결합도와 응집도를 파일 단위로 평가할 수 있습니다.
- 패키지 (Package):
- 더 큰 시스템에서는 "모듈"이 패키지 또는 네임스페이스일 수 있습니다. 패키지는 여러 개의 클래스나 파일을 포함할 수 있는 더 큰 논리적 단위로, 응집도와 결합도를 패키지 수준에서 평가할 수 있습니다.
결론
"모듈"이 꼭 "클래스"를 의미하는 것은 아니지만, 클래스도 모듈의 한 형태로 볼 수 있습니다. 클래스, 함수, 파일, 패키지 등 다양한 수준에서 결합도와 응집도를 평가할 수 있으며, 각 수준에서 모듈의 의미가 다를 수 있습니다.
부족한건 나중에 업로드ㅎ다..!