Java Study 1

Abstract vs Interface

  • abstract : 추상메소드 + 일반 메소드 가능 / 목적이 있지만 여러 방법으로 쓰일 수 있는 메소드가 있을 때 사용
  • interface : 추상메소드 선언부만 (변수 선언은 final) / 구현되어야만 하는 약속을 선언할 때

이러한 것들을 사용하는 이유는 코드의 중복을 방지하고 유지보수를 편히 하려는 목적이 크다.

Java8부터는 인터페이스도 일반 메소드를 같이 쓸 수 있다 한다.


ArrayList vs LinkedList

  • ArrayList : index를 가지고 데이터를 관리하는 자료구조
  • 데이터 검색시 O(1)로 접근 가능

  • 삽입, 삭제시 데이터를 이동해야 되서 연산이 많아지면 느려짐

    • LinkedList : 노드를 통해 다음 데이터에 대한 포인터를 가지고 데이터를 관리하는 자료구조

    -데이터 검색시 앞에서부터 순차적으로, 최악의 경우 O(n) -삽입, 삭제 연산 편리 (포인터를 끊고 연결만 하면 끝)


    String vs StringBuffer vs StringBuilder

    • String (immutable) : 변수 + 객체 + 상수풀의 오묘한 조화

    1. 리터럴 선언

    String name = “link”;

    jvm 스택 안에 있는 변수 name은 힙 메모리에 있는 객체를 참조하고, 이 객체는 다시 상수풀을 참조한다.

    ‘new’라는 키워드가 없어도 내부적으로는 객체 생성이 된 상태다.

    상수풀에 “link” 라는 문자열이 없다면 새로 만들고 이미 있는 문자열이라면 객체가 그것을 참조하도록 한다. 따라서…

    <rb?String newName = “link”;</rb>link’

    newName과 name이 가리키는 객체는 똑같다.

    immutable과 concat 메소드 - 기존의 객체에 새로운 문자열을 더하는게 아니라 이어진 문자열을 참조하는 새로운 객체를 만들어 참조하게 한다.


    2. new 선언

    String name2 = new String(“link”);

    메모리에서 두개의 객체를 생성한다.

    문자열 리터럴 “link”가 생성하는 객체 + new가 별도로 생성해서 리터럴이 만든 객체를 참조하는 객체

    link라는 문자열은 두개의 객체를 지나 변수 name2에 대입된다.


    equals와 ==

    -name과 name2의 ‘==’ 은 false지만, ‘equals’는 true다. -name과 newName의 ‘==’ 은 true고, ‘equals’도 true다.



    • StringBuffer/StringBuilder (mutable)

    -메소드도 똑같고 다른점은 동기화를 제공하냐는 것.

    StringBuilder는 멀티쓰레드 환경에서 동기화 기능을 제공한다.

    단순한 성능만 놓고 본다면 연산이 많은 경우 StringBuilder > StringBuffer »> String


    Overload vs Override

    • Overload : 같은 함수 이름, 다른 변수타입과 개수 / 객체지향에서 다형성을 위해 사용

    • Override : 같은 함수 이름과 변수타입과 개수 / 상속구조에서 기능적 재정의 및 확장을 위해 사용