자바의 특징
-
JVM
- JVM이라는 가상의 Virtual Machine을 거쳐서 실행된다. 이를 통해 운영체제에 구애받지 않고 JRE가 설치된 환경이라면 어디서든 실행 가능하다. 다만, 기계어로 바로 컴파일되지 않고 JVM을 한번 거치기 때문에 조금 느리다는 단점이 있다.
-
OOP
- 객체지향언어이다. 캡슐화, 상속, 다형성을 지원하고 있으며 상속은 단 한개의 부모클래스만 허용한다. 그 이유는 다중 상속을 허용하면 설계를 잘해야 하는데, 모든 개발자가 잘 사용하지 못하니까 그냥 막아버렸다고 한다...
-
함수적 스타일 코딩 지원
- JAVA 8 부터 람다식을 지원하면서 함수적 스타일 코딩을 지원한다.
-
메모리를 자동으로 관리한다
- Garbage Collector가 알아서 사용하지 않는 자원을 관리해주기 때문에 C처럼 메모리를 할당하고 풀어주고 할 필요가 없다.
-
Java Reflection
- 클래스를 런타임 시점에 동적으로 실행하게 하는 Reflection API를 제공한다
-
오픈소스 라이브러리가 풍부하다
접근 제한자
private < default < protected < public
- private: 클래스 내부에서만 사용 가능
- default (package): 같은 패키지 내에서만 사용 가능
- protected: 클래스를 상속받는 자식 객체 내에서까지 사용 가능
- public: 모든 클래스에서 사용 가능
Overloading vs Overriding
- overloading
같은 이름을 가진 메소드들이 다른 매개변수를 가지는 경우
ex) void hi() 와 void hi(int x)
- overriding
조상 클래스로부터 상속 받은 메소드를 자식 클래스에서 변경하는 경우
Generic
- < T >
- 여러개 사용 가능 <T, V>
- 컴파일시 타입 체크 가능
- Type casting 제거
Object vs Generic
- Object를 사용할시 모든 객체를 허용하고 사용시마다 필요에 따라 형변환을 해줘야함
- Generic 사용시 < T extends Collections > 처럼 허용되는 타입을 제한할 수 있고 형변환이 필요없음
와일드카드 타입(< ? >, < ? extends .. >, < ? super ... >)
-
< ? > : 제한 없음
-
< ? extends Parent > : Parent 자신과 자손클래스만 허용
-
< ? super Child > : Child 자신과 부모클래스만 허용
-
언제 super을 사용하고 언제 extends를 사용해야 할까?
-
Oracle 에서는 이 문제를 In, Out 개념으로 설명한다. "In"변수는 extends 키워드를 사용하고, "Out"변수는 super 키워드를 사용한다.
-
예를 들어, copy(src, dest) 라는 메소드가 있다고 가정했을때, src는 데이터를 제공하기 때문에 In이 되고, dest는 제공 받은 데이터를 받아서 사용하기 때문에 out이 된다.
객체 직렬화 (Serialization)
- 객체를 바이트코드로 변환시켜서 저장시킴
- Serializable 인터페이스를 implement 해야함
Interface vs abstract class
Equals와 HashCode
@Override
public int hashCode() {
int hash = 7;
hash = 31 * hash + (int) id;
hash = 31 * hash + (name == null ? 0 : name.hashCode());
hash = 31 * hash + (email == null ? 0 : email.hashCode());
return hash;
}
Throwable, Exception, Error, RuntimeException
String, StringBuffer, StringBuilder