Java Study 1
Abstract vs Interface
- abstract : 추상메소드 + 일반 메소드 가능 / 목적이 있지만 여러 방법으로 쓰일 수 있는 메소드가 있을 때 사용
- interface : 추상메소드 선언부만 (변수 선언은 final) / 구현되어야만 하는 약속을 선언할 때
이러한 것들을 사용하는 이유는 코드의 중복을 방지하고 유지보수를 편히 하려는 목적이 크다.
Java8부터는 인터페이스도 일반 메소드를 같이 쓸 수 있다 한다.
ArrayList vs LinkedList
- ArrayList :
index 를 가지고 데이터를 관리하는 자료구조
- LinkedList : 노드를 통해 다음 데이터에 대한 포인터를 가지고 데이터를 관리하는 자료구조
-데이터 검색시 앞에서부터 순차적으로, 최악의 경우 O(n) -삽입, 삭제 연산 편리 (포인터를 끊고 연결만 하면 끝)
String vs StringBuffer vs StringBuilder
- String (immutable) : 변수 + 객체 + 상수풀의 오묘한 조화
jvm 스택 안에 있는 변수 name은 힙 메모리에 있는 객체를 참조하고, 이 객체는 다시 상수풀을 참조한다.
‘new’라는 키워드가 없어도 내부적으로는 객체 생성이 된 상태다.
상수풀에 “link” 라는 문자열이 없다면 새로 만들고 이미 있는 문자열이라면 객체가 그것을 참조하도록 한다. 따라서…
<rb?String newName = “link”;</rb>link’
newName과 name이 가리키는 객체는 똑같다.
메모리에서 두개의 객체를 생성한다.
문자열 리터럴 “link”가 생성하는 객체 + new가 별도로 생성해서 리터럴이 만든 객체를 참조하는 객체
link라는 문자열은 두개의 객체를 지나 변수 name2에 대입된다.
-name과 name2의 ‘==’ 은 false지만, ‘equals’는 true다. -name과 newName의 ‘==’ 은 true고, ‘equals’도 true다.
- StringBuffer/StringBuilder (mutable)
-메소드도 똑같고 다른점은
StringBuilder는 멀티쓰레드 환경에서 동기화 기능을 제공한다.
단순한 성능만 놓고 본다면 연산이 많은 경우 StringBuilder > StringBuffer »> String
Overload vs Override
-
Overload : 같은 함수 이름, 다른 변수타입과 개수 / 객체지향에서 다형성을 위해 사용
-
Override : 같은 함수 이름과 변수타입과 개수 / 상속구조에서 기능적 재정의 및 확장을 위해 사용