기술 면접을 준비하면서 정리한 자료들입니다.
잘못되거나 보완할 점이 있다면 댓글로 알려주세요! 바로 수정하겠습니다 🙂
자바를 사용하는 이유
- 객체 지향 개념의 특징인 캡슐화, 상속, 다형성, 추상이 잘 적용된 언어
- Garbage Collector를 통한 메모리관리기능
- 멀티쓰레드(Multi-thread)를 지원한다.
독립적
윈도우 운영체제에서 C로 개발한 프로그램을 컴파일하면 ‘실행 파일'이 만들어진다.
그런데 이 실행 파일은 윈도우 운영체제에 맞게 만들어졌기 때문에 만약 리눅스에서 실행하려면, 다시 컴파일해서 실행 파일을 새로 만들어야 한다.
반면 자바에서 .java로 끝나는 프로그램을 컴파일하면 바이트 코드인 .class 파일이 생성된다. 자바는 운영체제에서 직접 실행하는게 아니라
JVM에서 .class 파일을 실행해서 각 운영체제에 맞는 실행파일을 만들어 준다. 즉 .class 파일만 있으면 운영체제와 상관없어 어떤 환경에서나 실행할 수 있게 돼서 자바는 다른 언어와 다르게 플랫폼에 독립적이고 대신 JVM이 플랫폼에 의존, 종속적이다. 그래서 리눅스의 JVM과 윈도우의 JVM은 다르다.
JVM
JVM Java Virtual Machine 자바 가상머신
메모리관리, gc를 수행하는 스택 기반의 가상머신
왜 알아야 하는가? 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위해서
따라서 메모리를 효율적으로 사용하기 위해서는 메모리의 구성과 각 특징에 대해서 이해할 필요가 있다.
JRE Java Runtime Environment 자바 실행 환경
JRE는 자바 가상머신이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다.
JRE는 JVM의 실행환경을 구현했다고 할 수 있다.
(그래서 운영체제에 종속적)
JDK Java Development Kit 자바 개발 도구
JRE + 개발을 위해 필요한 도구(javac, java등)들을 포함한다.
객체지향이란?
객체란 기존의 방식인 변수 따로, 함수 따로의 분산적이고 통일성 없는 추상화 과정을 통합하여 표현대상(문제해결대상)을 좀 더 캡슐화하기 쉽게 도와주는 도구이다. 캡슐화를 해서 정보은닉화, 상속 및 다형성을 통한 확장성과 재사용성을 얻고, 이를 기반한 생산성과 유지보수의 용이성이 객체지향의 진정한 특징이다.
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법을 의미한다.
장점
▶코드 재사용이 용이 |
남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있음. |
▶유지보수가 쉬움 |
절차지향 : 요구사항의 변화가 데이터 구조와 코드를 변화시킴 객체지향 : 요구사항의 변화가 캡슐화된 클래스의 내부 구조를 변경하면, 이 클래스를 가져다 쓰는 코드를 변경할 필요가 없어진다 |
▶대형 프로젝트에 적합 |
클래스단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트시 업무 분담하기 쉽다 |
단점
▶처리속도가 상대적으로 느림
▶객체가 많으면 용량이 커질 수 있음
overriding 규칙
상속 받은 메서드와 기능이 동일하지만 상세 구현이 조금 다른 경우 이를 반영하기 위해 새로운 메서드를 작성해야 하는데,
이때 메서드 이름과 인자 리스트, 리턴 타입을 기존에 상속 받은 메서드와 동일하게 선언한다.
- 리턴 타입은 (같거나/1.8부터는 sub class도 됨)
- 접근제어자는 같거나, 넓은 범위 (줄이면 컴파일에러)
- 예외는 같거나 부모에러보다 하위 클래스의 에러거나 아예 안하거나 (더 상위 에러를 던지면 컴파일에러)
상속 받은 메서드와 이름, 인자가 같으므로 메서드를 호출하는 방법이 같고, 리턴 타입 또한 같아서
호출 후 처리하는 방법이 같아지므로 기존 코드를 변경하지 않고도 수정된 내용을 반영 할 수 있다!
또한 하나의 코드로 여러 객체를 처리할 수 있게 된다. 차, 버스, 택시 이걸 다 차 타입의 배열에 담고
객체마다 기능이 다를 경우에도 하나의 for문을 돌면서 객체별로 재정의한 함수를 수행하면 돼서 편하다.
부모클래스에 디폴트 생성자가 반드시 있어야한다.
없다면, 자식 클래스에서 부모의 다른 생성자(인자 있는 생성자)를 명시적으로 호출해줘야 한다.
(만약 자식 생성자에서 부모를 한번도 호출하지 않으면, 자동으로 부모의 defalut 생성자를 호출하는데 없으면 오류 나는 것)
+ 부모클래스에 정의 된 static메서드를 자식클래스에서 똑같은 이름의 static메서드로 정의할 수 있지만
이것은 각 클래스에 별개의 static메서드를 정의한 것일 뿐 오버라이딩이 아님.
static멤버들은 자신들이 정의된 클래스에 묶여있다고 생각하면 된다.
overloading 규칙
하나의 클래스나 상속받은 클래스 내에 같거나 비슷한 기능의 메서드 이름을 같게 정의해서 편리성을 추구
메서드 이름 동일, 파라미터 리스트는 반드시 달라야 한다 (개수, 타입, 순서) 이것들로 메서드를 구분한다.
리턴, 접근제어자는 상관 없다
메서드를 호출할 때 인자에 따라 구별할 필요 없이 같은 이름으로 호출하면 알아서 알맞은 인자의 메서드를 불러준다.
'programming > JAVA' 카테고리의 다른 글
checked/unchecked Exception / @Transactional rollback (0) | 2023.05.06 |
---|---|
자바의정석 14장. Optional 정리 (0) | 2022.02.24 |
[JAVA] 면접 질문 중에서 - 객체 모델링에 관하여 (1)단순 모델링 (1) | 2020.04.27 |
[JAVA] 상속(Inheritance) 개념 정리 (0) | 2020.04.26 |
[JAVA] 다형성(Polymorphism) 개념 정리 (0) | 2020.04.26 |
댓글